当前位置:   article > 正文

Unix/Linux/BSD命令大全|实用指南

Unix/Linux/BSD命令大全|实用指南

本文转载自:UNIX TOOLBOX - 中文版

按照自己的理解,增删了部分内容。


这是一份收集Unix/Linux/BSD命令和任务的文档,它有助于高级用户或IT工作。它是一份简明扼要的实用指南,当然读者应该知道他/她在干什么。

Unix Toolbox 版本:12
你可以到 http://cb.vu/unixtoolbox.xhtml 找到本文档的最新版。PDF版本可以替换链接中的.xhtml为 .pdf ,小册子版本可以替换成 .book.pdf 。 用双面打印机可将小册子打印成册。这份XHTML页面可以通过CSS3相兼容的应用程序转换成一份漂亮的PDF文档(看 脚本例子).
错误报告和评论是最欢迎的 - c@cb.vu Colin Barschel.
你可以到http://code.google.com/p/unixtoolboxcn/找到中文最新版。


目录

 

系统

硬件信息|显示状态信息|用户|限制|运行级别| root 密码|编译内核

进程

进程列表|优先级|前台/后台|Top|Kill命令与信号

文件系统

权限|磁盘信息|Boot系统挂载点/磁盘使用情况|磁盘使用情况|谁打开了那些文件|挂载/重挂载一个文件系统|重挂载|给即时烧录(on-the-fly)添加 swap|挂载一个 SMB 共享|挂载镜像文件|创建并刻录 ISO 镜像文件|创建基于文件的镜像文件|创建基于内存的文件系统|磁盘性能

网络

调试 (也可看流量分析)|路由|配置额外的 IP 地址|更改 MAC 地址|使用中的端口|防火墙|路由 IP 转发|NAT - 网络地址转换|反向查询|/etc/hosts|DHCP|通信量分析(Traffic analysis)|用 nmap 扫描|流量控制(QoS)

实用命令

less|vi|mailtar|dd|screen|Find|混杂的

媒体转换

文本编码|视频转换|拷贝音频光盘

脚本

在线帮助


系统

硬件信息|显示状态信息|用户|限制|运行级别| root 密码|编译内核

正在运行的内核和系统信息

  1. # uname -a # 获取内核版本(和BSD版本)
  2. # lsb_release -a # 显示任何 LSB 发行版版本信息
  3. # cat /etc/SuSE-release # 获取 SuSE 版本
  4. # cat /etc/debian_version # 获取 Debian 版本

使用 /etc/DISTR-release 其中DISTR(发行代号)= lsb (Ubuntu), redhat, gentoo, mandrake, sun (Solaris), 等等。

  1. # uptime # 显示系统开机运行到现在经过的时间
  2. # hostname # 显示系统主机名
  3. # hostname -i # 显示主机的 IP 地址
  4. # man hier # 描述文件系统目录结构
  5. # last reboot # 显示系统最后重启的历史记录

硬件信息

内核检测到的硬件信息

  1. # dmesg # 检测到的硬件和启动的消息
  2. # lsdev # 关于已安装硬件的信息
  3. # dd if=/dev/mem bs=1k skip=768 count=256 2>/dev/null | strings -n 8 # 读取 BIOS 信息

Linux

  1. # cat /proc/cpuinfo # CPU 讯息
  2. # cat /proc/meminfo # 内存信息
  3. # grep MemTotal /proc/meminfo # 显示物理内存大小
  4. # watch -n1 'cat /proc/interrupts' # 监控内核处理的所有中断
  5. # free -m # 显示已用和空闲的内存信息 (-m 为 MB)
  6. # cat /proc/devices # 显示当前核心配置的设备
  7. # lspci -tv # 显示 PCI 设备
  8. # lsusb -tv # 显示 USB 设备
  9. # lshal # 显示所有设备属性列表
  10. # dmidecode # 显示从 BIOS 中获取的硬件信息

显示状态信息

以下的命令有助于找出正在系统中运行着的程序。

  1. # top # 显示和更新使用 cpu 最多的进程
  2. # mpstat 1 # 显示进程相关的信息
  3. # vmstat 2 # 显示虚拟内存的状态信息
  4. # iostat 2 # 显示 I/O 状态信息(2 秒 间隙)
  5. # systat -vmstat 1 # 显示 BSD 系统状态信息(1 秒 间隙)
  6. # systat -tcp 1 # 显示 BSD TCP 连接信息(也可以试试 -ip)
  7. # systat -netstat 1 # 显示 BSD 当前网络连接信息
  8. # systat -ifstat 1 # 显示 BSD 当前网卡带宽信息
  9. # systat -iostat 1 # 显示 BSD CPU 和磁盘使用情况
  10. # tail -n 500 /var/log/messages # 显示最新500条内核/系统日志的信息
  11. # tail /var/log/warn # 显示系统警告信息(看syslog.conf)

用户

  1. # id # 显示当前用户和用户组的 ID
  2. # last # 列出目前与过去登入系统的用户相关信息
  3. # who # 显示目前登入系统的用户信息
  4. # groupadd admin # 建立新组"admin"和添加新用户 colin 并加入 admin 用户组(Linux/Solaris)
  5. # useradd -c "Colin Barschel" -g admin -m colin
  6. # userdel colin # 删除用户 colin(Linux/Solaris)
  7. # adduser joe # FreeBSD 添加用户 joe(交互式)
  8. # rmuser joe # FreeBSD 删除用户 joe(交互式)
  9. # pw groupadd admin # 在 FreeBSD 上使用 pw
  10. # pw groupmod admin -m newmember # 添加新用户到一个组
  11. # pw useradd colin -c "Colin Barschel" -g admin -m -s /bin/tcsh
  12. # pw userdel colin; pw groupdel admin

加密过的密码存储在 /etc/shadow (Linux and Solaris) 或 /etc/master.passwd (FreeBSD) 中. 如果手动修改了 master.passwd,需要运行 # pwd_mkdb -p master.passwd 来重建数据库。

使用 nologin 来临时阻止所有用户登录(root除外)。用户登录时将会显示 nologin 中的信息。

  1. # echo "Sorry no login now" > /etc/nologin # (Linux)
  2. # echo "Sorry no login now" > /var/run/nologin # (FreeBSD)

限制

某些应用程序需要设置可打开最大文件和 socket 数量(像代理服务器,数据库)。 默认限制通常很低。

Linux:每 shell/脚本

shell 的限制是受 ulimit 支配的。使用 ulimit -a 可查看其状态信息。 举个例子,改变可打开最大文件数从 1024 到 10240,可以这么做:

# ulimit -n 10240                    # 这只在shell中有用

ulimit 命令可以使用在脚本中来更改对此脚本的限制。

每用户/进程:登录用户和应用程序的限制可以在 /etc/security/limits.conf 中配置。举个例子:

  1. # cat /etc/security/limits.conf
  2. * hard nproc 250 # 限制所有用户进程数
  3. asterisk hard nofile 409600 # 限制应用程序可打开最大文件数

系统级:用sysctl来设置内核限制。要使其永久,可以在 /etc/sysctl.conf 中进行配置。

  1. # sysctl -a # 显示所有系统限制
  2. # sysctl fs.file-max # 显示系统最大文件打开数
  3. # sysctl fs.file-max=102400 # 更改系统最大文件打开数
  4. # cat /etc/sysctl.conf
  5. fs.file-max=102400 # 在 sysctl.conf 中的永久项
  6. # cat /proc/sys/fs/file-nr # 在使用的文件句柄数

运行级别

一旦内核加载完成,内核会启动 init 进程,然后运行 rc 脚本,之后运行所有属于其运行级别的命令脚本。这些脚本都储存在 /etc/rc.d/rcN.d 中(N代表运行级别),并且都建立着到 /etc/init.d 子目录中命令脚本程序的符号链接。
默认运行级别配置在 /etc/inittab 中。它通常为 3 或 5:

  1. # grep default: /etc/inittab
  2. id:3:initdefault:

可以使用 init 来改变当前运行级别。举个例子:

# init 5                             # 进入运行级别 5

运行级别列表如下:

  • 0       系统停止
  • 1       进入单用户模式(也可以是 S)
  • 2       没有 NFS 特性的多用户模式
  • 3       完全多用户模式(正常操作模式)
  • 4       未使用
  • 5       类似于级别3,但提供 XWindow 系统登录环境
  • 6       重新启动系统

使用 chkconfig 工具控制程序在一个运行级别启动和停止。

  1. # chkconfig --list # 列出所有 init 脚本
  2. # chkconfig --list sshd # 查看 sshd 在各个运行级别中的启动配置
  3. # chkconfig sshd --level 35 on # 对 sshd 在级别 3 和 5 下创建启动项
  4. # chkconfig sshd off # 在所有的运行级别下禁用 sshd

Debian 和基于Debian 发行版像 Ubuntu 或 Knoppix 使用命令 update-rc.d 来管理运行级别脚本。默认启动为 2,3,4 和 5,停止为 0,1 和 6。

  1. # update-rc.d sshd defaults # 设置 sshd 为默认启动级别
  2. # update-rc.d sshd start 20 2 3 4 5 . stop 20 0 1 6 . # 用显示参数
  3. # update-rc.d -f sshd remove # 在所有的运行级别下禁用 sshd
  4. # shutdown -h now (或者 # poweroff) # 关闭停止系统

 root 密码

Linux 方法 1

在引导加载器(lilo 或 grub)中,键入如下启选项:

init=/bin/sh

内核会挂载 root 分区,进程 init 会启动 bourne shell 而不是 rc,然后是运行级别。使用命令 passwd 设置密码然后重启。别忘了需要在单用户模式下做这些动作。
如果重启后 root 分区被挂载为只读,重新挂在它为读写:

  1. # mount -o remount,rw /
  2. # passwd # 或者删除 root 密码 (/etc/shadow)
  3. # sync; mount -o remount,ro / # sync 在重新挂在为只读之前 sync 一下
  4. # reboot

编译内核

  1. # lsmod # 列出所有已载入内核的模块
  2. # modprobe isdn # 载入 isdn 模块

 

  1. # cd /usr/src/linux
  2. # make mrproper # 清除所有东西,包括配置文件
  3. # make oldconfig # 从当前内核配置文件的基础上创建一个新的配置文件
  4. # make menuconfig # 或者 xconfig (Qt) 或者 gconfig (GTK)
  5. # make # 创建一个已压缩的内核映像文件
  6. # make modules # 编译模块
  7. # make modules_install # 安装模块
  8. # make install # 安装内核
  9. # reboot

要重建完全的操作系统:

  1. # make buildworld # 构建完全的系统,但不是内核
  2. # make buildkernel # 使用 KERNCONF 配置文件编译内核
  3. # make installkernel
  4. # reboot
  5. # mergemaster -p # 建立临时根环境并比对系统配置文件
  6. # make installworld
  7. # mergemaster # 升级所有配置和其他文件
  8. # reboot

对于源的一些小改动,有时候简单的命令就足够了:

  1. # make kernel world # 编译并安装内核和系统
  2. # mergemaster
  3. # reboot

进程

进程列表|优先级|前台/后台|Top|Kill命令与信号


进程列表

PID是每个进程唯一号码。使用 ps 获取所有正在运行的进程列表。

# ps -auxefw                         # 所有正在运行进程的详尽列表

然而,更典型的用法是使用管道或者 pgrep:

  1. # ps axww | grep cron
  2. 586 ?? Is 0:01.48 /usr/sbin/cron -s
  3. # ps aux | grep 'ss[h]' # Find all ssh pids without the grep pid
  4. # pgrep -l sshd # 查找所有进程名中有sshd的进程ID
  5. # echo $$ # The PID of your shell
  6. # fuser -va 22/tcp # 列出使用端口22的进程
  7. # fuser -va /home # 列出访问 /home 分区的进程
  8. # strace df # 跟踪系统调用和信号
  9. # truss df # 同上(FreeBSD/Solaris/类Unix)
  10. # history | tail -50 # 显示最后50个使用过的命令

优先级

用 renice 更改正在运行进程的优先级。负值是更高的优先级,最小为-20,其正值与 "nice" 值的意义相同。

  1. # renice -5 586 # 更强的优先级
  2. 586: old priority 0, new priority -5

使用 nice 命令启动一个已定义优先级的进程。 正值为低优先级,负值为高优先级。确定你知道 /usr/bin/nice 或者使用 shell 内置命令(# which nice)。

  1. # nice -n -5 top # 更高优先级(/usr/bin/nice)
  2. # nice -n 5 top # 更低优先级(/usr/bin/nice)
  3. # nice +5 top # tcsh 内置 nice 命令(同上)

nice 可以影响 CPU 的调度,另一个实用命令 ionice 可以调度磁盘 IO。This is very useful for intensive IO application which can bring a machine to its knees while still in a lower priority. 此命令仅可在 Linux (AFAIK) 上使用。你可以选择一个类型(idle - best effort - real time),它的 man 页很短并有很好的解释。

  1. # ionice c3 -p123 # 给 pid 123 设置为 idle 类型
  2. # ionice -c2 -n0 firefox # 用 best effort 类型运行 firefox 并且设为高优先级
  3. # ionice -c3 -p$$ # 将当前的进程(shell)的磁盘 IO 调度设置为 idle 类型

例中最后一条命令对于编译(或调试)一个大型项目会非常有用。每一个运行于此 shell 的命令都会有一个较低的优先级,但并不妨碍这个系统。shellpid(echo

shellpid(echo
)。


前台/后台

当一个进程在 shell 中已运行,可以使用 [Ctrl]-[Z] (^Z)bg 和 fg 来 调入调出前后台。举个例子:启动 2 个进程,调入后台。使用 jobs 列出后台列表,然后再调入一个进程到前台。

  1. # ping cb.vu > ping.log
  2. ^Z # ping 使用 [Ctrl]-[Z] 来暂停(停止)
  3. # bg # 调入后台继续运行
  4. # jobs -l # 后台进程列表
  5. [1] - 36232 Running ping cb.vu > ping.log
  6. [2] + 36233 Suspended (tty output) top
  7. # fg %2 # 让进程 2 返回到前台运行

使用 nohup 开启一个持续运行的进程直到 shell 被关闭(避免挂断)。

# nohup ping -i 60 > ping.log &

Top

top 程序用来实时显示系统中各个进程的运行信息。

# top

当 top 在运行的时候,按下 h 键会显示帮助画面。常用键如下:

  • u [用户名] 只显示属于此用户的进程。使用 + 或者空白可以查看所有用户
  • k [PID] 结束 PID 进程
  • 1 显示所有进程状态信息(只有Linux)
  • R 将当前排序倒转

Kill命令与信号

使用 kill 或 killall 终止或发送一个信号给进程。

  1. # ping -i 60 cb.vu > ping.log &
  2. [1] 4712
  3. # kill -s TERM 4712 # 同 kill -15 4712
  4. # killall -1 httpd # 发送 HUP 信号终止进程 httpd
  5. # pkill -9 http # 发送 TERM 信号终止包含 http 的进程
  6. # pkill -TERM -u www # 发送 TERM 信号终止 www 所有者进程
  7. # fuser -k -TERM -m /home # 终止所有访问 /home 的进程(卸载该分区前)

下面是一些重要的信号:

  • 1       HUP (挂起)
  • 2       INT (中断)
  • 3       QUIT (退出)
  • 9       KILL (KILL 信号不能被捕捉,不能被忽略。)
  • 15     TERM (软件终止信号)

文件系统

权限|磁盘信息|Boot系统挂载点/磁盘使用情况|磁盘使用情况|谁打开了那些文件|挂载/重挂载一个文件系统|重挂载|给即时烧录(on-the-fly)添加 swap|挂载一个 SMB 共享|挂载镜像文件|创建并刻录 ISO 镜像文件|创建基于文件的镜像文件|创建基于内存的文件系统|磁盘性能


权限

用 chmod 和 chown 更改访问权限和所有权。对于所有用户的默认掩码(umask)可以在 /etc/profile (Linux) 或 /etc/login.conf (FreeBSD) 中修改。其默认掩码(umask)通常为 022。掩码可以和777做减法,从而得到755的权限。

  1. 1 --x 执行 # Mode 764 = 执行/读/写 | 读/写 | 读
  2. 2 -w- 写 # |---所有者|---用户组|---其他用户|
  3. 4 r-- 读
  4. ugo=a u=所有者, g=用户组, o=其他用户, a=所有用户
  1. # chmod [OPTION] MODE[,MODE] FILE # MODE 可以是 [ugoa]*([-+=]([rwxXst]))
  2. # chmod 640 /var/log/maillog # 更改 maillog 访问权限为 -rw-r-----
  3. # chmod u=rw,g=r,o= /var/log/maillog # 同上
  4. # chmod -R o-r /home/* # 递归去除所有其他用户的可读权限
  5. # chmod u+s /path/to/prog # 在可执行位设置 SUID (知道你在干什么!)
  6. # find / -perm -u+s -print # 查找所有设置过 SUID 位的程序
  7. # chown user:group /path/to/file # 改变文件的所有者和文件关联的组
  8. # chgrp group /path/to/file # 改变文件关联的组
  9. # chmod 640 `find ./ -type f -print` # Change permissions to 640 for all files
  10. # chmod 751 `find ./ -type d -print` # Change permissions to 751 for all directories

磁盘信息

  1. # diskinfo -v /dev/ad2 # 显示磁盘信息(扇区/大小) (FreeBSD)
  2. # hdparm -I /dev/sda # 显示 IDE/ATA 磁盘信息 (Linux)
  3. # fdisk /dev/ad2 # 显示和修改磁盘分区表
  4. # smartctl -a /dev/ad2 # 显示磁盘检测信息

Boot系统挂载点/磁盘使用情况

  1. # mount | column -t # 显示系统已挂载分区情况
  2. # df # 显示磁盘剩余空间和挂载的设备
  3. # cat /proc/partitions # 显示所有设备的所有分区(Linux)

磁盘使用情况

  1. # du -sh * # 列出当前目录下所有文件夹大小
  2. # du -csh # 当前目录下所有目录大小总数
  3. # du -ks * | sort -n -r # 由大到小排序显示目录大小
  4. # ls -lSr # 由小到大显示文件列表

谁打开了那些文件

对于找出哪些文件阻止卸载分区并给出有代表性的错误是有帮助的:

  1. # umount /home/
  2. umount: unmount of /home # 不能卸载,因为有一个文件锁定了 home
  3. failed: Device busy

使用 fuser 或 lsof 在一个挂载点中查找已打开的文件:

  1. # fuser -m /home # 列出访问 /home 的进程
  2. # lsof /home
  3. COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
  4. tcsh 29029 eedcoba cwd DIR 0,18 12288 1048587 /home/eedcoba (guam:/home)
  5. lsof 29140 eedcoba cwd DIR 0,18 12288 1048587 /home/eedcoba (guam:/home)

关于一个应用程序:

  1. ps ax | grep Xorg | awk '{print $1}'
  2. 3324
  3. # lsof -p 3324
  4. COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
  5. Xorg 3324 root 0w REG 8,6 56296 12492 /var/log/Xorg.0.log

关于单个文件:

  1. # lsof /var/log/Xorg.0.log
  2. COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
  3. Xorg 3324 root 0w REG 8,6 56296 12492 /var/log/Xorg.0.log

挂载/重挂载一个文件系统

举个 cdrom 的例子。如果已经列于 /etc/fstab 中:

# mount /cdrom

或在 /dev/ 中查找设备,亦或使用 dmesg 命令

  1. # mount -t auto /dev/cdrom /mnt/cdrom # 典型的 cdrom 挂载命令
  2. # mount /dev/hdc -t iso9660 -r /cdrom # IDE
  3. # mount /dev/sdc0 -t iso9660 -r /cdrom # SCSI

/etc/fstab 中的条目:

/dev/cdrom   /media/cdrom  subfs noauto,fs=cdfss,ro,procuid,nosuid,nodev,exec 0 0

用 Linux 挂载一个 FreeBSD 分区

用 fdisk 查找分区号,这通常是 root 分区,但也可能是其他 BSD slice。如果 FreeBSD 有许多 slice,他们不列于同一个 fdisk 分区表中,但可见于 /dev/sda* 或 /dev/hda* 中。

  1. # fdisk /dev/sda # 查找 FreeBSD 分区
  2. /dev/sda3 * 5357 7905 20474842+ a5 FreeBSD
  3. # mount -t ufs -o ufstype=ufs2,ro /dev/sda3 /mnt
  4. /dev/sda10 = /tmp; /dev/sda11 /usr # 其他 slice

重挂载

不用卸载一个设备来重挂载。 对 fsck 来说是必须的。举个例子:

  1. # mount -o remount,ro / # Linux
  2. # mount -o ro / # FreeBSD

从 cdrom 拷贝原始数据进一个 iso 映像文件:

# dd if=/dev/cd0c of=file.iso

给即时烧录(on-the-fly)添加 swap

假设你需要很多的 swap (即刻),如一个 2GB 文件 /swap2gb (只限 Linux)。

  1. # dd if=/dev/zero of=/swap2gb bs=1024k count=2000
  2. # mkswap /swap2gb # 创建交换区
  3. # swapon /swap2gb # 激活这个 swap。现在可以使用了
  4. # swapoff /swap2gb # 当使用完毕,释放这个 swap
  5. # rm /swap2gb

挂载一个 SMB 共享

假设我们要访问计算机 smbserver 上的名叫 myshare 的 SMB 共享,在 window PC 上键入的地址是 \\smbserver\myshare\。我挂载到 /mnt/smbshare 上。注意 cifs 必须是 IP 或 DNS 名,不是 Windows 名字。

  1. # smbclient -U user -I 192.168.16.229 -L //smbshare/ # 列出共享
  2. # mount -t smbfs -o username=winuser //smbserver/myshare /mnt/smbshare
  3. # mount -t cifs -o username=winuser,password=winpwd //192.168.16.229/myshare /mnt/share

此外,mount.cifs 软件包可以存储认证到一个文件中。例如,/home/user/.smb:

  1. username=winuser
  2. password=winpwd

现在可以像下面那样挂载:

# mount -t cifs -o credentials=/home/user/.smb //192.168.16.229/myshare /mnt/smbshare

挂载镜像文件

Linux loop-back

  1. # mount -t iso9660 -o loop file.iso /mnt # 挂载 CD 镜像文件
  2. # mount -t ext3 -o loop file.img /mnt # 用 ext3 文件系统挂载镜像文件

创建并刻录 ISO 镜像文件

这将会拷贝 CD 或者 DVD 的扇区。当不用 conv=notrunc,镜像文件会等于 CD 内容大小而非 CD 容量大小。看下面和 dd 例子

# dd if=/dev/hdc of=/tmp/mycd.iso bs=2048 conv=notrunc

使用 mkisofs 把目录中所有文件创建成 CD/DVD 镜像文件。克服文件名限制:-r 开启 Rock Ridge 扩展用于 Unix 系统,-J 开启 Joliet 扩展用于微软系统。-L 允许 ISO9660 文件名第一个字符为句点。

# mkisofs -J -L -r -V TITLE -o imagefile.iso /path/to/dir

对于 FreeBSD,mkisofs 可以到 port 的 sysutils/cdrtools 中找到。


创建基于文件的镜像文件

举个例子,一个使用文件 /usr/vdisk.img 的 1GB 分区。这里我们使用 vnode 0,但也可为 1。

  1. # dd if=/dev/zero of=/usr/vdisk.img bs=1024k count=1024
  2. # mkfs.ext3 /usr/vdisk.img
  3. # mount -o loop /usr/vdisk.img /mnt
  4. # umount /mnt; rm /usr/vdisk.img # 清楚

/dev/zero 比 urandom 更快,但对于加密来说却不够安全。

  1. # dd if=/dev/urandom of=/usr/vdisk.img bs=1024k count=1024
  2. # losetup /dev/loop0 /usr/vdisk.img # 创建并联结 /dev/loop0
  3. # mkfs.ext3 /dev/loop0
  4. # mount /dev/loop0 /mnt
  5. # losetup -a # 查看已经挂载的 loop 设备
  6. # umount /mnt
  7. # losetup -d /dev/loop0 # Detach
  8. # rm /usr/vdisk.img

创建基于内存的文件系统

基于内存的文件系统对于重量级 IO 应用程序来说非常快。怎样创建一个挂载到 /memdisk 的 64M 分区:

# mount -t tmpfs -osize=64m tmpfs /memdisk

磁盘性能

在 ad4s3c (/home) 分区上读写一个 1GB 的文件。

  1. # time dd if=/dev/ad4s3c of=/dev/null bs=1024k count=1000
  2. # time dd if=/dev/zero bs=1024k count=1000 of=/home/1Gb.file
  3. # hdparm -tT /dev/hda # 仅限 Linux

网络

调试 (也可看流量分析)|路由|配置额外的 IP 地址|更改 MAC 地址|使用中的端口|防火墙|路由 IP 转发|NAT - 网络地址转换|反向查询|/etc/hosts|DHCP|通信量分析(Traffic analysis)|用 nmap 扫描|流量控制(QoS)


调试 (也可看流量分析)

  1. # ethtool eth0 # 显示以太网状态(replaces mii-diag)
  2. # ethtool -s eth0 speed 100 duplex full # 把网卡 eth0 速度改为 100/秒,采用全双工
  3. # ethtool -s eth0 autoneg off # 禁用自动协商模式
  4. # ethtool -p eth1 # 闪烁网络接口 LED 灯 - 如果支持的话,非常实用
  5. # ip link show # 在 Linux 上显示所有网络接口(同 ifconfig 类似)
  6. # ip link set eth0 up # 使设备激活(或Down掉)。同 "ifconfig eth0 up"
  7. # ip addr show # 在 Linux 上显示所有 IP 地址(与 ifconfig 类似)
  8. # ip neigh show # 与 arp -a 类似

路由

列印路由表

  1. # route -n # Linux 或使用 "ip route"
  2. # netstat -rn # Linux, BSD 和 UNIX
  3. # route print # Windows

添加删除路由

  1. # route add -net 192.168.20.0 netmask 255.255.255.0 gw 192.168.16.254
  2. # ip route add 192.168.20.0/24 via 192.168.16.254 # 等同于上面命令
  3. # route add -net 192.168.20.0 netmask 255.255.255.0 dev eth0
  4. # route add default gw 192.168.51.254
  5. # ip route add default via 192.168.51.254 dev eth0 # 等同于上面命令
  6. # route delete -net 192.168.20.0 netmask 255.255.255.0

配置额外的 IP 地址

  1. # ifconfig eth0 192.168.50.254 netmask 255.255.255.0 # 第一个 IP
  2. # ifconfig eth0:0 192.168.51.254 netmask 255.255.255.0 # 第二个 IP
  3. # ip addr add 192.168.50.254/24 dev eth0 # 等价命令
  4. # ip addr add 192.168.51.254/24 dev eth0 label eth0:1

更改 MAC 地址

通常在你更改之前先停下网络接口。不要告诉我为什么你想改变 MAC 地址......

  1. # ifconfig eth0 down
  2. # ifconfig eth0 hw ether 00:01:02:03:04:05 # Linux
  3. # ifconfig fxp0 link 00:01:02:03:04:05 # FreeBSD
  4. # ifconfig hme0 ether 00:01:02:03:04:05 # Solaris
  5. # sudo ifconfig en0 ether 00:01:02:03:04:05 # Mac OS X Tiger
  6. # sudo ifconfig en0 lladdr 00:01:02:03:04:05 # Mac OS X Leopard

对于 Windows 已经有许多工具了。像 etherchange。或者看看 "Mac Makeup", "smac"。


使用中的端口

监听打开的端口:

  1. # netstat -an | grep LISTEN
  2. # lsof -i # 列出所有因特网连接(Linux)
  3. # socklist # 列出打开的 socket (Linux)
  4. # sockstat -4 # 使用 socket 的应用程序列表(FreeBSD)
  5. # netstat -anp --udp --tcp | grep LISTEN # Linux
  6. # netstat -tup # 列出活跃的连接(Linux)
  7. # netstat -tupl # 列出系统中正在监听的端口(Linux)
  8. # netstat -ano # Windows

防火墙

检查正在运行的防火墙(只是典型配置):

  1. # iptables -L -n -v # 状态信息
  2. Open the iptables firewall
  3. # iptables -P INPUT ACCEPT # 打开所有
  4. # iptables -P FORWARD ACCEPT
  5. # iptables -P OUTPUT ACCEPT
  6. # iptables -Z # 把所有链的包及字节的计数器清空
  7. # iptables -F # 清空所有链
  8. # iptables -X # 删除所有链

路由 IP 转发

查看然后启用 IP 转发:

  1. # cat /proc/sys/net/ipv4/ip_forward # 查看 IP 转发 0=禁用, 1=启用
  2. # echo 1 > /proc/sys/net/ipv4/ip_forward

或者编辑 /etc/sysctl.conf:

net.ipv4.ip_forward = 1

NAT - 网络地址转换

  1. # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # 激活 NAT
  2. # iptables -t nat -A PREROUTING -p tcp -d 78.31.70.238 --dport 20022 -j DNAT \
  3. --to 192.168.16.44:22 # 转发端口 20022 到内部 IP 端口(ssh)
  4. # iptables -t nat -A PREROUTING -p tcp -d 78.31.70.238 --dport 993:995 -j DNAT \
  5. --to 192.168.16.254:993:995 # 转发 993-995 范围端口
  6. # ip route flush cache
  7. # iptables -L -t nat # 查看 NAT 状态信息

使用 -D 替换 -A 来删除端口转发。


反向查询

查找属于一个 IP 地址(in-addr.arpa.)的域名。可用 dighost 和 nslookup 命令查询:

  1. # dig -x 78.31.70.238
  2. # host 78.31.70.238
  3. # nslookup 78.31.70.238

/etc/hosts

单个主机可以配置于文件 /etc/hosts 来代替本地正在运行的 named 反向域名查询。格式很简单,举个例子:

78.31.70.238   sleepyowl.net   sleepyowl

对于 hosts 文件和 DNS 查询之间的优先级,可在 /etc/nsswitch.conf 和 /etc/host.conf 中配置 order 名称解析。


DHCP

一些发行版(SuSE)使用 dhcpcd 作为客户端。默认网络接口是 eth0。

  1. # dhcpcd -n eth0 # 触发更新(并不总是可以工作)
  2. # dhcpcd -k eth0 # 释放并关闭

租约(lease)的全部信息存储在:

/var/lib/dhcpcd/dhcpcd-eth0.info

通信量分析(Traffic analysis)

Bmon 是一个小的流量监控控制台,而且可以显示不同的网络接口的流量。

用 tcpdump 嗅探(sniff)

  1. # tcpdump -nl -i bge0 not port ssh and src \(192.168.16.121 or 192.168.16.54\)
  2. # tcpdump -l > dump && tail -f dump # 缓冲输出
  3. # tcpdump -i rl0 -w traffic.rl0 # 把数据报文写入二进制文件
  4. # tcpdump -r traffic.rl0 # 从文件读取数据报文(也可以使用 ethereal)
  5. # tcpdump port 80 # 两个经典命令
  6. # tcpdump host google.com
  7. # tcpdump -i eth0 -X port \(110 or 143\) # 查看端口 110(POP) 或 143(IMAP)的数据报文
  8. # tcpdump -n -i eth0 icmp # 只捕获 ping
  9. # tcpdump -i eth0 -s 0 -A port 80 | grep GET # -s 0 为全部包, -A 为 ASCII

另一些重要选项:

  • -A     显示每个包清晰文本(除了报头)
  • -X     显示包的 ASCII 文本
  • -l     使标准输出变为缓冲行形式
  • -D     显示所有可用网络接口

对于 Windows 可以使用 www.winpcap.org。使用 windump -D 来列出网络接口。


用 nmap 扫描

Nmap 是一个用于 OS 探测的端口扫描工具,她通常在许多发行版上有安装,并且同样可用于 Windows。如果你不扫描你的服务器,骇客们会为你做这些...

  1. # nmap cb.vu # 扫描主机上所有保留的 TCP 端口
  2. # nmap -sP 192.168.16.0/24 # 找出在 0/24 上主机所使用的 IP
  3. # nmap -sS -sV -O cb.vu # 做秘密 SYN 扫描来探测系统和系统服务的版本信息
  4. PORT STATE SERVICE VERSION
  5. 22/tcp open ssh OpenSSH 3.8.1p1 FreeBSD-20060930 (protocol 2.0)
  6. 25/tcp open smtp Sendmail smtpd 8.13.6/8.13.6
  7. 80/tcp open http Apache httpd 2.0.59 ((FreeBSD) DAV/2 PHP/4.
  8. [...]
  9. Running: FreeBSD 5.X
  10. Uptime 33.120 days (since Fri Aug 31 11:41:04 2007)

其他非标准但好用的工具有 hping (www.hping.org),她是一个 IP 分组组装/分析器,和 fping (fping.sourceforge.net)。fping 可以在一个循环队列(round-robin fashion)中扫描多种主机。


流量控制(QoS)

流量控制管理着一个网络的队列、流量监控、调度以及其他流量设置(traffic parameters)。以下简单实用的示例使用 Linux 和 FreeBSD 的能力来更好的利用带宽。

上传限制

DSL 或有线调制解调器有一个很长的列队来提高上传吞吐量(upload throughput)。然而用一个快速的设备(如以太网)填充这个列队将大大减少交互性。这就是限制设备上传速度有用的原因,以匹配调制解调器的实际能力,这可以有效提高交互性。设置大约为 modem 最大速度的 90%。

给 512K 上传速度的 modem。

  1. # tc qdisc add dev eth0 root tbf rate 480kbit latency 50ms burst 1540
  2. # tc -s qdisc ls dev eth0 # 状态
  3. # tc qdisc del dev eth0 root # 删除队列
  4. # tc qdisc change dev eth0 root tbf rate 220kbit latency 50ms burst 1540

服务质量 (Quality of service)

使用 tc 的优先级队列来优化 VoIP。在 voip-info.org 或 www.howtoforge.com 上可以看到完整的例子。假设 VoIP 使用 UDP 端口 10000:11024 并且使用 eth0 设备(也可为 ppp0 或 so)。下列命令定义了三个队列,并且用 QoS 0x1e(设置所有位) 强制 VOIP 流量到队列 1。默认流量流入队列 3,Qos Minimize-Delay 流入队列 2。

  1. # tc qdisc add dev eth0 root handle 1: prio priomap 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 0
  2. # tc qdisc add dev eth0 parent 1:1 handle 10: sfq
  3. # tc qdisc add dev eth0 parent 1:2 handle 20: sfq
  4. # tc qdisc add dev eth0 parent 1:3 handle 30: sfq
  5. # tc filter add dev eth0 protocol ip parent 1: prio 1 u32 \
  6. match ip dport 10000 0x3C00 flowid 1:1 # 使用服务端端口范围
  7. match ip dst 123.23.0.1 flowid 1:1 # 或/和使用服务器 IP

状态和移除:

  1. # tc -s qdisc ls dev eth0 # queue status
  2. # tc qdisc del dev eth0 root # delete all QoS

计算端口范围和掩码 (mask)

用你所计算的端口掩码来定义 tc 过滤器的端口范围。查询 2^N 端口范围结尾,推断范围并转换成十六进制。这就是你的掩码 (mask)。例如 10000 -> 11024,它的范围是 1024。

  1. # 2^13 (8192) < 10000 < 2^14 (16384) # 结尾是 2^14 = 16384
  2. # echo "obase=16;(2^14)-1024" | bc # 掩码是 0x3C00

 


实用命令

less|vi|mail|tar|dd|screen|Find|混杂的


less

less 命令用来在控制台中分屏显示文本文档。它在许多发行版中可用。

# less unixtoolbox.xhtml

一些重要指令(^N 代表 [control]-[N]):

  • h H       显示指令的汇总列表
  • f ^F ^V SPACE       向前滚动一屏(或者 N 行)
  • b ^B ESC-v       向后滚动一屏(或者 N 行)
  • F       向前滚动;类似于"tail -f"
  • /pattern       向前搜索匹配该模式的行
  • ?pattern       向后搜索匹配该模式的行
  • n       重复之前的搜索
  • N       反方向重复之前的搜索
  • q       退出

vi

Vi 在任何 Linux/Unix 发行安装版(gentoo 没有?)上都存在。因此,我们有必要了解一些基本的命令。Vi 有两个模式:命令模式和插入模式。使用 [ESC] 键可进入命令模式,使用 i 键可进入插入模式。如果你迷失了,可在命令模式下键入 : help
编辑器 nano 和 pico 通常也都可用,而且更容易(IMHO)使用。

Quit

  • :w newfilename       保存文件为 newfilename
  • :wq or :x       保存并退出
  • :q!       退出但不保存

移动和查找

  • /string       向前查找 string
  • ?string       向后查找 string
  • n       同方向重复上一次搜索命令
  • N       反方向重复上一次搜索命令
  • {       光标移至段落结尾
  • }       光标移至段落开头
  • 1G       光标移至文件的第一行首
  • nG       光标移至文件的第 n 行首
  • G       光标移至文件的最后一行首
  • :%s/OLD/NEW/g       替换所有查找到的 OLD 为 NEW

删除文本

  • dd       删除当前行
  • D       删除光标到当前行末尾的字符
  • dw       删除单词
  • x       删除字符
  • u       回复上一次操作
  • U       回复所有此行的更改

mail

mail 命令是一个读取和发送邮件的应用程序,她通常已安装。要发送一封邮件,可以简单的输入 "mail user@domain"。其第一行为主题,然后是邮件内容。在一个新行中使用单个点(.)来结束并发送邮件。例子:

  1. # mail c@cb.vu
  2. Subject: Your text is full of typos
  3. "For a moment, nothing happened. Then, after a second or so,
  4. nothing continued to happen."
  5. .
  6. EOT
  7. #

这同样可用于管道:

# echo "This is the mail body" | mail c@cb.vu

也是测试邮件服务器的简单方法。


tar

命令 tar (磁带存档) 可以为文件和目录创建档案。归档文件 .tar 是未压缩的,一个压缩过的归档文件的后缀是 .tgz 或 .tar.gz (zip) 或者 .tbz (bzip2)。不要使用绝对路径建立一个归档文件,你可能要解开这个归档文件到某个地方。一些常用命令如下:

创建

  1. # cd /
  2. # tar -cf home.tar home/ # 归档整个 /home 目录(c 为创建)
  3. # tar -czf home.tgz home/ # 等同于 zip 压缩
  4. # tar -cjf home.tbz home/ # 等同于 bzip2 压缩

从一个目录树中只包含一个(或2个)目录,并保持相对目录结构。举个例子,/usr/local/etc 和 /usr/local/www,它们在归档文件中的第一层目录是 local/。

  1. # tar -C /usr -czf local.tgz local/etc local/www
  2. # tar -C /usr -xzf local.tgz # 释放 local 目录到 /usr
  3. # cd /usr; tar -xzf local.tgz # 同上面一样

释放(Extract)

  1. # tar -tzf home.tgz # 列出归档文件中的所有文件,并不释放
  2. # tar -xf home.tar # 释放归档文件(x 为释放)
  3. # tar -xzf home.tgz # 等同于 zip 压缩
  4. # tar -xjf home.tgz # 等同于 bzip2 压缩
  5. # tar -xjf home.tgz home/colin/file.txt # 释放单个文件

更高级的

  1. # tar c dir/ | gzip | ssh user@remote 'dd of=dir.tgz' # 归档压缩 dir/ 目录并存储到远程主机上
  2. # tar cvf - `find . -print` > backup.tar # 归档当前目录
  3. # tar -cf - -C /etc . | tar xpf - -C /backup/etc # 拷贝目录
  4. # tar -cf - -C /etc . | ssh user@remote tar xpf - -C /backup/etc # 远程拷贝
  5. # tar -czf home.tgz --exclude '*.o' --exclude 'tmp/' home/

dd

程序 dd (磁盘备份(disk dump) 或 destroy disk,也可看 dd 的含义) 用来拷贝分区、磁盘或者其它拷贝。通常这么用:

# dd if=<source> of=<target> bs=<byte size> conv=<conversion>

重要的 conv 选项:

  • notrunc       不截短输出文件
  • noerror       出错时不停止处理(e.g. 坏扇区)
  • sync       把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐

默认字节大小为 512 (一个扇区)。MBR 处于磁盘的第一个扇区,之后的 63 个扇区是空的。较大的字节大小可以加快拷贝速度但也需要更多的内存。

备份和恢复

  1. # dd if=/dev/hda of=/dev/hdc bs=16065b # 拷贝磁盘到磁盘(相同大小)
  2. # dd if=/dev/sda7 of /home/root.img bs=4096 conv=notrunc,noerror # 备份 /
  3. # dd if /home/root.img of=/dev/sda7 bs=4096 conv=notrunc,noerror # 恢复 /
  4. # dd bs=1M if=/dev/ad4s3e | gzip -c > ad4s3e.gz # 压缩备份
  5. # gunzip -dc ad4s3e.gz | dd of=/dev/ad0s3e bs=1M # 解压恢复
  6. # dd bs=1M if=/dev/ad4s3e | gzip | ssh eedcoba@fry 'dd of=ad4s3e.gz' # 也可为远程的
  7. # gunzip -dc ad4s3e.gz | ssh eedcoba@host 'dd of=/dev/ad0s3e bs=1M'
  8. # dd if=/dev/ad0 of=/dev/ad2 skip=1 seek=1 bs=4k conv=noerror # 忽略 MBR
  9. # 如果目标(ad2)比较小,这是必须的。

恢复

该 dd 命令会读取分区的每一个区块,即所有区块。对于有问题的区块,最好使用 conv=sync,noerror 选项,dd 将会跳过坏的区块并入 0。因此,这就是设置块大小等于或小于磁盘块大小的重要性。1k 大小似乎安全,用 bs=1k 来设置它。假如一个磁盘有坏扇区并且有个分区的数据要恢复,那么用 dd 工具创建一个镜像文件,挂载这个镜像文件,然后拷贝内容到新的磁盘中。如果用了 noerror 选项,dd 会跳过坏扇区并写入 0,也即坏扇区中的内容会丢失。

  1. # dd if=/dev/hda of=/dev/null bs=1m # 检查坏扇区
  2. # dd bs=1k if=/dev/hda1 conv=sync,noerror,notrunc | gzip | ssh \ # 发送到远程
  3. root@fry 'dd of=hda1.gz bs=1k'
  4. # dd bs=1k if=/dev/hda1 conv=sync,noerror,notrunc of=hda1.img # 存储为一个映像文件
  5. # mount -o loop /hda1.img /mnt # 挂载这个映像文件
  6. # rsync -ax /mnt/ /newdisk/ # 拷贝到一个新磁盘
  7. # dd if=/dev/hda of=/dev/hda # 刷新磁状态
  8. # 上面的命令对于刷新磁盘(refresh disk)很有用。这绝对安全,但必须先卸载磁盘。

删除

  1. # dd if=/dev/zero of=/dev/hdc # 删除全部数据
  2. # dd if=/dev/urandom of=/dev/hdc # 更好的删除全部数据
  3. # kill -USR1 PID # 查看 dd 进度(仅Linux!)

MBR 技巧

MBR 包含了引导程序和分区表,它的大小为 512 字节。前 446 字节为引导程序,446 到 512 字节为分区表。

  1. # dd if=/dev/sda of=/mbr_sda.bak bs=512 count=1 # 完全备份 MBR
  2. # dd if=/dev/zero of=/dev/sda bs=512 count=1 # 删除 MBR 和分区表
  3. # dd if=/mbr_sda.bak of=/dev/sda bs=512 count=1 # 完全恢复MBR
  4. # dd if=/mbr_sda.bak of=/dev/sda bs=446 count=1 # 仅回复引导程序
  5. # dd if=/mbr_sda.bak of=/dev/sda bs=1 count=64 skip=446 seek=446 # 恢复分区表

screen

Screen 提供了两个主要功能:

  • 在一个终端内运行多个终端会话(terminal session)。
  • 一个已启动的程序与运行它的真实终端分离的,因此可运行于后台。真实的终端可以被关闭,还可以在稍后再重新接上(reattached)。

简短实例

开启 screen:

# screen

在 screen 会话中,我们可以开启一个长时间运行的程序(如 top)。Detach 这个终端,之后可以从其他机器 reattach 这个相同的终端(比如通过 ssh)。

# top

现在用 Ctrl-a Ctrl-d 来 detach。Reattach 终端:

# screen -r

或更好的:

# screen -R -D

现在 attach 到这里。具体意思是:先试图恢复离线的 screen 会话。若找不到离线的 screen 会话,即建立新的 screen 会话给用户。

Screen 命令 (在 screen 中)

所有命令都以 Ctrl-a 开始。

  • Ctrl-a ? 各功能的帮助摘要
  • Ctrl-a c 创建一个新的 window (终端)
  • Ctrl-a Ctrl-n 和 Ctrl-a Ctrl-p 切换到下一个或前一个 window
  • Ctrl-a Ctrl-N N 为 0 到 9 的数字,用来切换到相对应的 window
  • Ctrl-a " 获取所有正在运行的 window 的可导航的列表
  • Ctrl-a a 清楚错误的 Ctrl-a
  • Ctrl-a Ctrl-d 断开所有会话,会话中所有任务运行于后台
  • Ctrl-a x 用密码锁柱 screen 终端

当程序内部运行终端关闭并且你登出该终端时,该 screen 会话就会被终止。


Find

一些重要选项:

  • -x (BSD) -xdev (Linux)       留于同一文件系统 (fstab 中的 dev)
  • -exec cmd {} \;       执行命令并用全路径替换 {}
  • -iname       同 -name 一样,但不区分大小写
  • -ls       显示关于文件的信息(同 ls -la)
  • -size n       n 为 +-n (k M G T P)
  • -cmin n       查找系统中最后 n 分钟改变文件状态的文件
  1. # find . -type f ! -perm -444 # 寻找所有无法读取的文件
  2. # find . -type d ! -perm -111 # 寻找所有无法访问的目录
  3. # find /home/user/ -cmin 10 -print # 寻找最后 10 分钟创建或修改的文件
  4. # find . -name '*.[ch]' | xargs grep -E 'expr' # 在当前目录及子目录搜索 'expr' 表达式
  5. # find / -name "*.core" | xargs rm # 寻找 core 垃圾并删除它们(也可试试 core.*)
  6. # find / -name "*.core" -print -exec rm {} \; # 另一种语法
  7. # 寻找图像文件并创建一个归档文件,iname 为不区分大小写。-r 为附加
  8. # find . \( -iname "*.png" -o -iname "*.jpg" \) -print -exec tar -rf images.tar {} \;
  9. # find . -type f -name "*.txt" ! -name README.txt -print # 除 README.txt 的文件
  10. # find /var/ -size +10M -exec ls -lh {} \; # 查找 > 10 MB 的文件
  11. # find /var/ -size +10M -ls # 这个更简单
  12. # find . -size +10M -size -50M -print
  13. # find /usr/ports/ -name work -type d -print -exec rm -rf {} \; # 清理 port
  14. # 以 SUID 查找文件;这些文件很脆弱,必须保持安全。
  15. # find / -type f -user root -perm -4000 -exec ls -l {} \;

小心 xarg 或 exec,因为当文件或目录中包含空格时可能会返回错误的结果。在有疑惑时用 "-print0 | xargs -0" 代替 "| xargs"。选项 -print0 必须在 find 命令的最后。看这个不错的 find 迷你教程.

  1. # find . -type f | xargs ls -l # 不能工作于有空格的名字
  2. # find . -type f -print0 | xargs -0 ls -l # 可工作于有空格的名字
  3. # find . -type f -exec ls -l '{}' \; # 或使用用于 -exec 的引用 '{}'

混杂的

  1. # which command # 显示命令的全路径名
  2. # time command # 显示一个命令执行完成所用的时间
  3. # time cat # 使用 time 作为秒表,用 Ctrl-c 来停止
  4. # set | grep $USER # 列显当前环境变量
  5. # cal -3 # 显示三个月日历
  6. # date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
  7. # date 10022155 # 设置日期和时间
  8. # whatis grep # 显示命令的简短信息
  9. # whereis java # 查询命令的的路径和标准目录
  10. # setenv varname value # 设置环境变量,设置变量 varname 的值为 value (csh/tcsh)
  11. # export varname="value" # 设置环境变量,设置变量 varname 的值为 value (sh/ksh/bash)
  12. # pwd # 显示当前工作目录
  13. # mkdir -p /path/to/dir # 如果存在不显示错误,建立所需的上级目录
  14. # mkdir -p project/{bin,src,obj,doc/{html,man,pdf},debug/some/more/dirs}
  15. # rmdir /path/to/dir # 移除目录
  16. # rm -rf /path/to/dir # 移除目录和其内容(强制)
  17. # cp -la /dir1 /dir2 # 存档、硬连接目录所有文件,用来替代拷贝
  18. # cp -lpR /dir1 /dir2 # 同上 (FreeBSD)
  19. # cp unixtoolbox.xhtml{,.bak} # 拷贝文件成新扩展名的快速方法
  20. # mv /dir1 /dir2 # 修改目录名

 


媒体转换

文本编码|视频转换|拷贝音频光盘

有时候需要转换一个视频、音频文件或者文档成其他格式。

文本编码

文本编码可以得到完全错误的,特别是当语言需要某些特殊字符像 àäç。命令 iconv 可以从一个编码转换成另一个编码。

  1. # iconv -f <from_encoding> -t <to_encoding> <input_file>
  2. # iconv -f ISO8859-1 -t UTF-8 -o file.input > file_utf8
  3. # iconv -l # 列显系统所支持的字符编码

若文档显示良好,通常都可不使用 -f 选项,iconv 会使用本地字符集(char-set)。


视频转换

使用 mpeg4 编码压缩佳能数码相机视频并修复无用音质。

  1. # mencoder -o videoout.avi -oac mp3lame -ovc lavc -srate 11025 \
  2. -channels 1 -af-adv force=1 -lameopts preset=medium -lavcopts \
  3. vcodec=msmpeg4v2:vbitrate=600 -mc 0 vidoein.AVI

对于声音的处理可看 sox


拷贝音频光盘

程序 cdparanoia 可以保存音轨(FreeBSD port 在 audio/cdparanoia/),oggenc 可编码 Ogg Vorbis 格式,lame 可转换成 mp3。

  1. # cdparanoia -B # 拷贝音轨成 wav 文件到当前目录列表(dir)
  2. # lame -b 256 in.wav out.mp3 # 编码成 256 kb/s 的 mp3
  3. # for i in *.wav; do lame -b 256 $i `basename $i .wav`.mp3; done
  4. # oggenc in.wav -b 256 out.ogg # 编码成 256 kb/s 的 Ogg Vorbis

脚本

Bourne shell (/bin/sh) 存在于所有的 Unix 系统上,并且用她写的脚本是(完全)可移植的; man 1 sh 是一个好的参考。


基础

变量和参数

使用 variable=value 的命令格式设置变量,其中 variable 是变量名称,value是打算赋给该变量的值。使用 $variable 获取变量值。

  1. MESSAGE="Hello World" # 赋予一个字符串
  2. PI=3.1415 # 赋予一个十进制小数
  3. N=8
  4. TWON=`expr $N * 2` # 算术表达式(只限整数)
  5. TWON=$(($N * 2)) # 另一种语法
  6. TWOPI=`echo "$PI * 2" | bc -l` # 使用 bc 进行浮点运算
  7. ZERO=`echo "c($PI/4)-sqrt(2)/2" | bc -l`

命令行参数:

  1. $0, $1, $2, ... # $0 命令本身
  2. $# # 命令参数个数
  3. $* # 所有参数(也可以是 $@)

一些特殊的变量

  1. $$ # 当前进程 ID
  2. $? # 最后命令退出状态码
  3. command
  4. if [ $? != 0 ]; then
  5. echo "command failed"
  6. fi
  7. mypath=`pwd`
  8. mypath=${mypath}/file.txt
  9. echo ${mypath##*/} # 只显示文件名
  10. echo ${mypath%%.*} # 除了扩展名的全路径
  11. var2=${var:=string} # 如果var没有被赋值,则string值先赋值给var,
  12. # 然后再赋值给var2

结构控制

  1. for file in `ls`
  2. do
  3. echo $file
  4. done
  5. count=0
  6. while [ $count -lt 5 ]; do
  7. echo $count
  8. sleep 1
  9. count=$(($count + 1))
  10. done
  11. myfunction() {
  12. find . -type f -name "*.$1" -print # $1 为方法的第一个参数
  13. }
  14. myfunction "txt"

产生一个文件

  1. MYHOME=/home/colin
  2. cat > testhome.sh << _EOF
  3. # 所有_EOF前的代码都会进入到 testhome.sh 文件中去
  4. if [ -d "$MYHOME" ] ; then
  5. echo $MYHOME exists
  6. else
  7. echo $MYHOME does not exist
  8. fi
  9. _EOF
  10. sh testhome.sh

Bourne 脚本实例

来一个小实例,此脚本从本 xhtml 文档创建一个 PDF 小册子:

  1. #!/bin/sh
  2. # 此脚本可以创建一份供双面打印机打印的 PDF 格式的书
  3. if [ $# -ne 1 ]; then # 检查参数是否等于 1
  4. echo 1>&2 "Usage: $0 HtmlFile"
  5. exit 1 # 如果不等于1,非0退出
  6. fi
  7. file=$1 # 文件变量
  8. fname=${file%.*} # 文件名变量
  9. fext=${file#*.} # 文件扩展名变量
  10. prince $file -o $fname.pdf # www.princexml.com
  11. pdftops -paper A4 -noshrink $fname.pdf $fname.ps # 创建 postscript 小册子
  12. cat $fname.ps |psbook|psnup -Pa4 -2 |pstops -b "2:0,1U(21cm,29.7cm)" > $fname.book.ps
  13. ps2pdf13 -sPAPERSIZE=a4 -sAutoRotatePages=None $fname.book.ps $fname.book.pdf
  14. # 在 Windows 上使用 #a4 和 #None!
  15. exit 0 # exit 0 意为成功

一些 sed 命令

这里是单行 sed 命令的金矿。还有一个很好的 sed 介绍及教程

  1. sed 's/string1/string2/g' # 替换 string1 为 string2
  2. sed -i 's/wroong/wrong/g' *.txt # 用 g 替换所有返回的单词
  3. sed 's/\(.*\)1/\12/g' # 修改 anystring1 为 anystring2
  4. sed '/<p>/,/<\/p>/d' t.xhtml # 删除以 <p> 开始,以 </p> 结尾的行
  5. sed '/ *#/d; /^ *$/d' # 删除注释和空行
  6. sed 's/[ \t]*$//' # 删除行尾空格 (使用 tab 代替 \t)
  7. sed 's/^[ \t]*//;s/[ \t]*$//' # 删除行头尾空格
  8. sed 's/[^*]/[&]/' # 括住首字符 [] top -> [t]op
  9. sed = file | sed 'N;s/\n/\t/' > file.num # 为文件添加行号

正则表达式

一些基本的正则表达式同样可用于 sed。作为一个良好的启蒙,可看 基本正则语法

  1. [\^$.|?*+() # 特殊字符,其他字符将匹配自身
  2. \ # 转义特殊字符,当成普通字符对待
  3. * # 重复前项 0 次或多次
  4. . # 单个字符除换行符
  5. .* # 匹配 0 个或多个字符
  6. ^ # 匹配字符串行开始处
  7. $ # 匹配字符串行结尾处
  8. .$ # 匹配字符串行最后一个字符
  9. ^ $ # 匹配单个空格的行
  10. [^A-Z] # 匹配任何以 A-Z 字符开始的行

一些实用命令

下列命令对于包含于一个脚本或者单行命令来说很有用。

  1. sort -t. -k1,1n -k2,2n -k3,3n -k4,4n # 排序 IPv4 格式的 IP 地址
  2. echo 'Test' | tr '[:lower:]' '[:upper:]' # 转换成大写
  3. echo foo.bar | cut -d . -f 1 # 返回 foo
  4. PID=$(ps | grep script.sh | grep bin | awk '{print $1}') # 正在运行名为 script 脚本的 PID
  5. PID=$(ps axww | grep [p]ing | awk '{print $1}') # ping 的 PID (w/o grep pid)
  6. IP=$(ifconfig $INTERFACE | sed '/.*inet addr:/!d;s///;s/ .*//') # Linux
  7. IP=$(ifconfig $INTERFACE | sed '/.*inet /!d;s///;s/ .*//') # FreeBSD
  8. if [ `diff file1 file2 | wc -l` != 0 ]; then [...] fi # 文件改变了?
  9. cat /etc/master.passwd | grep -v root | grep -v \*: | awk -F":" \ # 创建 http passwd
  10. '{ printf("%s:%s\n", $1, $2) }' > /usr/local/etc/apache2/passwd
  11. testuser=$(cat /usr/local/etc/apache2/passwd | grep -v \ # 查看 passwd 中的用户
  12. root | grep -v \*: | awk -F":" '{ printf("%s\n", $1) }' | grep ^user$)
  13. :(){ :|:& };: # bash fork 炸弹。会干掉你的机器
  14. tail +2 file > file2 # 删除文件的第一行

我使用一种小伎俩来一次更改许多文件的扩展名。举个例子,从 .cxx 到 .cpp。排除最后的 | sh 先测试一下。你同样可以使用命令 rename 来做这些,如果安装了的话。或者使用 bash 内建命令。

  1. # ls *.cxx | awk -F. '{print "mv "$0" "$1".cpp"}' | sh
  2. # ls *.c | sed "s/.*/cp & &.$(date "+%Y%m%d")/" | sh # 如 拷贝 *.c 成 *.c.20080401
  3. # rename .cxx .cpp *.cxx # 重命名所有 .cxx 成 .cpp
  4. # for i in *.cxx; do mv $i ${i%%.cxx}.cpp; done # bash 内建的

 


在线帮助

文档

Linux 文档en.tldp.org
Linux Man Pageswww.linuxmanpages.com
Linux 命令目录www.oreillynet.com/linux/cmd
Linux doc man howtoslinux.die.net
FreeBSD 手册www.freebsd.org/handbook
FreeBSD Man Pageswww.freebsd.org/cgi/man.cgi
FreeBSD 用户 wikiwww.freebsdwiki.net
Solaris Man Pagesdocs.sun.com/app/docs/coll/40.10

其他 Unix/Linux 参考

Rosetta Stone for Unixbhami.com/rosetta.html (a Unix command translator)
Unix guide cross referenceunixguide.net/unixguide.shtml
Linux 命令行列表www.linuxguide.it/commands_list.php
Short Linux referencewww.pixelbeat.org/cmdline.html
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/578255
推荐阅读
相关标签
  

闽ICP备14008679号