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/找到中文最新版。
也可到我的主页获取http://silenceisdefeat.org/~greco/unixtoolbox_zh_CN.xhtml
关于中文版的任何错误和修正请发送E-Mail到 ]]>

澳门金沙网上娱乐官网

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

正在运行的内核和系统信息
# uname -a                           # 获取内核版本(和BSD版本)
# lsb_release -a                     # 显示任何 LSB 发行版版本信息
# cat /etc/SuSE-release              # 获取 SuSE 版本
# cat /etc/debian_version            # 获取 Debian 版本
使用 /etc/DISTR-release 其中DISTR(发行代号)= lsb (Ubuntu), redhat, gentoo, mandrake, sun (Solaris), 等等。
# uptime                             # 显示系统开机运行到现在经过的时间
# hostname                           # 显示系统主机名
# hostname -i                        # 显示主机的 IP 地址
# man hier                           # 描述文件系统目录结构
# last reboot                        # 显示系统最后重启的历史记录

硬件信息

内核检测到的硬件信息
# dmesg                              # 检测到的硬件和启动的消息
# lsdev                              # 关于已安装硬件的信息译注:许多 Linux 发行版需要自行安装,如:apt-get install procinfo
# dd if=/dev/mem bs=1k skip=768 count=256 2>/dev/null | strings -n 8 # 读取 BIOS 信息

Linux

# cat /proc/cpuinfo                  # CPU 讯息
# cat /proc/meminfo                  # 内存信息
# grep MemTotal /proc/meminfo        # 显示物理内存大小
# watch -n1 'cat /proc/interrupts'   # 监控内核处理的所有中断
# free -m                            # 显示已用和空闲的内存信息 (-m 为 MB)译注:包括 SWAP 分区
# cat /proc/devices                  # 显示当前核心配置的设备
# lspci -tv                          # 显示 PCI 设备
# lsusb -tv                          # 显示 USB 设备
# lshal                              # 显示所有设备属性列表
# dmidecode                          # 显示从 BIOS 中获取的硬件信息

FreeBSD

# sysctl hw.model                    # CPU 讯息
# sysctl hw                          # 得到很多硬件信息
# sysctl vm                          # 虚拟内存使用情况
# dmesg | grep "real mem"            # 物理内存
# sysctl -a | grep mem               # 内核内存的设置和信息
# sysctl dev                         # 显示当前核心配置的设备
# pciconf -l -cv                     # 显示 PCI 设备
# usbdevs -v                         # 显示 USB 设备
# atacontrol list                    # 显示 ATA 设备

显示状态信息

以下的命令有助于找出正在系统中运行着的程序。
# top                                # 显示和更新使用 cpu 最多的进程
# mpstat 1                           # 显示进程相关的信息
# vmstat 2                           # 显示虚拟内存的状态信息
# iostat 2                           # 显示 I/O 状态信息(2 秒 间隙)
# systat -vmstat 1                   # 显示 BSD 系统状态信息(1 秒 间隙)
# systat -tcp 1                      # 显示 BSD TCP 连接信息(也可以试试 -ip)
# systat -netstat 1                  # 显示 BSD 当前网络连接信息
# systat -ifstat 1                   # 显示 BSD 当前网卡带宽信息
# systat -iostat 1                   # 显示 BSD CPU 和磁盘使用情况
# tail -n 500 /var/log/messages      # 显示最新500条内核/系统日志的信息
# tail /var/log/warn                 # 显示系统警告信息(看syslog.conf)

用户

# id                                 # 显示当前用户和用户组的 ID
# last                               # 列出目前与过去登入系统的用户相关信息译注:单独执行 last 指令,它会读取位于 /var/log 目录下,名称为 wtmp 的文件,并把该给文件的内容记录的登入系统的用户名单全部显示出来。
# who                                # 显示目前登入系统的用户信息
# groupadd admin                     # 建立新组"admin"和添加新用户 colin 并加入 admin 用户组(Linux/Solaris)
# useradd -c "Colin Barschel" -g admin -m colin
# userdel colin                      # 删除用户 colin(Linux/Solaris)
# adduser joe                        # FreeBSD 添加用户 joe(交互式)
# rmuser joe                         # FreeBSD 删除用户 joe(交互式)
# pw groupadd admin                  # 在 FreeBSD 上使用 pw
# pw groupmod admin -m newmember     # 添加新用户到一个组
# pw useradd colin -c "Colin Barschel" -g admin -m -s /bin/tcsh 
# 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 中的信息。
# echo "Sorry no login now" > /etc/nologin       # (Linux)
# 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 中配置。举个例子:
# cat /etc/security/limits.conf
*   hard    nproc   250              # 限制所有用户进程数
asterisk hard nofile 409600          # 限制应用程序可打开最大文件数

系统级

用sysctl来设置内核限制。要使其永久,可以在 /etc/sysctl.conf 中进行配置。
# sysctl -a                          # 显示所有系统限制
# sysctl fs.file-max                 # 显示系统最大文件打开数
# sysctl fs.file-max=102400          # 更改系统最大文件打开数
# cat /etc/sysctl.conf
fs.file-max=102400                   # 在 sysctl.conf 中的永久项
# cat /proc/sys/fs/file-nr           # 在使用的文件句柄数

FreeBSD

每 shell/脚本

在 csh 或 tcsh 中使用 limits 命令,在 sh 或 bash 中使用 ulimit 命令。

每 用户/进程

/etc/login.conf 中配置登录后的默认限制。未作限制的值为系统最大限制值。

系统级

内核限制同样使用 sysctl 来设置。永久配置,在 /etc/sysctl.conf/boot/loader.conf 中。其语法与 Linux 相同,只是键值不同。
# sysctl -a                          # 显示所有系统限制
# sysctl kern.maxfiles=XXXX          # 最大文件描述符数
kern.ipc.nmbclusters=32768           # 在 /etc/sysctl.conf 中的永久项
kern.maxfiles=65536                  # Squid译注:代理服务器 通常用这个值
kern.maxfilesperproc=32768
kern.ipc.somaxconn=8192              # TCP 列队。apache/sendmail 最好用这个值
# sysctl kern.openfiles              # 在使用的文件描述符数
# sysctl kern.ipc.numopensockets     # 已经开启的 socket 数目
详情请看 FreeBSD 手册 11章http://www.freebsd.org/handbook/configtuning-kernel-limits.html

Solaris

/etc/system 中的下列设置,会提高每个进程可以打开最大文件描述符的数量:
set rlim_fd_max = 4096               # 一个进程可以打开文件描述符的"硬"限制
set rlim_fd_cur = 1024               # 一个进程可以打开文件描述符的"软"限制

运行级别

Linux

一旦内核加载完成,内核会启动 init 进程,然后运行 rc译注:/etc/rc.d/rc 脚本,之后运行所有属于其运行级别的命令脚本。这些脚本都储存在 /etc/rc.d/rcN.d 中(N代表运行级别),并且都建立着到 /etc/init.d 子目录中命令脚本程序的符号链接。
默认运行级别配置在 /etc/inittab 中。它通常为 3 或 5:
# grep default: /etc/inittab                                         
id:3:initdefault:
可以使用 init 来改变当前运行级别。举个例子:
# init 5                             # 进入运行级别 5
运行级别列表如下: 使用 chkconfig 工具控制程序在一个运行级别启动和停止。
# chkconfig --list                   # 列出所有 init 脚本
# chkconfig --list sshd              # 查看 sshd 在各个运行级别中的启动配置
# chkconfig sshd --level 35 on       # 对 sshd 在级别 3 和 5 下创建启动项
# chkconfig sshd off                 # 在所有的运行级别下禁用 sshd
Debian 和基于Debian 发行版像 Ubuntu 或 Knoppix 使用命令 update-rc.d 来管理运行级别脚本。默认启动为 2,3,4 和 5,停止为 0,1 和 6。
# update-rc.d sshd defaults          # 设置 sshd 为默认启动级别
# update-rc.d sshd start 20 2 3 4 5 . stop 20 0 1 6 .  # 用显示参数
# update-rc.d -f sshd remove         # 在所有的运行级别下禁用 sshd
# shutdown -h now (或者 # poweroff)  # 关闭停止系统

FreeBSD

BSD 启动步骤不同于 SysV, 她没有运行级别。她的启动状态(单用户,有或没有 XWindow)被配置在 /etc/ttys中。所有的系统脚本都位于 /etc/rc.d/中,第三方应用程序位于 /usr/local/etc/rc.d/中。service 的启动顺序被配置在 /etc/rc.conf/etc/rc.conf.local中。默认行为可在 /etc/defaults/rc.conf 中进行配置。 这些脚本至少响应 start|stop|status.
# /etc/rc.d/sshd status
sshd is running as pid 552.
# shutdown now                       # 进入单用户模式
# exit                               # 返回到多用户模式
# shutdown -p now                    # 关闭停止系统
# shutdown -r now                    # 重新启动系统
同样可以使用进程 init 进入下列状态级别。举个例子: # init 6 为重启。

重设 root 密码

Linux 方法 1

在引导加载器(lilo 或 grub)中,键入如下启选项:
init=/bin/sh
内核会挂载 root 分区,进程 init 会启动 bourne shell 而不是 rc,然后是运行级别。使用命令 passwd 设置密码然后重启。别忘了需要在单用户模式下做这些动作。
如果重启后 root 分区被挂载为只读,重新挂在它为读写:
# mount -o remount,rw /
# passwd                             # 或者删除 root 密码 (/etc/shadow)
# sync; mount -o remount,ro /        # sync 在重新挂在为只读之前 sync 一下
# reboot

FreeBSD 和 Linux 方法 2

FreeBSD 不会让你这么做。解决方案是用其他操作系统(像系统紧急修复光盘)挂载 root 分区,然后更改密码。
# mount -o rw /dev/ad4s3a /mnt
# chroot /mnt                        # 改变程序执行时所参考的根目录位置为 /mnt
# passwd
# reboot

内核模块

Linux

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

FreeBSD

# kldstat                            # 列出所有已载入内核的模块
# kldload crypto                     # 载入 crypto 模块

编译内核

Linux

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

FreeBSD

要改变和重建内核,需要拷贝源配置文件然后编辑它。当然也可以直接编辑 GENERIC 文件。
# cd /usr/src/sys/i386/conf/
# cp GENERIC MYKERNEL
# cd /usr/src
# make buildkernel KERNCONF=MYKERNEL
# make installkernel KERNCONF=MYKERNEL
要重建完全的操作系统:
# make buildworld                    # 构建完全的系统,但不是内核
# make buildkernel                   # 使用 KERNCONF 配置文件编译内核
# make installkernel
# reboot
# mergemaster -p                     # 建立临时根环境并比对系统配置文件
# make installworld
# mergemaster                        # 升级所有配置和其他文件
# reboot
对于源的一些小改动,有时候简单的命令就足够了:
# make kernel world                  # 编译并安装内核和系统
# mergemaster
# reboot

进程

列表 | 优先级 | 后台/前台 | Top | Kill

进程列表

PID是每个进程唯一号码。使用 ps 获取所有正在运行的进程列表。
# ps -auxefw                         # 所有正在运行进程的详尽列表
然而,更典型的用法是使用管道或者 pgrep:
# ps axww | grep cron
  586  ??  Is     0:01.48 /usr/sbin/cron -s
# ps aux | grep 'ss[h]'              # Find all ssh pids without the grep pid
# pgrep -l sshd                      # 查找所有进程名中有sshd的进程ID
# echo $$                            # The PID of your shell
# fuser -va 22/tcp                   # 列出使用端口22的进程
# fuser -va /home                    # 列出访问 /home 分区的进程
# strace df                          # 跟踪系统调用和信号
# truss df                           # 同上(FreeBSD/Solaris/类Unix)
# history | tail -50                 # 显示最后50个使用过的命令

优先级

renice 更改正在运行进程的优先级。负值是更高的优先级,最小为-20,其正值与 "nice" 值的意义相同译注:进程的优先级通常被称作它的 nice 值。用户只能对自己所有的进程使用renice命令,root用户可以在任何进程上使用renice命令,只有root用户才能提高进程的优先级
# renice -5 586                      # 更强的优先级
586: old priority 0, new priority -5
使用 nice 命令启动一个已定义优先级的进程。 正值为低优先级,负值为高优先级。确定你知道 /usr/bin/nice 或者使用 shell 内置命令译注:要查看所有 shell 内置命令,可运行 # info bash builtin(# which nice)。
# nice -n -5 top                     # 更高优先级(/usr/bin/nice)
# nice -n 5 top                      # 更低优先级(/usr/bin/nice)
# nice +5 top                        # tcsh 内置 nice 命令(同上)
nice 可以影响 CPU 的调度,另一个实用命令 ionice译注:此命令仅可工作在2.6.13及以上内核版本上,并且采用了CFQ 的 IO 调度方式。通过 #cat /sys/block/[sh]d[a-z]*/queue/scheduler 命令可以得知你的系统采用了什么样的调度算法 可以调度磁盘 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 页很短并有很好的解释。
# ionice c3 -p123                    # 给 pid 123 设置为 idle 类型
# ionice -c2 -n0 firefox             # 用 best effort 类型运行 firefox 并且设为高优先级
# ionice -c3 -p$$                    # 将当前的进程(shell)的磁盘 IO 调度设置为 idle 类型
例中最后一条命令对于编译(或调试)一个大型项目会非常有用。每一个运行于此 shell 的命令都会有一个较低的优先级,但并不妨碍这个系统。$$ 是你 shell 的 pid (试试 echo $$)。

前台/后台

当一个进程在 shell 中已运行,可以使用 [Ctrl]-[Z] (^Z), bgfg 来 调入调出前后台译注:在命令后面加 & 可直接使其在后台运行。。举个例子:启动 2 个进程,调入后台。使用 jobs 列出后台列表,然后再调入一个进程到前台。
# ping cb.vu > ping.log
^Z                                   # ping 使用 [Ctrl]-[Z] 来暂停(停止) 
# bg                                 # 调入后台继续运行
# jobs -l                            # 后台进程列表
[1]  - 36232 Running                       ping cb.vu > ping.log
[2]  + 36233 Suspended (tty output)        top
# fg %2                              # 让进程 2 返回到前台运行
使用 nohup 开启一个持续运行的进程直到 shell 被关闭(避免挂断)。
# nohup ping -i 60 > ping.log &

Top

top 程序用来实时显示系统中各个进程的运行信息。
# top
top 在运行的时候,按下 h译注:也可以是 ? 键会显示帮助画面。常用键如下:

Kill命令与信号

使用 killkillall 终止或发送一个信号给进程。
# ping -i 60 cb.vu > ping.log &
[1] 4712
# kill -s TERM 4712                  # 同 kill -15 4712
# killall -1 httpd                   # 发送 HUP 信号终止进程 httpd
# pkill -9 http                      # 发送 TERM 信号终止包含 http 的进程
# pkill -TERM -u www                 # 发送 TERM 信号终止 www 所有者进程
# fuser -k -TERM -m /home            # 终止所有访问 /home 的进程(卸载该分区前)
下面是一些重要的信号:

文件系统

磁盘信息 | Boot | 磁盘使用情况 | 已打开的文件 | 挂载/重挂 | 挂载 SMB | 挂载映像文件 | Burn ISO | Create image | Memory disk | Disk performance

权限

chmodchown 更改访问权限和所有权。对于所有用户的默认掩码(umask)可以在 /etc/profile (Linux) 或 /etc/login.conf (FreeBSD) 中修改。其默认掩码(umask)通常为 022。掩码可以和777做减法,从而得到755的权限。
1 --x 执行                           # Mode 764 = 执行/读/写 | 读/写 | 读
2 -w- 写                             # |---所有者|---用户组|---其他用户|
4 r-- 读
  ugo=a                              u=所有者, g=用户组, o=其他用户, a=所有用户
# chmod [OPTION] MODE[,MODE] FILE    # MODE 可以是 [ugoa]*([-+=]([rwxXst]))
# chmod 640 /var/log/maillog         # 更改 maillog 访问权限为 -rw-r-----
# chmod u=rw,g=r,o= /var/log/maillog # 同上
# chmod -R o-r /home/*               # 递归去除所有其他用户的可读权限
# chmod u+s /path/to/prog            # 在可执行位设置 SUID (知道你在干什么!当执行一个具有 setuid 权限的文件时,文件的执行过程将具有文件所有者的特权(比如root)。所以,应尽量避免不加选择地创建和使用 root 用户拥有的 seruid 程序或 root 组拥有的 setgid 程序。)
# find / -perm -u+s -print           # 查找所有设置过 SUID 位的程序
# chown user:group /path/to/file     # 改变文件的所有者和文件关联的组
# chgrp group /path/to/file          # 改变文件关联的组
# chmod 640 `find ./ -type f -print` # Change permissions to 640 for all files
# chmod 751 `find ./ -type d -print` # Change permissions to 751 for all directories

磁盘信息

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

Boot

FreeBSD

如果新内核不能引导,要引导一个旧内核,停止启动倒计时,做如下动作:
# unload
# load kernel.old
# boot

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

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

磁盘使用情况

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

谁打开了那些文件

对于找出哪些文件阻止卸载分区并给出有代表性的错误是有帮助的:
# umount /home/
umount: unmount of /home             # 不能卸载,因为有一个文件锁定了 home
   failed: Device busy

FreeBSD 和大多数 Unix

# fstat -f /home                     # 对于一个挂载点
# fstat -p PID                       # 对于一个应用程序进程 ID
# fstat -u user                      # 对于一个用户
查找已打开日志文件(或其他已打开文件), 比如 Xorg:
# ps ax | grep Xorg | awk '{print $1}'
1252
# fstat -p 1252
USER     CMD          PID   FD MOUNT      INUM MODE         SZ|DV R/W
root     Xorg        1252 root /             2 drwxr-xr-x     512  r
root     Xorg        1252 text /usr     216016 -rws--x--x  1679848 r
root     Xorg        1252    0 /var     212042 -rw-r--r--   56987  w
在 /var 中的只有一个 inum 为 212042 的文件:
# find -x /var -inum 212042
/var/log/Xorg.0.log

Linux

使用 fuserlsof 在一个挂载点中查找已打开的文件:
# fuser -m /home                     # 列出访问 /home 的进程
# lsof /home
COMMAND   PID    USER   FD   TYPE DEVICE    SIZE     NODE NAME
tcsh    29029 eedcoba  cwd    DIR   0,18   12288  1048587 /home/eedcoba (guam:/home)
lsof    29140 eedcoba  cwd    DIR   0,18   12288  1048587 /home/eedcoba (guam:/home)
关于一个应用程序:
ps ax | grep Xorg | awk '{print $1}'
3324
# lsof -p 3324
COMMAND   PID    USER   FD   TYPE DEVICE    SIZE    NODE NAME
Xorg    3324 root    0w   REG        8,6   56296      12492 /var/log/Xorg.0.log
关于单个文件:
# lsof /var/log/Xorg.0.log
COMMAND  PID USER   FD   TYPE DEVICE  SIZE  NODE NAME
Xorg    3324 root    0w   REG    8,6 56296 12492 /var/log/Xorg.0.log

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

举个 cdrom 的例子。如果已经列于 /etc/fstab 中:
# mount /cdrom
或在 /dev/ 中查找设备,亦或使用 dmesg 命令

FreeBSD

# mount -v -t cd9660 /dev/cd0c /mnt  # cdrom
# mount_cd9660 /dev/wcd0c /cdrom     # 另外一个方法
# mount -v -t msdos /dev/fd0c /mnt   # 软驱
/etc/fstab 中的一条:
# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/acd0               /cdrom          cd9660  ro,noauto       0       0
要允许用户做这些,可以这么做:
# sysctl vfs.usermount=1  # 或者在 /etc/sysctl.conf 中插入一条 "vfs.usermount=1"

Linux

# mount -t auto /dev/cdrom /mnt/cdrom   # 典型的 cdrom 挂载命令
# mount /dev/hdc -t iso9660 -r /cdrom   # IDE
# 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* 中。
# fdisk /dev/sda                     # 查找 FreeBSD 分区
/dev/sda3   *        5357        7905    20474842+  a5  FreeBSD
# mount -t ufs -o ufstype=ufs2,ro /dev/sda3 /mnt
/dev/sda10 = /tmp; /dev/sda11 /usr   # 其他 slice

重挂载

不用卸载一个设备来重挂载。 对 fsck 来说是必须的。举个例子:
# mount -o remount,ro /              # Linux
# mount -o ro /                      # FreeBSD
从 cdrom 拷贝原始数据进一个 iso 映像文件:
# dd if=/dev/cd0c of=file.iso

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

假设你需要很多的 swap (即刻),如一个 2GB 文件 /swap2gb (只限 Linux)。
# dd if=/dev/zero of=/swap2gb bs=1024k count=2000
# mkswap /swap2gb                    # 创建交换区
# swapon /swap2gb                    # 激活这个 swap。现在可以使用了
# swapoff /swap2gb                   # 当使用完毕,释放这个 swap
# rm /swap2gb

挂载一个 SMB译注:SMB (Server Message Block,服务器信息块),又称 CIFS (Common Internet File System,通用Internet文件系统) 共享

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

Linux

# smbclient -U user -I 192.168.16.229 -L //smbshare/    # 列出共享
# mount -t smbfs -o username=winuser //smbserver/myshare /mnt/smbshare
# mount -t cifs -o username=winuser,password=winpwd //192.168.16.229/myshare /mnt/share
此外,mount.cifs 软件包可以存储认证到一个文件中。例如,/home/user/.smb:
username=winuser
password=winpwd
现在可以像下面那样挂载:
# mount -t cifs -o credentials=/home/user/.smb //192.168.16.229/myshare /mnt/smbshare

FreeBSD

使用 -I 来获取 IP (或 DNS 名);smbserver 是 Windows 名。
# smbutil view -I 192.168.16.229 //winuser@smbserver    # 列出共享
# mount_smbfs -I 192.168.16.229 //winuser@smbserver/myshare /mnt/smbshare

挂载镜像文件

Linux loop-back

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

FreeBSD

用于存储设备 (如果需要做 # kldload md.ko 动作):
# mdconfig -a -t vnode -f file.iso -u 0
# mount -t cd9660 /dev/md0 /mnt
# umount /mnt; mdconfig -d -u 0                         # 清除 md 设备
用于虚拟节点:
# vnconfig /dev/vn0c file.iso; mount -t cd9660 /dev/vn0c /mnt
# umount /mnt; vnconfig -u /dev/vn0c                    # 清除 vn 设备

Solaris and FreeBSD

用于 loop-back 文件接口或 lofi:
# lofiadm -a file.iso
# mount -F hsfs -o ro /dev/lofi/1 /mnt
# umount /mnt; lofiadm -d /dev/lofi/1                   # 清除 lofi 设备

创建并刻录 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 中找到。

刻录 ISO 镜像文件

FreeBSD

FreeBSD 默认情况下没有在 ATAPI 驱动上启用 DMA。DMA 可用 sysctl 命令启用,其参数如下,或者在 /boot/loader.conf 中添加如下条目:
hw.ata.ata_dma="1"
hw.ata.atapi_dma="1"
burncd 用于 ATAPI 驱动(burncd 为基本系统的一部分),cdrecord (在 sysutils/cdrtools 中)用于 SCSI 驱动。
# burncd -f /dev/acd0 data imagefile.iso fixate      # ATAPI 驱动
# cdrecord -scanbus                  # 查找 burner 设备描述符(如 1,0,0)
# cdrecord dev=1,0,0 imagefile.iso

Linux

对于 Linux,同样使用 cdrecord 如上文所述。此外,它还可以使用本地 ATAPI 接口查找设备描述符:
# cdrecord dev=ATAPI -scanbus
然后同上面一样烧录 CD/DVD。

dvd+rw-tools

dvd+rw-toolshttp://fy.chalmers.se/~appro/linux/DVD+RW/ 工具包(FreeBSD: ports/sysutils/dvd+rw-tools)可以做上面的一切,其还包括 growisofs 工具来刻录 CD 或 DVD。本实例所引用的 DVD 设备 /dev/dvd 可能是指向 /dev/scd0 (Linux)的符号连接,或者 /dev/cd0 (FreeBSD),或者 /dev/rcd0c (NetBSD/OpenBSD),或者 /dev/rdsk/c0t1d0s2 (Solaris)。对于本实例 FreeBSD 手册 18.7 章http://www.freebsd.org/handbook/creating-dvds.html 上有一份很好的文档。
          # -dvd-compat 选项将完结光盘,光盘便不可再附加数据
# growisofs -dvd-compat -Z /dev/dvd=imagefile.iso     # 刻录已存在的 iso 镜像文件
# growisofs -dvd-compat -Z /dev/dvd -J -R /p/to/data  # 直接刻录

转换 Nero .nrg 文件成 .iso

Nero 简单的添加了 300KB 的头到一个常规的 iso 镜像文件中。我们可用 dd 工具来去除它。
# dd bs=1k if=imagefile.nrg of=imagefile.iso skip=300

转换 bin/cue 镜像成 .iso

bchunk 程序http://freshmeat.net/projects/bchunk/可以做到这一点。在 FreeBSD 中,它在 port 的 sysutils/bchunk 中。
# bchunk imagefile.bin imagefile.cue imagefile.iso

创建基于文件的镜像文件

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

FreeBSD

# dd if=/dev/random of=/usr/vdisk.img bs=1K count=1M
# mdconfig -a -t vnode -f /usr/vdisk.img -u 0         # 创建设备 /dev/md1
# bsdlabel -w /dev/md0
# newfs /dev/md0c
# mount /dev/md0c /mnt
# umount /mnt; mdconfig -d -u 0; rm /usr/vdisk.img    # 清除 md 设备
这个基于文件的镜像文件可以在 /etc/rc.conf 和 /etc/fstab 中配置成启动期间自动挂载。可用 # /etc/rc.d/mdconfig start (先用 # mdconfig -d -u 0 命令删除 md0 设备) 测试你的设置。
需要注意的是,那个自动设置仅工作于这个基于文件的镜像文件不在 root 分区中。原因是 /etc/rc.d/mdconfig 脚本早于启动就执行了,并且 root 分区仍然是只读的。脚本 /etc/rc.d/mdconfig2 之后,镜像文件将位于 root 分区外挂载。
/boot/loader.conf:
md_load="YES"
/etc/rc.conf:
# mdconfig_md0="-t vnode -f /usr/vdisk.img"          # /usr 不在 root 分区中
/etc/fstab: (行后的两个 0 0 很重要,它告诉 fsck 忽略这个设备,现在还不存在。)
/dev/md0                /usr/vdisk      ufs     rw              0       0
也可能在增加镜像文件的大小之后,如增大到 300MB。
# umount /mnt; mdconfig -d -u 0
# dd if=/dev/zero bs=1m count=300 >> /usr/vdisk.img
# mdconfig -a -t vnode -f /usr/vdisk.img -u 0
# growfs /dev/md0
# mount /dev/md0c /mnt                                # 文件分区现在为 300MB

Linux

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

Linux with losetup

/dev/zerourandom 更快,但对于加密来说却不够安全。
# dd if=/dev/urandom of=/usr/vdisk.img bs=1024k count=1024
# losetup /dev/loop0 /usr/vdisk.img                   # 创建并联结 /dev/loop0
# mkfs.ext3 /dev/loop0
# mount /dev/loop0 /mnt
# losetup -a                                          # 查看已经挂载的 loop 设备
# umount /mnt
# losetup -d /dev/loop0                               # Detach
# rm /usr/vdisk.img

创建基于内存的文件系统

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

FreeBSD

# mount_mfs -o rw -s 64M md /memdisk
# umount /memdisk; mdconfig -d -u 0                   # 清除该 md 设备
md     /memdisk     mfs     rw,-s64M    0   0         # /etc/fstab 条目

Linux

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

磁盘性能

在 ad4s3c (/home) 分区上读写一个 1GB 的文件。
# time dd if=/dev/ad4s3c of=/dev/null bs=1024k count=1000
# time dd if=/dev/zero bs=1024k count=1000 of=/home/1Gb.file
# hdparm -tT /dev/hda      # 仅限 Linux

网络

路由 | 额外 IP | 更改 MAC 地址 | 端口 | 防火墙 | IP 转发 | NAT | DNS | DHCP | 通信量 | QoS | NIS

调试 (也可看流量分析)

Linux

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

其他系统

# ifconfig fxp0             # 查看 "media" 字段(FreeBSD)
# arp -a                    # 查看路由(或主机) ARP 条目(所有系统)
# ping cb.vu                # 第一个要试的事情...
# traceroute cb.vu          # 列印到目的地的路由路径
# ifconfig fxp0 media 100baseTX mediaopt full-duplex # 100兆/秒 全双工(FreeBSD)
# netstat -s                # 对每个网络协议做系统级分析
另一些命令,虽然不总是默认安装,但很好找:
# arping 192.168.16.254     # 在网络层上 Ping
# tcptraceroute -f 5 cb.vu  # 使用 tcp 替换 icmp 来跟踪,透过防火墙

路由

列印路由表

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

添加删除路由

FreeBSD

# route add 212.117.0.0/16 192.168.1.1
# route delete 212.117.0.0/16
# route add default 192.168.1.1
永久的添加路由可在 /etc/rc.conf 配置文件中设置
static_routes="myroute"
route_myroute="-net 212.117.0.0/16 192.168.1.1"

Linux

# route add -net 192.168.20.0 netmask 255.255.255.0 gw 192.168.16.254
# ip route add 192.168.20.0/24 via 192.168.16.254       # 等同于上面命令
# route add -net 192.168.20.0 netmask 255.255.255.0 dev eth0
# route add default gw 192.168.51.254
# ip route add default via 192.168.51.254 dev eth0      # 等同于上面命令
# route delete -net 192.168.20.0 netmask 255.255.255.0

Solaris

# route add -net 192.168.20.0 -netmask 255.255.255.0 192.168.16.254
# route add default 192.168.51.254 1                    # 1 = 通过此路由跳译注:数据包生存周期依赖于 IP 头中的生存周期(Time-to-Live,简称 TTL)。根据 RFC 的定义,这个域值由每个路由器来减少。接收到包的每台路由器根据路由该包所花费的秒数,将包中的这个域值减去相应的时间,或直接减 1。因为目前路由器转发包的时间基本小于 1 秒,这个域值基本上在源和目的地之间的没一跳便会减 1。数减 1
# route change default 192.168.50.254 1
永久条目配置在 /etc/defaultrouter 中。

Windows

# Route add 192.168.50.0 mask 255.255.255.0 192.168.51.253
# Route add 0.0.0.0 mask 0.0.0.0 192.168.51.254
使用 add -p 来是路由设置永久有效。

配置额外的 IP 地址

Linux

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

FreeBSD

# ifconfig fxp0 inet 192.168.50.254/24                     # 第一个 IP
# ifconfig fxp0 alias 192.168.51.254 netmask 255.255.255.0 # 第二个 IP
永久条目设置在 /etc/rc.conf 中
ifconfig_fxp0="inet 192.168.50.254  netmask 255.255.255.0"
ifconfig_fxp0_alias0="192.168.51.254 netmask 255.255.255.0"

Solaris

ifconfig -a 命令检查设置
# ifconfig hme0 plumb                                      # 启用网卡
# ifconfig hme0 192.168.50.254 netmask 255.255.255.0 up    # 第一个 IP
# ifconfig hme0:1 192.168.51.254 netmask 255.255.255.0 up  # 第二个 IP

更改 MAC 地址

通常在你更改之前先停下网络接口。不要告诉我为什么你想改变 MAC 地址......
# ifconfig eth0 down
# ifconfig eth0 hw ether 00:01:02:03:04:05      # Linux
# ifconfig fxp0 link 00:01:02:03:04:05          # FreeBSD
# ifconfig hme0 ether 00:01:02:03:04:05         # Solaris
# sudo ifconfig en0 ether 00:01:02:03:04:05     # Mac OS X Tiger
# sudo ifconfig en0 lladdr 00:01:02:03:04:05    # Mac OS X Leopard
对于 Windows 已经有许多工具了。像 etherchangehttp://ntsecurity.nu/toolbox/etherchange。或者看看 "Mac Makeup", "smac"。

使用中的端口

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

防火墙

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

Linux

# iptables -L -n -v                  # 状态信息
Open the iptables firewall
# iptables -P INPUT       ACCEPT     # 打开所有
# iptables -P FORWARD     ACCEPT
# iptables -P OUTPUT      ACCEPT
# iptables -Z                        # 把所有链的包及字节的计数器清空
# iptables -F                        # 清空所有链
# iptables -X                        # 删除所有链译注:链必须没有被引用

FreeBSD

# ipfw show                          # 状态信息
# ipfw list 65535 # 如果显示 "65535 deny ip from any to any",那防火墙已被禁用
# sysctl net.inet.ip.fw.enable=0     # 禁用
# sysctl net.inet.ip.fw.enable=1     # 启用

路由 IP 转发

Linux

查看然后启用 IP 转发:
# cat /proc/sys/net/ipv4/ip_forward     # 查看 IP 转发 0=禁用, 1=启用
# echo 1 > /proc/sys/net/ipv4/ip_forward
或者编辑 /etc/sysctl.conf:
net.ipv4.ip_forward = 1

FreeBSD

查看并启用:
# sysctl net.inet.ip.forwarding          # 查看 IP 转发 0=禁用, 1=启用
# sysctl net.inet.ip.forwarding=1
# sysctl net.inet.ip.fastforwarding=1	 # 专用路由器或防火墙
Permanent with entry in /etc/rc.conf:
gateway_enable="YES"                     # 如果主机是网关则设置为 YES。

Solaris

# ndd -set /dev/ip ip_forwarding 1       # 查看 IP 转发 0=禁用, 1=启用

NAT - 网络地址转换

Linux

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE	# 激活 NAT
# iptables -t nat -A PREROUTING -p tcp -d 78.31.70.238 --dport 20022 -j DNAT \
--to 192.168.16.44:22           # 转发端口 20022 到内部 IP 端口(ssh)
# iptables -t nat -A PREROUTING -p tcp -d 78.31.70.238 --dport 993:995 -j DNAT \
--to 192.168.16.254:993:995     # 转发 993-995 范围端口
# ip route flush cache
# iptables -L -t nat            # 查看 NAT 状态信息
使用 -D 替换 -A 来删除端口转发。

FreeBSD

# natd -s -m -u -dynamic -f /etc/natd.conf -n fxp0
Or edit /etc/rc.conf with:
firewall_enable="YES"           # 设置 YES 来启用防火墙功能
firewall_type="open"            # 防火墙类型(看 /etc/rc.firewall)
natd_enable="YES"               # 启用 natd (如果 firewall_enable == YES)。
natd_interface="tun0"           # 公共的网络接口或要使用的 IP 地址。
natd_flags="-s -m -u -dynamic -f /etc/natd.conf"
端口转发:
# cat /etc/natd.conf 
same_ports yes
use_sockets yes
unregistered_only
# redirect_port tcp insideIP:2300-2399 3300-3399  # 端口范围
redirect_port udp 192.168.51.103:7777 7777

DNS

在 unix 上,对于所有的网络接口的 DNS 条目都存储在 /etc/resolv.conf 文件中。主机域也储存在这个文件中。最小化配置如下:
nameserver 78.31.70.238
search sleepyowl.net intern.lab
domain sleepyowl.net
检查系统域名:
# hostname -d                        # 等同于 dnsdomainname

Windows

在 Windows 上,DNS 配置于每个网络接口。要显示配置的 DNS 和清空 DNS 缓存可是使用:
# ipconfig /?                        # 显示帮助
# ipconfig /all                      # 显示所有信息包括 DNS
# ipconfig /flushdns                 # 清除 DNS 缓存

转发查询

Dig 是你测试 DNS 设置的好朋友。举个例子,用于测试的 DNS 服务器为 213.133.105.2 ns.second-ns.de。查看哪个服务器客户端接收应答(简单应答).
# dig sleepyowl.net
sleepyowl.net.          600     IN      A       78.31.70.238
;; SERVER: 192.168.51.254#53(192.168.51.254)
路由器 192.168.51.254 应答了,并返回了一条 A 条目(记录)。任何条目都可查询,DNS 服务器可用 @ 来选定:
# dig MX google.com
# dig @127.0.0.1 NS sun.com          # 测试本地服务器
# dig @204.97.212.10 NS MX heise.de  # 查询外部
# dig AXFR @ns1.xname.org cb.vu      # 查看区传送(zone transfer)
程式 host 也很强大。
# host -t MX cb.vu                   # 获取邮件 MX 记录
# host -t NS -T sun.com              # 通过 TCP 连接获取 NS 记录
# host -a sleepyowl.net              # 获取所有

反向查询

查找属于一个 IP 地址(in-addr.arpa.)的域名。可用 dig, hostnslookup 命令查询:
# dig -x 78.31.70.238
# host 78.31.70.238
# 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 名称解析。这个文件同样存在于 Windows 上,通常在:
C:\WINDOWS\SYSTEM32\DRIVERS\ETC

DHCP

Linux

一些发行版(SuSE)使用 dhcpcd 作为客户端。默认网络接口是 eth0。
# dhcpcd -n eth0           # 触发更新(并不总是可以工作)
# dhcpcd -k eth0           # 释放并关闭
租约(lease)的全部信息存储在:
/var/lib/dhcpcd/dhcpcd-eth0.info

FreeBSD

FreeBSD (和 Debian) 使用 dhclient。要配置一个网络接口(如:bge0)运行:
# dhclient bge0
租约(lease)的全部信息存储在:
/var/db/dhclient.leases.bge0
使用
/etc/dhclient.conf
设置 prepend 选项或强制不同的选项:
# cat /etc/dhclient.conf
interface "rl0" {
    prepend domain-name-servers 127.0.0.1;
    default domain-name "sleepyowl.net";
    supersede domain-name "sleepyowl.net";
}

Windows

dhcp 租约(lease)使用 ipconfig 来更新:
# ipconfig /renew          # 更新所有适配器
# ipconfig /renew LAN      # 更新名叫 "LAN" 的适配器
# ipconfig /release WLAN   # 释放名叫 "WLAN" 的适配器
是的,这是一个使用简单名称重新命名你的适配器的好主意!

通信量分析(Traffic analysis)

Bmonhttp://people.suug.ch/~tgr/bmon/ 是一个小的流量监控控制台,而且可以显示不同的网络接口的流量。

用 tcpdump 嗅探(sniff)

# tcpdump -nl -i bge0 not port ssh and src \(192.168.16.121 or 192.168.16.54\)
# tcpdump -l > dump && tail -f dump               # 缓冲输出
# tcpdump -i rl0 -w traffic.rl0                   # 把数据报文写入二进制文件
# tcpdump -r traffic.rl0                          # 从文件读取数据报文(也可以使用 ethereal)
# tcpdump port 80                                 # 两个经典命令
# tcpdump host google.com
# tcpdump -i eth0 -X port \(110 or 143\)          # 查看端口 110(POP) 或 143(IMAP)的数据报文
# tcpdump -n -i eth0 icmp                         # 只捕获 ping
# tcpdump -i eth0 -s 0 -A port 80 | grep GET      # -s 0 为全部包, -A 为 ASCII
另一些重要选项: 对于 Windows 可以使用 www.winpcap.org。使用 windump -D 来列出网络接口。

用 nmap 扫描

Nmaphttp://insecure.org/nmap/ 是一个用于 OS 探测的端口扫描工具,她通常在许多发行版上有安装,并且同样可用于 Windows。如果你不扫描你的服务器,骇客们会为你做这些...
# nmap cb.vu               # 扫描主机上所有保留的 TCP 端口
# nmap -sP 192.168.16.0/24 # 找出在 0/24 上主机所使用的 IP译注:通过使用 "-sP" 参数,进行 ping 扫描。缺省情况下,Nmap给每个扫描到的主机发送一个 ICMP echo 和一个 TCP ACK,主机对任何一种的响应都会被Nmap得到。
# nmap -sS -sV -O cb.vu    # 做秘密 SYN 扫描来探测系统和系统服务的版本信息
PORT      STATE  SERVICE             VERSION
22/tcp    open   ssh                 OpenSSH 3.8.1p1 FreeBSD-20060930 (protocol 2.0)
25/tcp    open   smtp                Sendmail smtpd 8.13.6/8.13.6
80/tcp    open   http                Apache httpd 2.0.59 ((FreeBSD) DAV/2 PHP/4.
[...]
Running: FreeBSD 5.X
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%。

Linux

给 512K 上传速度的 modem。
# tc qdisc add dev eth0 root tbf rate 480kbit latency 50ms burst 1540
# tc -s qdisc ls dev eth0                         # 状态
# tc qdisc del dev eth0 root                      # 删除队列
# tc qdisc change dev eth0 root tbf rate 220kbit latency 50ms burst 1540

FreeBSD

FreeBSD 使用 dummynet 来控制带宽,其配置工具为 ipfw。Pipe 用来设置限制带宽的单位[K|M]{比特/秒|字节/秒},0 意味着没有限制。使用同样的 pipe 数字可重新配置它。举个例子,限制上传带宽为 500K。
# kldload dummynet                                # 如有必要加载这个模块
# ipfw pipe 1 config bw 500Kbit/s                 # 创建一个带宽限制的 pipe
# ipfw add pipe 1 ip from me to any               # 转移所有上传进入这个 pipe

服务质量 (Quality of service)

Linux

使用 tc 的优先级队列来优化 VoIP。在 voip-info.orgwww.howtoforge.com 上可以看到完整的例子。假设 VoIP 使用 UDP 端口 10000:11024 并且使用 eth0 设备(也可为 ppp0 或 so)。下列命令定义了三个队列,并且用 QoS 0x1e(设置所有位) 强制 VOIP 流量到队列 1。默认流量流入队列 3,Qos Minimize-Delay 流入队列 2。
# 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
# tc qdisc add dev eth0 parent 1:1 handle 10: sfq
# tc qdisc add dev eth0 parent 1:2 handle 20: sfq
# tc qdisc add dev eth0 parent 1:3 handle 30: sfq
# tc filter add dev eth0 protocol ip parent 1: prio 1 u32 \
  match ip dport 10000 0x3C00 flowid 1:1          # 使用服务端端口范围
  match ip dst 123.23.0.1 flowid 1:1              # 或/和使用服务器 IP
状态和移除:
# tc -s qdisc ls dev eth0                         # queue status
# tc qdisc del dev eth0 root                      # delete all QoS

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

用你所计算的端口掩码来定义 tc 过滤器的端口范围。查询 2^N 端口范围结尾,推断范围并转换成十六进制。这就是你的掩码 (mask)。例如 10000 -> 11024,它的范围是 1024。
# 2^13 (8192) < 10000 < 2^14 (16384)              # 结尾是 2^14 = 16384
# echo "obase=16;(2^14)-1024" | bc                # 掩码是 0x3C00

FreeBSD

假设最大连接带宽为 500Kbit/s,我们使用优先级 100:10:1 定义 3 个队列给 VoIP:ssh:剩余所有。
# ipfw pipe 1 config bw 500Kbit/s 
# ipfw queue 1 config pipe 1 weight 100
# ipfw queue 2 config pipe 1 weight 10
# ipfw queue 3 config pipe 1 weight 1
# ipfw add 10 queue 1 proto udp dst-port 10000-11024
# ipfw add 11 queue 1 proto udp dst-ip 123.23.0.1 # 或/和使用服务器 IP
# ipfw add 20 queue 2 dsp-port ssh
# ipfw add 30 queue 3 from me to any              # 剩余所有
状态和移除:
# ipfw list                                       # 规则信息
# ipfw pipe list                                  # 管道信息
# ipfw flush                                      # 删除除默认外所有规则

NIS 调试

一些可工作在已配置好的 NIS 客户端上的命令:
# ypwhich                  # 获取提供 NIS 服务的服务器名
# domainname               # 已配置的 NIS 域名
# ypcat group              # 列印 NIS 映射 group
# cd /var/yp && make       # 重建 yp 数据库
ypbind 正在运行吗?
# ps auxww | grep ypbind
/usr/sbin/ypbind -s -m -S servername1,servername2	# FreeBSD
/usr/sbin/ypbind           # Linux
# yppoll passwd.byname
Map passwd.byname has order number 1190635041. Mon Sep 24 13:57:21 2007
The master server is servername.domain.net.

Linux

# cat /etc/yp.conf
ypserver servername
domain domain.net broadcast

SSH SCP

公钥认证 | 指纹 | SCP | 隧道(Tunneling)

Public key authentication

使用公钥认证而不是密码连接主机。方法是附加你的公钥文件到远程主机。本例中我们用客户端产生的 key host-client 连接到 host-server
# ssh-keygen -t dsa -N ''
# cat ~/.ssh/id_dsa.pub | ssh you@host-server "cat - >> ~/.ssh/authorized_keys2"

使用来自 ssh.com 的 Windows 客户端

ssh.com 的非商业性版本的客户端可下载自它主 FTP 站点:ftp.ssh.com/pub/ssh/。 用 ssh.com 客户端产生的密钥需要在 OpenSSH 服务器上进行转换。可以使用 ssh-keygen 命令来完成。 注意: 我们使用 DSA 密钥,使用 RSA 密钥也是可以的。这个密钥不受密码保护。

在 Windows 上使用 Putty

Puttyhttp://www.chiark.greenend.org.uk/~sgtatham/putty/download.html 是一个简单并且自由的(MIT许可)译注:free 不单单是免费 ssh Windows 客户端。

检查指纹

在首次连接时,SSH 会请求保存不知道的主机指纹。要避免中间人(man-in-the-middle)攻击,服务器的管理员可以发送密钥指纹给客户端,来让其在首次登陆时验证服务器的真实性。使用 ssh-keygen -l 获取服务器的指纹:
# ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub      # RSA 密钥
2048 61:33:be:9b:ae:6c:36:31:fd:83:98:b7:99:2d:9f:cd /etc/ssh/ssh_host_rsa_key.pub
# ssh-keygen -l -f /etc/ssh/ssh_host_dsa_key.pub      # DSA 密钥(默认)
2048 14:4a:aa:d9:73:25:46:6d:0a:48:35:c7:f4:16:d4:ee /etc/ssh/ssh_host_dsa_key.pub
现在客户端在连接到服务器时可验证其服务器的真实性:
# ssh linda
The authenticity of host 'linda (192.168.16.54)' can't be established.
DSA key fingerprint is 14:4a:aa:d9:73:25:46:6d:0a:48:35:c7:f4:16:d4:ee.
Are you sure you want to continue connecting (yes/no)? yes

安全文件传输

一些简单的命令:
# scp file.txt host-two:/tmp
# scp joe@host-two:/www/*.html /www/tmp
# scp -r joe@host-two:/www /www/tmp
在 Konqueror 或 Midnight 控制台中,用地址 fish://user@gate 来访问远程文件系统是可行的,就是比较慢而已。
此外,也可以用基于 SCP 文件系统客户端的 sshfs 来挂载一个远程目录。看 fuse sshfshttp://fuse.sourceforge.net/sshfs.html.

隧道(Tunneling)

SSH 隧道可以让你通过 SSH 连接进行端口转发(转发/反向隧道),从而确保了传输及端口访问的安全。它只能工作在 TCP 协议上。通常端口转发命令如下(也可看 ssh 和 NAT 实例):
# ssh -L localport:desthost:destport user@gate  # gate 为目标主机网关
# ssh -R destport:desthost:localport user@gate  # 转发你的 localport 到目标端口
# ssh -X user@gate   # 转发 X 程序
这将会连接到 gate 并转发端口到目标主机 desthost:destport。注意 desthost 为 gate 中的目标主机名。因此,如果连接到了 gate,那么 desthost 就是 localhost。也可以做更多的端口转发。

在 gate 上直接转发

假设我们想访问在 gate 上运行的 CVS(2401端口) 和 HTTP(80端口)。下面是个简单的例子,desthost 就是 localhost,我们使用本的端口 8080 代替 80 端口,所以我们不需要 root