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 密碼|編譯內核
正在運行的內核和系統信息
# 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 中獲取的硬件信息顯示狀態信息
以下的命令有助于找出正在系統中運行著的程序。
# 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 中的信息。
限制
某些應用程序需要設置可打開最大文件和 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 # 在使用的文件句柄數運行級別
一旦內核加載完成,內核會啟動?init?進程,然后運行?rc?腳本,之后運行所有屬于其運行級別的命令腳本。這些腳本都儲存在 /etc/rc.d/rcN.d 中(N代表運行級別),并且都建立著到 /etc/init.d 子目錄中命令腳本程序的符號鏈接。
默認運行級別配置在 /etc/inittab 中。它通常為 3 或 5:
可以使用?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 # 在所有的運行級別下禁用 sshdDebian 和基于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) # 關閉停止系統?root 密碼
Linux 方法 1
在引導加載器(lilo 或 grub)中,鍵入如下啟選項:
init=/bin/sh內核會掛載 root 分區,進程?init?會啟動 bourne shell 而不是?rc,然后是運行級別。使用命令?passwd?設置密碼然后重啟。別忘了需要在單用戶模式下做這些動作。
如果重啟后 root 分區被掛載為只讀,重新掛在它為讀寫:
編譯內核
# lsmod # 列出所有已載入內核的模塊 # modprobe isdn # 載入 isdn 模塊?
# cd /usr/src/linux # make mrproper # 清除所有東西,包括配置文件 # make oldconfig # 從當前內核配置文件的基礎上創建一個新的配置文件 # make menuconfig # 或者 xconfig (Qt) 或者 gconfig (GTK) # make # 創建一個已壓縮的內核映像文件 # make modules # 編譯模塊 # make modules_install # 安裝模塊 # make install # 安裝內核 # reboot要重建完全的操作系統:
# 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 cron586 ?? 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?(軟件終止信號)
文件系統
權限|磁盤信息|Boot系統掛載點/磁盤使用情況|磁盤使用情況|誰打開了那些文件|掛載/重掛載一個文件系統|重掛載|給即時燒錄(on-the-fly)添加 swap|掛載一個 SMB?共享|掛載鏡像文件|創建并刻錄 ISO 鏡像文件|創建基于文件的鏡像文件|創建基于內存的文件系統|磁盤性能
權限
用?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 # 顯示磁盤檢測信息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 # 不能卸載,因為有一個文件鎖定了 homefailed: Device busy使用?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?命令
# 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 名字。
# 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掛載鏡像文件
Linux loop-back
# mount -t iso9660 -o loop file.iso /mnt # 掛載 CD 鏡像文件 # 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。
# 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 # 清楚/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 分區:
# 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 - 網絡地址轉換|反向查詢|/etc/hosts|DHCP|通信量分析(Traffic analysis)|用 nmap 掃描|流量控制(QoS)
調試 (也可看流量分析)
# 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 類似路由
列印路由表
# route -n # Linux 或使用 "ip route" # netstat -rn # Linux, BSD 和 UNIX # route print # Windows添加刪除路由
# 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配置額外的 IP 地址
# 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更改 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防火墻
檢查正在運行的防火墻(只是典型配置):
# 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 # 刪除所有鏈路由 IP 轉發
查看然后啟用 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 = 1NAT - 網絡地址轉換
# 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 來刪除端口轉發。
反向查詢
查找屬于一個 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 名稱解析。
DHCP
一些發行版(SuSE)使用 dhcpcd 作為客戶端。默認網絡接口是 eth0。
# dhcpcd -n eth0 # 觸發更新(并不總是可以工作) # dhcpcd -k eth0 # 釋放并關閉租約(lease)的全部信息存儲在:
/var/lib/dhcpcd/dhcpcd-eth0.info通信量分析(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%。
給 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服務質量 (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。
# 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?
實用命令
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 user@domain"。其第一行為主題,然后是郵件內容。在一個新行中使用單個點(.)來結束并發送郵件。例子:
# mail c@cb.vu Subject: Your text is full of typos "For a moment, nothing happened. Then, after a second or so, nothing continued to happen." . EOT #這同樣可用于管道:
# echo "This is the mail body" | mail c@cb.vu也是測試郵件服務器的簡單方法。
tar
命令?tar?(磁帶存檔) 可以為文件和目錄創建檔案。歸檔文件 .tar 是未壓縮的,一個壓縮過的歸檔文件的后綴是 .tgz 或 .tar.gz (zip) 或者 .tbz (bzip2)。不要使用絕對路徑建立一個歸檔文件,你可能要解開這個歸檔文件到某個地方。一些常用命令如下:
創建
# cd / # tar -cf home.tar home/ # 歸檔整個 /home 目錄(c 為創建) # tar -czf home.tgz home/ # 等同于 zip 壓縮 # tar -cjf home.tbz home/ # 等同于 bzip2 壓縮從一個目錄樹中只包含一個(或2個)目錄,并保持相對目錄結構。舉個例子,/usr/local/etc 和 /usr/local/www,它們在歸檔文件中的第一層目錄是 local/。
# tar -C /usr -czf local.tgz local/etc local/www # tar -C /usr -xzf local.tgz # 釋放 local 目錄到 /usr # cd /usr; tar -xzf local.tgz # 同上面一樣釋放(Extract)
# tar -tzf home.tgz # 列出歸檔文件中的所有文件,并不釋放 # tar -xf home.tar # 釋放歸檔文件(x 為釋放) # tar -xzf home.tgz # 等同于 zip 壓縮 # tar -xjf home.tgz # 等同于 bzip2 壓縮 # tar -xjf home.tgz home/colin/file.txt # 釋放單個文件更高級的
# tar c dir/ | gzip | ssh user@remote 'dd of=dir.tgz' # 歸檔壓縮 dir/ 目錄并存儲到遠程主機上 # tar cvf - `find . -print` > backup.tar # 歸檔當前目錄 # tar -cf - -C /etc . | tar xpf - -C /backup/etc # 拷貝目錄 # tar -cf - -C /etc . | ssh user@remote tar xpf - -C /backup/etc # 遠程拷貝 # 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 個扇區是空的。較大的字節大小可以加快拷貝速度但也需要更多的內存。
備份和恢復
# dd if=/dev/hda of=/dev/hdc bs=16065b # 拷貝磁盤到磁盤(相同大小) # dd if=/dev/sda7 of /home/root.img bs=4096 conv=notrunc,noerror # 備份 / # dd if /home/root.img of=/dev/sda7 bs=4096 conv=notrunc,noerror # 恢復 / # dd bs=1M if=/dev/ad4s3e | gzip -c > ad4s3e.gz # 壓縮備份 # gunzip -dc ad4s3e.gz | dd of=/dev/ad0s3e bs=1M # 解壓恢復 # dd bs=1M if=/dev/ad4s3e | gzip | ssh eedcoba@fry 'dd of=ad4s3e.gz' # 也可為遠程的 # gunzip -dc ad4s3e.gz | ssh eedcoba@host 'dd of=/dev/ad0s3e bs=1M' # dd if=/dev/ad0 of=/dev/ad2 skip=1 seek=1 bs=4k conv=noerror # 忽略 MBR# 如果目標(ad2)比較小,這是必須的。恢復
該?dd?命令會讀取分區的每一個區塊,即所有區塊。對于有問題的區塊,最好使用?conv=sync,noerror?選項,dd 將會跳過壞的區塊并入 0。因此,這就是設置塊大小等于或小于磁盤塊大小的重要性。1k 大小似乎安全,用?bs=1k?來設置它。假如一個磁盤有壞扇區并且有個分區的數據要恢復,那么用 dd 工具創建一個鏡像文件,掛載這個鏡像文件,然后拷貝內容到新的磁盤中。如果用了?noerror?選項,dd 會跳過壞扇區并寫入 0,也即壞扇區中的內容會丟失。
# dd if=/dev/hda of=/dev/null bs=1m # 檢查壞扇區 # dd bs=1k if=/dev/hda1 conv=sync,noerror,notrunc | gzip | ssh \ # 發送到遠程 root@fry 'dd of=hda1.gz bs=1k' # dd bs=1k if=/dev/hda1 conv=sync,noerror,notrunc of=hda1.img # 存儲為一個映像文件 # mount -o loop /hda1.img /mnt # 掛載這個映像文件 # rsync -ax /mnt/ /newdisk/ # 拷貝到一個新磁盤 # dd if=/dev/hda of=/dev/hda # 刷新磁狀態# 上面的命令對于刷新磁盤(refresh disk)很有用。這絕對安全,但必須先卸載磁盤。刪除
# dd if=/dev/zero of=/dev/hdc # 刪除全部數據 # dd if=/dev/urandom of=/dev/hdc # 更好的刪除全部數據 # kill -USR1 PID # 查看 dd 進度(僅Linux!)MBR 技巧
MBR 包含了引導程序和分區表,它的大小為 512 字節。前 446 字節為引導程序,446 到 512 字節為分區表。
# dd if=/dev/sda of=/mbr_sda.bak bs=512 count=1 # 完全備份 MBR # dd if=/dev/zero of=/dev/sda bs=512 count=1 # 刪除 MBR 和分區表 # dd if=/mbr_sda.bak of=/dev/sda bs=512 count=1 # 完全恢復MBR # dd if=/mbr_sda.bak of=/dev/sda bs=446 count=1 # 僅回復引導程序 # 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 分鐘改變文件狀態的文件
小心 xarg 或 exec,因為當文件或目錄中包含空格時可能會返回錯誤的結果。在有疑惑時用 "-print0 | xargs -0" 代替 "| xargs"。選項 -print0 必須在 find 命令的最后。看這個不錯的?find 迷你教程.
# find . -type f | xargs ls -l # 不能工作于有空格的名字 # find . -type f -print0 | xargs -0 ls -l # 可工作于有空格的名字 # find . -type f -exec ls -l '{}' \; # 或使用用于 -exec 的引用 '{}'混雜的
# which command # 顯示命令的全路徑名 # time command # 顯示一個命令執行完成所用的時間 # time cat # 使用 time 作為秒表,用 Ctrl-c 來停止 # set | grep $USER # 列顯當前環境變量 # cal -3 # 顯示三個月日歷 # date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] # date 10022155 # 設置日期和時間 # whatis grep # 顯示命令的簡短信息 # whereis java # 查詢命令的的路徑和標準目錄 # setenv varname value # 設置環境變量,設置變量 varname 的值為 value (csh/tcsh) # export varname="value" # 設置環境變量,設置變量 varname 的值為 value (sh/ksh/bash) # pwd # 顯示當前工作目錄 # mkdir -p /path/to/dir # 如果存在不顯示錯誤,建立所需的上級目錄 # mkdir -p project/{bin,src,obj,doc/{html,man,pdf},debug/some/more/dirs} # rmdir /path/to/dir # 移除目錄 # rm -rf /path/to/dir # 移除目錄和其內容(強制) # cp -la /dir1 /dir2 # 存檔、硬連接目錄所有文件,用來替代拷貝 # cp -lpR /dir1 /dir2 # 同上 (FreeBSD) # cp unixtoolbox.xhtml{,.bak} # 拷貝文件成新擴展名的快速方法 # mv /dir1 /dir2 # 修改目錄名?
媒體轉換
文本編碼|視頻轉換|拷貝音頻光盤
有時候需要轉換一個視頻、音頻文件或者文檔成其他格式。
文本編碼
文本編碼可以得到完全錯誤的,特別是當語言需要某些特殊字符像 à??。命令?iconv?可以從一個編碼轉換成另一個編碼。
# iconv -f <from_encoding> -t <to_encoding> <input_file> # iconv -f ISO8859-1 -t UTF-8 -o file.input > file_utf8 # iconv -l # 列顯系統所支持的字符編碼若文檔顯示良好,通常都可不使用 -f 選項,iconv 會使用本地字符集(char-set)。
視頻轉換
使用 mpeg4 編碼壓縮佳能數碼相機視頻并修復無用音質。
# mencoder -o videoout.avi -oac mp3lame -ovc lavc -srate 11025 \ -channels 1 -af-adv force=1 -lameopts preset=medium -lavcopts \ vcodec=msmpeg4v2:vbitrate=600 -mc 0 vidoein.AVI對于聲音的處理可看?sox。
拷貝音頻光盤
程序?cdparanoia?可以保存音軌(FreeBSD port 在 audio/cdparanoia/),oggenc?可編碼 Ogg Vorbis 格式,lame?可轉換成 mp3。
# cdparanoia -B # 拷貝音軌成 wav 文件到當前目錄列表(dir) # lame -b 256 in.wav out.mp3 # 編碼成 256 kb/s 的 mp3 # for i in *.wav; do lame -b 256 $i `basename $i .wav`.mp3; done # 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 獲取變量值。
MESSAGE="Hello World" # 賦予一個字符串 PI=3.1415 # 賦予一個十進制小數 N=8 TWON=`expr $N * 2` # 算術表達式(只限整數) TWON=$(($N * 2)) # 另一種語法 TWOPI=`echo "$PI * 2" | bc -l` # 使用 bc 進行浮點運算 ZERO=`echo "c($PI/4)-sqrt(2)/2" | bc -l`命令行參數:
$0, $1, $2, ... # $0 命令本身 $# # 命令參數個數 $* # 所有參數(也可以是 $@)一些特殊的變量
$$ # 當前進程 ID $? # 最后命令退出狀態碼commandif [ $? != 0 ]; thenecho "command failed"fi mypath=`pwd` mypath=${mypath}/file.txt echo ${mypath##*/} # 只顯示文件名 echo ${mypath%%.*} # 除了擴展名的全路徑 var2=${var:=string} # 如果var沒有被賦值,則string值先賦值給var,# 然后再賦值給var2結構控制
for file in `ls` doecho $file donecount=0 while [ $count -lt 5 ]; doecho $countsleep 1count=$(($count + 1)) donemyfunction() {find . -type f -name "*.$1" -print # $1 為方法的第一個參數 } myfunction "txt"產生一個文件
MYHOME=/home/colin cat > testhome.sh << _EOF # 所有_EOF前的代碼都會進入到 testhome.sh 文件中去 if [ -d "$MYHOME" ] ; thenecho $MYHOME exists elseecho $MYHOME does not exist fi _EOF sh testhome.shBourne 腳本實例
來一個小實例,此腳本從本 xhtml 文檔創建一個 PDF 小冊子:
#!/bin/sh # 此腳本可以創建一份供雙面打印機打印的 PDF 格式的書 if [ $# -ne 1 ]; then # 檢查參數是否等于 1echo 1>&2 "Usage: $0 HtmlFile"exit 1 # 如果不等于1,非0退出 fifile=$1 # 文件變量 fname=${file%.*} # 文件名變量 fext=${file#*.} # 文件擴展名變量prince $file -o $fname.pdf # www.princexml.com pdftops -paper A4 -noshrink $fname.pdf $fname.ps # 創建 postscript 小冊子 cat $fname.ps |psbook|psnup -Pa4 -2 |pstops -b "2:0,1U(21cm,29.7cm)" > $fname.book.psps2pdf13 -sPAPERSIZE=a4 -sAutoRotatePages=None $fname.book.ps $fname.book.pdf# 在 Windows 上使用 #a4 和 #None! exit 0 # exit 0 意為成功一些 sed 命令
這里是單行 sed 命令的金礦。還有一個很好的?sed 介紹及教程。
sed 's/string1/string2/g' # 替換 string1 為 string2 sed -i 's/wroong/wrong/g' *.txt # 用 g 替換所有返回的單詞 sed 's/\(.*\)1/\12/g' # 修改 anystring1 為 anystring2 sed '/<p>/,/<\/p>/d' t.xhtml # 刪除以 <p> 開始,以 </p> 結尾的行 sed '/ *#/d; /^ *$/d' # 刪除注釋和空行 sed 's/[ \t]*$//' # 刪除行尾空格 (使用 tab 代替 \t) sed 's/^[ \t]*//;s/[ \t]*$//' # 刪除行頭尾空格 sed 's/[^*]/[&]/' # 括住首字符 [] top -> [t]op sed = file | sed 'N;s/\n/\t/' > file.num # 為文件添加行號正則表達式
一些基本的正則表達式同樣可用于 sed。作為一個良好的啟蒙,可看?基本正則語法。
[\^$.|?*+() # 特殊字符,其他字符將匹配自身 \ # 轉義特殊字符,當成普通字符對待 * # 重復前項 0 次或多次 . # 單個字符除換行符 .* # 匹配 0 個或多個字符 ^ # 匹配字符串行開始處 $ # 匹配字符串行結尾處 .$ # 匹配字符串行最后一個字符 ^ $ # 匹配單個空格的行 [^A-Z] # 匹配任何以 A-Z 字符開始的行一些實用命令
下列命令對于包含于一個腳本或者單行命令來說很有用。
sort -t. -k1,1n -k2,2n -k3,3n -k4,4n # 排序 IPv4 格式的 IP 地址 echo 'Test' | tr '[:lower:]' '[:upper:]' # 轉換成大寫 echo foo.bar | cut -d . -f 1 # 返回 foo PID=$(ps | grep script.sh | grep bin | awk '{print $1}') # 正在運行名為 script 腳本的 PID PID=$(ps axww | grep [p]ing | awk '{print $1}') # ping 的 PID (w/o grep pid) IP=$(ifconfig $INTERFACE | sed '/.*inet addr:/!d;s///;s/ .*//') # Linux IP=$(ifconfig $INTERFACE | sed '/.*inet /!d;s///;s/ .*//') # FreeBSD if [ `diff file1 file2 | wc -l` != 0 ]; then [...] fi # 文件改變了? cat /etc/master.passwd | grep -v root | grep -v \*: | awk -F":" \ # 創建 http passwd '{ printf("%s:%s\n", $1, $2) }' > /usr/local/etc/apache2/passwdtestuser=$(cat /usr/local/etc/apache2/passwd | grep -v \ # 查看 passwd 中的用戶 root | grep -v \*: | awk -F":" '{ printf("%s\n", $1) }' | grep ^user$) :(){ :|:& };: # bash fork 炸彈。會干掉你的機器 tail +2 file > file2 # 刪除文件的第一行我使用一種小伎倆來一次更改許多文件的擴展名。舉個例子,從 .cxx 到 .cpp。排除最后的?| sh?先測試一下。你同樣可以使用命令?rename?來做這些,如果安裝了的話。或者使用 bash 內建命令。
# ls *.cxx | awk -F. '{print "mv "$0" "$1".cpp"}' | sh # ls *.c | sed "s/.*/cp & &.$(date "+%Y%m%d")/" | sh # 如 拷貝 *.c 成 *.c.20080401 # rename .cxx .cpp *.cxx # 重命名所有 .cxx 成 .cpp # for i in *.cxx; do mv $i ${i%%.cxx}.cpp; done # bash 內建的?
在線幫助
文檔
| Linux 文檔 | en.tldp.org |
| Linux Man Pages | www.linuxmanpages.com |
| Linux 命令目錄 | www.oreillynet.com/linux/cmd |
| Linux doc man howtos | linux.die.net |
| FreeBSD 手冊 | www.freebsd.org/handbook |
| FreeBSD Man Pages | www.freebsd.org/cgi/man.cgi |
| FreeBSD 用戶 wiki | www.freebsdwiki.net |
| Solaris Man Pages | docs.sun.com/app/docs/coll/40.10 |
其他 Unix/Linux 參考
| Rosetta Stone for Unix | bhami.com/rosetta.html (a Unix command translator) |
| Unix guide cross reference | unixguide.net/unixguide.shtml |
| Linux 命令行列表 | www.linuxguide.it/commands_list.php |
| Short Linux reference | www.pixelbeat.org/cmdline.html |
總結
以上是生活随笔為你收集整理的Unix/Linux/BSD命令大全|实用指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java dht 爬虫_DHT爬虫(go
- 下一篇: linux 其他常用命令