[转帖]Linux操作(一)_VMware, Unix及操作系统讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  VMware, Unix及操作系统讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 4193 | 回复: 0   主题: [转帖]Linux操作(一)        下一篇 
yun
注册用户
等级:少校
经验:1082
发帖:83
精华:4
注册:2012-12-17
状态:离线
发送短消息息给yun 加好友    发送短消息息给yun 发消息
发表于: IP:您无权察看 2012-12-24 9:32:12 | [全部帖] [楼主帖] 楼主

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

# 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 # 关于已安装硬件的信息
# 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)
# 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 # 列出目前与过去登入系统的用户相关信息
# 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章

 Solaris



/etc/system中的下列设置,会提高每个进程可以打开最大文件描述符的数量:

set rlim_fd_max = 4096 # 一个进程可以打开文件描述符的"硬"限制
set rlim_fd_cur = 1024 # 一个进程可以打开文件描述符的"软"限制

运行级别

Linux


一旦内核加载完成,内核会启动
init 进程,然后运行
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

运行级别列表如下:

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

  • 0 停止系统并关闭电源 (信号 USR2)
  • 1 进入单用户模式 (信号 TERM)
  • 6 重新启动 (信号 INT)
  • c 阻止进一步登录 (信号 TSTP)
  • q 重新检查 ttys(5) 文件 (信号 HUP)

重设 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 分区,然后更改密码。
  • 用 live cd 或安装盘启动进入修复模式后,会得到一个 shell。
  • 用 fdisk 查找 root 分区。比如:fdisk /dev/sda
  • 挂载它并使用 chroot 命令:

# 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



进程


进程列表

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" 值的意义相同。

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

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

 # which nice)。

# nice -n -5 top # 更高优先级(/usr/bin/nice)
# nice -n 5 top # 更低优先级(/usr/bin/nice)
# 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 页很短并有很好的解释。

# 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),


bg 和
fg 来 调入调出前后台。举个例子:启动 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键会显示帮助画面。常用键如下:

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

Kill命令与信号

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

# 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 的进程(卸载该分区前)

下面是一些重要的信号:

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


文件系统


权限


chmod 和
chown更改访问权限和所有权。对于所有用户的默认掩码(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 (知道你在干什么!)
# 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 # 显示磁盘检测信息

BootFreeBSD


如果新内核不能引导,要引导一个旧内核,停止启动倒计时,做如下动作:

# 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


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

# 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 共享

假设我们要访问计算机 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-tools 工具包(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 章上有一份很好的文档。

# -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 程序可以做到这一点。在 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/zero 比
urandom更快,但对于加密来说却不够安全。

# 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



网络


调试 (也可看流量分析)

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 = 通过此路由跳数减 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 已经有许多工具了。像
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,


host 和
nslookup命令查询:

# 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

DHCPLinux


一些发行版(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)

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

另一些重要选项:

  • -A 显示每个包清晰文本(除了报头)
  • -X 显示包的 ASCII 文本
  • -l 使标准输出变为缓冲行形式
  • -D 显示所有可用网络接口
对于 Windows 可以使用
www.winpcap.org。使用 windump -D 来列出网络接口。

用 nmap 扫描


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

# nmap cb.vu # 扫描主机上所有保留的 TCP 端口
# nmap -sP 192.168.16.0/24 # 找出在 0/24 上主机所使用的 IP
# 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.org
www.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 生成密钥对。私钥放在 ~/.ssh/id_dsa,公钥在 ~/.ssh/id_dsa.pub。
  • 拷贝你的公钥到服务器的 ~/.ssh/authorized_keys2。

# 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 命令来完成。
  • 使用 ssh.com 客户端创建一对密钥:Settings - User Authentication - Generate New....
  • 我使用 DSA 密钥类型;密钥长度为 2048。
  • 拷贝 ssh.com 客户端产生的公钥到服务器的 ~/.ssh 目录。
  • 她的密钥对在 C:\Documents and Settings\%USERNAME%\Application Data\SSH\UserKeys。
  • 在服务器上使用 ssh-keygen 转换公钥:

    # cd ~/.ssh
    # ssh-keygen -i -f keyfilename.pub >> authorized_keys2

注意:

我们使用 DSA 密钥,使用 RSA 密钥也是可以的。这个密钥不受密码保护。

在 Windows 上使用 Putty


Putty是一个简单并且自由的(MIT许可) ssh Windows 客户端。
  • 使用 puTTYgen 程序创建密钥对。
  • 保存密钥对(比如:C:\Documents and Settings\%USERNAME%\.ssh).
  • 拷贝公钥到服务器的 ~/.ssh 目录:

    # scp .ssh/puttykey.pub root@192.168.51.254:.ssh/

  • 使用 ssh-keygen 在 OpenSSH 服务器上转换这个公钥:

    # cd ~/.ssh
    # ssh-keygen -i -f puttykey.pub >> authorized_keys2

  • 在 Putty 中设置指向私钥的位置:Connection - SSH - Auth

检查指纹

在首次连接时,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 sshfs.

隧道(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 权限。一旦 ssh session 打开,二个服务就都可在本地端口访问。

# ssh -L 2401:localhost:2401 -L 8080:localhost:80 user@gate

转发 Netbios 和远程桌面到第二个服务器


假设有一台在 gate 后面没有运行 ssh 的 Winodws SMB 服务器。我们需要访问 SMB 共享和远程桌面。

# ssh -L 139:smbserver:139 -L 3388:smbserver:3389 user@gate

现在这个 SMB 共享可以使用 \\127.0.0.1\ 访问,但只能在本地共享关闭的情况下,因为
本的共享也是在 139 端口监听的



保持本的共享也是可行的,因此我们需要为这个通道使用新 IP 地址来新建一个虚拟设备,SMB 共享将会使用此地址连接。此外,

本地 RDP 已经在 3389 端口监听了,所以我们选择端口 3388。对于这个例子,让我们使用一个虚拟 IP 地址 10.1.1.1。

  • 对于 Putty 上使用源端口=10.1.1.1:139。它可以创建多重回路(multiple loop)设备和通道。在 Windows 2000 上,只有 Putty 为我工作。
  • 对于 ssh.com 的客户端,要禁用 "Allow local connections only"。因为 ssh.com 客户端绑定了所有地址,所以只能连接单个共享。
现在用 IP 地址 10.1.1.1 创建回路(loopback)接口:
  • # 系统->控制面板->添加硬件 # 是,我已经连接了此硬件(Y) # 添加新的硬件设备(在列表最下面)。
  • # 安装我手动选择的硬件 # 网络适配器 # Microsoft , Microsoft Loopback Adapter。
  • 配置这个假设备的 IP 地址为 10.1.1.1,掩码 255.255.255.0,没有网关。
  • 高级->WINS,开启 LMHOSTS 查询;禁用 TCP/IP 上的 NetBIOS。
  • # 启用 Microsoft 网络客户端。# 禁用 Microsoft 网络文件和打印机共享
做完这些之后我有重启。现在用 \\10.1.1.1 连接 SMB 共享和用 10.1.1.1:3388 连接远程桌面。

调试


如果不能工作:
  • 端口有没有转发:运行控制台运行 netstat -an 命令并查看有没有 0.0.0.0:139 或者 10.1.1.1:139
  • 有没有 telnet 到 10.1.1.1 139?
  • 你需要打开 "本地端口接受其他主机连接"。
  • "Microsoft 网络文件和打印机共享" 有没有被禁用?

在 NAT 后面连接两个客户端


假设两个客户端在一个 NAT 网关后面,cliadmin 客户端要连接到 cliuser 客户端(目的地),两者都可用 ssh 登录到正在运行 sshd 的 gate 上。你不需要 root 权限,只要端口大于 1024 即可。我们在 gate 上使用 2022 端口。而且,由于 gate 使用与本地,所以网关端口不是必须的。

开启 cliuser 客户端(从目标到 gate):

# ssh -R 2022:localhost:22 user@gate # 转发客户端 22 端口到 gate:2022 端口

开启 cliadmin 客户端(从主机到 gate):

# ssh -L 3022:localhost:2022 admin@gate # 转发客户端 3022 端口到 gate:2022 端口

现在 admin 可以直接连接 cliuser 客户端:

# ssh -p 3022 admin@localhost # local:3022 -> gate:2022 -> client:22

在 NAT 后面的 VNC 连接


假设一个在 NAT 后面,监听在端口 5900 上可被访问的 Windows VNC 客户端。

开启 cliwin 客户端到 gate:

# ssh -R 15900:localhost:5900 user@gate

开启 cliadmin 客户端(从主机到 gate):

# ssh -L 5900:localhost:15900 admin@gate

现在 admin 直接连接到 VNC 客户端:

# vncconnect -display :0 localhost



使用 SSH 建立 VPN

自 4.3 版开始,OpenSSH 可以使用 tun/tap 设备来加密一个隧道。其非常类似于基于 TLS 的 VPN 解决方案(像 OpenVPN)。对于 SSH 的一个优势是,她不需要安装和配置额外的软件。另外隧道使用 SSH 认证(像共享密钥)。 其缺点是,对于一个缓慢的连接, 其传输效率较低。并且这个隧道依赖于单个(易断的) TCP 链接。这个技术对于快速设置一个基于 IP 的 VPN 来说非常有用。她对于用单个 TCP 端口转发没有限制,并且在所有 3/4 层 协议像 ICMP、TCP/UDP 等上都可用。不管怎么样,下面这些选择在 sshd_conf 文件中是必须的:

PermitRootLogin yes
PermitTunnel yes

单个 P2P 连接

这里,我们用点对点隧道连接 hclient 和 hserver 两个主机。这个连接是
从 hclient 开始到 hserver 的,并且是用 root 来做。这个通道的连接点是 10.0.1.1(服务端)和 10.0.1.2(客户端),然后我们创建设备 tun5(当然也可以是其它数字)。这个过程非常简单:
  • 使用 SSH 的通道选项 -w 来连接
  • 设置隧道的 IP 地址。服务端和客户端各一次。

连接到服务端


连接始于客户端,然后再服务端执行命令。

Linux上的服务端


cli># ssh -w5:5 root@hserver
srv># ifconfig tun5 10.0.1.1 netmask 255.255.255.252 # 在服务端 shell 上执行

FreeBSD上的服务端


cli># ssh -w5:5 root@hserver
srv># ifconfig tun5 10.0.1.1 10.0.1.2 # 在服务端 shell 上执行

连接到客户端


在客户端上执行命令:

cli># ifconfig tun5 10.0.1.2 netmask 255.255.255.252 # Linux上的客户端
cli># ifconfig tun5 10.0.1.2 10.0.1.1 # FreeBSD上的客户端

现在两个主机都连上了,并且可以在任何 3/4 层协议上使用此通道 IP 地址透明的通讯。

连接两个网络

除上面的 p2p 设置外,一个更有用的是SSH VPN 用两个 gate 连接两个私有网络。假设有这样一个例子,netA 为 192.168.51.0/24 还有 netB 为 192.168.16.0/24。设置过程同上面相似,我们只需要添加 routing。如果 gate 不同于默认网关,那在私有网络接口上必须开启 NAT。

192.168.51.0/24 (netA)|gateA <-> gateB|192.168.16.0/24 (netB)

  • 使用隧道选项 -w 连接 SSH。
  • 配置隧道的 IP 地址。服务端和客户端各一次。
  • 为两个网络添加 routing。
  • 如果需要,在 gate 的私有网络接口上开启 NAT。
设置是
从 netA 中的 gasteA 开始的.

连接 gateA 到 gateB


连接从 gateA 开始,命令执行于 gateB。

Linux 上的 gateB


gateA># ssh -w5:5 root@gateB
gateB># ifconfig tun5 10.0.1.1 netmask 255.255.255.252 # 在 gateB 的 shell 中执行
gateB># route add -net 192.168.51.0 netmask 255.255.255.0 dev tun5
gateB># echo 1 > /proc/sys/net/ipv4/ip_forward # 如果不是默认网关
gateB># iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

FreeBSD 上的 gateB


gateA># ssh -w5:5 root@gateB # 创建 tun5 设备
gateB># ifconfig tun5 10.0.1.1 10.0.1.2 # 在 gateB 的 shell 中执行
gateB># route add 192.168.51.0/24 10.0.1.2
gateB># sysctl net.inet.ip.forwarding=1 # 如果不是默认网关
gateB># natd -s -m -u -dynamic -n fxp0 # 看 NAT
gateA># sysctl net.inet.ip.fw.enable=1

配置 gateA


在 gateA 上执行命令:

Linux 上的 gateA


gateA># ifconfig tun5 10.0.1.2 netmask 255.255.255.252
gateA># route add -net 192.168.16.0 netmask 255.255.255.0 dev tun5
gateA># echo 1 > /proc/sys/net/ipv4/ip_forward
gateA># iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

FreeBSD 上的 gateA


gateA># ifconfig tun5 10.0.1.2 10.0.1.1
gateA># route add 192.168.16.0/24 10.0.1.2
gateA># sysctl net.inet.ip.forwarding=1
gateA># natd -s -m -u -dynamic -n fxp0 # 看 NAT
gateA># sysctl net.inet.ip.fw.enable=1

现在两个私有网络都可以通过 SSH VPN 来透明的连接。如果 gate 不是默认网关,那么 IP 转发和 NAT 设置都是必须的。在这种情况下,客户端将不知道在哪里转发响应(response),并且 NAT 必须是开启的。

RSYNC

Rsync 差不多可以代替 cp 和 scp,此外,断点续传是重启有效的。尾部的斜杠也有着不同的意思,请阅读 man 页面......这里有一些例子:

拷贝目录中所有内容:

# rsync -a /home/colin/ /backup/colin/
# rsync -a /var/ /var_bak/
# rsync -aR --delete-during /home/user/ /backup/ # 使用相对路径(看下面)

同之前一样,但使用了压缩和网络。Rsync 使用 SSH 进行传输,并且使用 SSH 密钥,如果设置的话。和 SCP 一样使用 ":"。一个典型的拷贝:

# rsync -axSRzv /home/user/ user@server:/backup/user/

排除在 /home/user/ 中任何 tmp 目录,并且保持相对目录层次结构,远程目录的结构就是 /backup/home/user/。典型的用于备份的命令。

# rsync -azR --exclude /tmp/ /home/user/ user@server:/backup/

SSH 连接使用端口 20022:

# rsync -az -e 'ssh -p 20022' /home/colin/ user@server:/backup/colin/

使用 rsync 守护进程(使用"::")是很快的,但没有透过 SSH 加密。 位置 /backup 定义在了配置文件 /etc/rsyncd.conf 中。变量 RSYNC_PASSWORD 可以设置用来免除手动输入密码。

# rsync -axSRz /home/ ruser@hostname::rmodule/backup/
# rsync -axSRz ruser@hostname::rmodule/backup/ /home/ # 回拷贝

一些重要选项:

  • -a, --archive 归档模式,等于 -rlptgoD (非 -H)
  • -r, --recursive 对子目录以递归模式处理
  • -R, --relative 使用相对路径名
  • -H, --hard-links 保留硬链结
  • -S, --sparse 对稀疏文件进行特殊处理以节省DST的空间
  • -x, --one-file-system 不跨越文件系统边界
  • --exclude=PATTERN 指定排除不需要传输的文件模式
  • --delete-during 传输期间删除
  • --delete-after 传输结束以后再删除

在 Windows 上使用 Rsync

可以通过 cygwin 或 独立打包的
cwrsync 来在 Windows 上运行 rsync。这对于自动备份来说非常方便。只装其中一个(
不是两个

),然后添加路径到 Windows 系统变量中:# 控制面板 -> 系统 -> 高级标签,环境变量按钮。编辑 "Path" 添加 rsync 的安装路径,比如:C:\Program Files\cwRsync\bin 或者 C:\cygwin\bin。这可以让
rsync和
ssh可用于 Windows 命令窗口中。

公钥认证


Rsync 是自动使用 SSH 隧道的,因此在服务端使用 SSH 认证。自动备份可免受用户的影响,rsync 命令对于使用 SSH 公钥认证可以不需要密码。

下面所有的命令都可在 windows 控制台中执行。在控制台(开始 -> 运行 -> cmd)中像在
SSH中描述的那样创建和上传密钥,根据你的情况改变 "user" 和 "server"。如果文件 authorized_keys2 不存在,拷贝 id_dsa.pub 成 authorized_keys2 并上传它。

# ssh-keygen -t dsa -N '' # 创建密钥对
# rsync user@server:.ssh/authorized_keys2 . # 从服务器拷贝本地文件
# cat id_dsa.pub >> authorized_keys2 # 或者使用编辑器添加这个公钥
# rsync authorized_keys2 user@server:.ssh/ # 拷贝文件回服务器
# del authorized_keys2 # 删除本地拷贝

现在测试一下(在同一行里面):

rsync -rv "/cygdrive/c/Documents and Settings/%USERNAME%/My Documents/" \
'user@server:My\ Documents/'

自动备份


使用批处理文件自动备份并添加到任务计划(程序 -> 附件 -> 系统工具 -> 任务计划)。举个例子,创建批处理文件 backup.bat 取代 user@server。

@ECHO OFF
REM rsync the directory My Documents
SETLOCAL
SET CWRSYNCHOME=C:\PROGRAM FILES\CWRSYNC
SET CYGWIN=nontsec
SET CWOLDPATH=%PATH%
REM uncomment the next line when using cygwin
SET PATH=%CWRSYNCHOME%\BIN;%PATH%
echo Press Control-C to abort
rsync -av "/cygdrive/c/Documents and Settings/%USERNAME%/My Documents/" \
'user@server:My\ Documents/'
pause



SUDO

Sudo 可以给用户一些超级用户的权限而不需要 root 密码。Sudo 对于一个服务器和工作站混合的多用户环境来说非常有用。使用 sudo 运行命令:

# sudo /etc/init.d/dhcpd restart # 用 root 权限运行 rc 脚本
# sudo -u sysadmin whoami # 使用其他用户运行命令

配置

Sudo 的配置在
/etc/sudoers 中,并且只能用
visudo编辑。其基本语法是(列表是以逗号分隔的):

user hosts = (runas) commands # 在 /etc/sudoers 中

  • users 一个或多个用户或是%用户组(像 %wheel) 来获得权限
  • hosts 主机列表(或 ALL)
  • runas 列出用户以何种身份(或 ALL)来执行命令,放在 ( ) 内!
  • commands 列出可被 users 以 runas 或 root 权限运行的命令(或 ALL)
另外一些关键字可以定义别名,他们是 User_Alias, Host_Alias, Runas_Alias 和 Cmnd_Alias。这对于一些较大的设置比较有用。下面是 sudoers 例子:

# cat /etc/sudoers
# 主机别名
Host_Alias DMZ = 212.118.81.40/28
Host_Alias DESKTOP = work1, work2

# 用户别名 和 runas 别名
User_Alias ADMINS = colin, luca, admin
User_Alias DEVEL = joe, jack, julia
Runas_Alias DBA = oracle,pgsql

# 命令别名,其值为全路径命令
Cmnd_Alias SYSTEM = /sbin/reboot,/usr/bin/kill,/sbin/halt,/sbin/shutdown,/etc/init.d/
Cmnd_Alias PW = /usr/bin/passwd [A-z]*, !/usr/bin/passwd root # Not root pwd!
Cmnd_Alias DEBUG = /usr/sbin/tcpdump,/usr/bin/wireshark,/usr/bin/nmap
# 一个真实的规则
root,ADMINS ALL = (ALL) NOPASSWD: ALL # ADMINS 别名中的用户可做任何事情不需要密码
DEVEL DESKTOP = (ALL) NOPASSWD: ALL # 开发人员可在 DESKTOP 别名的主机上做任何事情
DEVEL DMZ = (ALL) NOPASSWD: DEBUG # 开发人员可以在 DMZ 别名的主机上使用 DEBUG 别名中的命令

# 用户 sysadmin 可以在 DMZ 服务器上执行一些命令
sysadmin DMZ = (ALL) NOPASSWD: SYSTEM,PW,DEBUG
sysadmin ALL,!DMZ = (ALL) NOPASSWD: ALL # 可以在非 DMZ 主机上做任何事情
%dba ALL = (DBA) ALL # 用户组 dba 可以运行 DBA 别名中用户权限的所有命令

# 所有用户可以在 DESKTOP 别名的主机上 挂载/卸载 CD-ROM
ALL DESKTOP = NOPASSWD: /sbin/mount /cdrom,/sbin/umount /cdrom




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论