Unix/Linux/BSD命令大全|实用指南
本文轉(zhuǎn)載自:UNIX TOOLBOX - 中文版
按照自己的理解,增刪了部分內(nèi)容。
這是一份收集Unix/Linux/BSD命令和任務(wù)的文檔,它有助于高級(jí)用戶或IT工作。它是一份簡(jiǎn)明扼要的實(shí)用指南,當(dāng)然讀者應(yīng)該知道他/她在干什么。
Unix Toolbox 版本:12
你可以到?http://cb.vu/unixtoolbox.xhtml?找到本文檔的最新版。PDF版本可以替換鏈接中的.xhtml為?.pdf?,小冊(cè)子版本可以替換成?.book.pdf?。 用雙面打印機(jī)可將小冊(cè)子打印成冊(cè)。這份XHTML頁面可以通過CSS3相兼容的應(yīng)用程序轉(zhuǎn)換成一份漂亮的PDF文檔(看?腳本例子).
錯(cuò)誤報(bào)告和評(píng)論是最歡迎的 -?c@cb.vu?Colin Barschel.
你可以到http://code.google.com/p/unixtoolboxcn/找到中文最新版。
目錄
?
系統(tǒng)
硬件信息|顯示狀態(tài)信息|用戶|限制|運(yùn)行級(jí)別|?root 密碼|編譯內(nèi)核
進(jìn)程
進(jìn)程列表|優(yōu)先級(jí)|前臺(tái)/后臺(tái)|Top|Kill命令與信號(hào)
文件系統(tǒng)
權(quán)限|磁盤信息|Boot系統(tǒng)掛載點(diǎn)/磁盤使用情況|磁盤使用情況|誰打開了那些文件|掛載/重掛載一個(gè)文件系統(tǒng)|重掛載|給即時(shí)燒錄(on-the-fly)添加 swap|掛載一個(gè) SMB?共享|掛載鏡像文件|創(chuàng)建并刻錄 ISO 鏡像文件|創(chuàng)建基于文件的鏡像文件|創(chuàng)建基于內(nèi)存的文件系統(tǒng)|磁盤性能
網(wǎng)絡(luò)
調(diào)試 (也可看流量分析)|路由|配置額外的 IP 地址|更改 MAC 地址|使用中的端口|防火墻|路由 IP 轉(zhuǎn)發(fā)|NAT - 網(wǎng)絡(luò)地址轉(zhuǎn)換|反向查詢|/etc/hosts|DHCP|通信量分析(Traffic analysis)|用 nmap 掃描|流量控制(QoS)
實(shí)用命令
less|vi|mailtar|dd|screen|Find|混雜的
媒體轉(zhuǎn)換
文本編碼|視頻轉(zhuǎn)換|拷貝音頻光盤
腳本
在線幫助
系統(tǒng)
硬件信息|顯示狀態(tài)信息|用戶|限制|運(yùn)行級(jí)別|?root 密碼|編譯內(nèi)核
正在運(yùn)行的內(nèi)核和系統(tǒng)信息
# uname -a # 獲取內(nèi)核版本(和BSD版本) # lsb_release -a # 顯示任何 LSB 發(fā)行版版本信息 # cat /etc/SuSE-release # 獲取 SuSE 版本 # cat /etc/debian_version # 獲取 Debian 版本使用 /etc/DISTR-release 其中DISTR(發(fā)行代號(hào))=?lsb (Ubuntu), redhat, gentoo, mandrake, sun (Solaris), 等等。
# uptime # 顯示系統(tǒng)開機(jī)運(yùn)行到現(xiàn)在經(jīng)過的時(shí)間 # hostname # 顯示系統(tǒng)主機(jī)名 # hostname -i # 顯示主機(jī)的 IP 地址 # man hier # 描述文件系統(tǒng)目錄結(jié)構(gòu) # last reboot # 顯示系統(tǒng)最后重啟的歷史記錄硬件信息
內(nèi)核檢測(cè)到的硬件信息
# dmesg # 檢測(cè)到的硬件和啟動(dòng)的消息 # lsdev # 關(guān)于已安裝硬件的信息 # 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 # 內(nèi)存信息 # grep MemTotal /proc/meminfo # 顯示物理內(nèi)存大小 # watch -n1 'cat /proc/interrupts' # 監(jiān)控內(nèi)核處理的所有中斷 # free -m # 顯示已用和空閑的內(nèi)存信息 (-m 為 MB) # cat /proc/devices # 顯示當(dāng)前核心配置的設(shè)備 # lspci -tv # 顯示 PCI 設(shè)備 # lsusb -tv # 顯示 USB 設(shè)備 # lshal # 顯示所有設(shè)備屬性列表 # dmidecode # 顯示從 BIOS 中獲取的硬件信息顯示狀態(tài)信息
以下的命令有助于找出正在系統(tǒng)中運(yùn)行著的程序。
# top # 顯示和更新使用 cpu 最多的進(jìn)程 # mpstat 1 # 顯示進(jìn)程相關(guān)的信息 # vmstat 2 # 顯示虛擬內(nèi)存的狀態(tài)信息 # iostat 2 # 顯示 I/O 狀態(tài)信息(2 秒 間隙) # systat -vmstat 1 # 顯示 BSD 系統(tǒng)狀態(tài)信息(1 秒 間隙) # systat -tcp 1 # 顯示 BSD TCP 連接信息(也可以試試 -ip) # systat -netstat 1 # 顯示 BSD 當(dāng)前網(wǎng)絡(luò)連接信息 # systat -ifstat 1 # 顯示 BSD 當(dāng)前網(wǎng)卡帶寬信息 # systat -iostat 1 # 顯示 BSD CPU 和磁盤使用情況 # tail -n 500 /var/log/messages # 顯示最新500條內(nèi)核/系統(tǒng)日志的信息 # tail /var/log/warn # 顯示系統(tǒng)警告信息(看syslog.conf)用戶
# id # 顯示當(dāng)前用戶和用戶組的 ID # last # 列出目前與過去登入系統(tǒng)的用戶相關(guān)信息 # who # 顯示目前登入系統(tǒng)的用戶信息 # 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 # 添加新用戶到一個(gè)組 # pw useradd colin -c "Colin Barschel" -g admin -m -s /bin/tcsh # pw userdel colin; pw groupdel admin加密過的密碼存儲(chǔ)在 /etc/shadow (Linux and Solaris) 或 /etc/master.passwd (FreeBSD) 中. 如果手動(dòng)修改了 master.passwd,需要運(yùn)行?# pwd_mkdb -p master.passwd?來重建數(shù)據(jù)庫。
使用 nologin 來臨時(shí)阻止所有用戶登錄(root除外)。用戶登錄時(shí)將會(huì)顯示 nologin 中的信息。
限制
某些應(yīng)用程序需要設(shè)置可打開最大文件和 socket 數(shù)量(像代理服務(wù)器,數(shù)據(jù)庫)。 默認(rèn)限制通常很低。
Linux:每 shell/腳本
shell 的限制是受?ulimit?支配的。使用?ulimit -a?可查看其狀態(tài)信息。 舉個(gè)例子,改變可打開最大文件數(shù)從 1024 到 10240,可以這么做:
# ulimit -n 10240 # 這只在shell中有用ulimit?命令可以使用在腳本中來更改對(duì)此腳本的限制。
每用戶/進(jìn)程:登錄用戶和應(yīng)用程序的限制可以在?/etc/security/limits.conf?中配置。舉個(gè)例子:
# cat /etc/security/limits.conf * hard nproc 250 # 限制所有用戶進(jìn)程數(shù) asterisk hard nofile 409600 # 限制應(yīng)用程序可打開最大文件數(shù)系統(tǒng)級(jí):用sysctl來設(shè)置內(nèi)核限制。要使其永久,可以在?/etc/sysctl.conf?中進(jìn)行配置。
# sysctl -a # 顯示所有系統(tǒng)限制 # sysctl fs.file-max # 顯示系統(tǒng)最大文件打開數(shù) # sysctl fs.file-max=102400 # 更改系統(tǒng)最大文件打開數(shù) # cat /etc/sysctl.conf fs.file-max=102400 # 在 sysctl.conf 中的永久項(xiàng) # cat /proc/sys/fs/file-nr # 在使用的文件句柄數(shù)運(yùn)行級(jí)別
一旦內(nèi)核加載完成,內(nèi)核會(huì)啟動(dòng)?init?進(jìn)程,然后運(yùn)行?rc?腳本,之后運(yùn)行所有屬于其運(yùn)行級(jí)別的命令腳本。這些腳本都儲(chǔ)存在 /etc/rc.d/rcN.d 中(N代表運(yùn)行級(jí)別),并且都建立著到 /etc/init.d 子目錄中命令腳本程序的符號(hào)鏈接。
默認(rèn)運(yùn)行級(jí)別配置在 /etc/inittab 中。它通常為 3 或 5:
可以使用?init?來改變當(dāng)前運(yùn)行級(jí)別。舉個(gè)例子:
# init 5 # 進(jìn)入運(yùn)行級(jí)別 5運(yùn)行級(jí)別列表如下:
- 0 ? ? ? 系統(tǒng)停止
- 1 ? ? ? 進(jìn)入單用戶模式(也可以是 S)
- 2 ? ? ? 沒有 NFS 特性的多用戶模式
- 3 ? ? ? 完全多用戶模式(正常操作模式)
- 4 ? ? ? 未使用
- 5 ? ? ? 類似于級(jí)別3,但提供 XWindow 系統(tǒng)登錄環(huán)境
- 6 ? ? ? 重新啟動(dòng)系統(tǒng)
使用?chkconfig?工具控制程序在一個(gè)運(yùn)行級(jí)別啟動(dòng)和停止。
# chkconfig --list # 列出所有 init 腳本 # chkconfig --list sshd # 查看 sshd 在各個(gè)運(yùn)行級(jí)別中的啟動(dòng)配置 # chkconfig sshd --level 35 on # 對(duì) sshd 在級(jí)別 3 和 5 下創(chuàng)建啟動(dòng)項(xiàng) # chkconfig sshd off # 在所有的運(yùn)行級(jí)別下禁用 sshdDebian 和基于Debian 發(fā)行版像 Ubuntu 或 Knoppix 使用命令?update-rc.d?來管理運(yùn)行級(jí)別腳本。默認(rèn)啟動(dòng)為 2,3,4 和 5,停止為 0,1 和 6。
# update-rc.d sshd defaults # 設(shè)置 sshd 為默認(rèn)啟動(dòng)級(jí)別 # update-rc.d sshd start 20 2 3 4 5 . stop 20 0 1 6 . # 用顯示參數(shù) # update-rc.d -f sshd remove # 在所有的運(yùn)行級(jí)別下禁用 sshd # shutdown -h now (或者 # poweroff) # 關(guān)閉停止系統(tǒng)?root 密碼
Linux 方法 1
在引導(dǎo)加載器(lilo 或 grub)中,鍵入如下啟選項(xiàng):
init=/bin/sh內(nèi)核會(huì)掛載 root 分區(qū),進(jìn)程?init?會(huì)啟動(dòng) bourne shell 而不是?rc,然后是運(yùn)行級(jí)別。使用命令?passwd?設(shè)置密碼然后重啟。別忘了需要在單用戶模式下做這些動(dòng)作。
如果重啟后 root 分區(qū)被掛載為只讀,重新掛在它為讀寫:
編譯內(nèi)核
# lsmod # 列出所有已載入內(nèi)核的模塊 # modprobe isdn # 載入 isdn 模塊?
# cd /usr/src/linux # make mrproper # 清除所有東西,包括配置文件 # make oldconfig # 從當(dāng)前內(nèi)核配置文件的基礎(chǔ)上創(chuàng)建一個(gè)新的配置文件 # make menuconfig # 或者 xconfig (Qt) 或者 gconfig (GTK) # make # 創(chuàng)建一個(gè)已壓縮的內(nèi)核映像文件 # make modules # 編譯模塊 # make modules_install # 安裝模塊 # make install # 安裝內(nèi)核 # reboot要重建完全的操作系統(tǒng):
# make buildworld # 構(gòu)建完全的系統(tǒng),但不是內(nèi)核 # make buildkernel # 使用 KERNCONF 配置文件編譯內(nèi)核 # make installkernel # reboot # mergemaster -p # 建立臨時(shí)根環(huán)境并比對(duì)系統(tǒng)配置文件 # make installworld # mergemaster # 升級(jí)所有配置和其他文件 # reboot對(duì)于源的一些小改動(dòng),有時(shí)候簡(jiǎn)單的命令就足夠了:
# make kernel world # 編譯并安裝內(nèi)核和系統(tǒng) # mergemaster # reboot進(jìn)程
進(jìn)程列表|優(yōu)先級(jí)|前臺(tái)/后臺(tái)|Top|Kill命令與信號(hào)
進(jìn)程列表
PID是每個(gè)進(jìn)程唯一號(hào)碼。使用?ps?獲取所有正在運(yùn)行的進(jìn)程列表。
# ps -auxefw # 所有正在運(yùn)行進(jìn)程的詳盡列表然而,更典型的用法是使用管道或者?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 # 查找所有進(jìn)程名中有sshd的進(jìn)程ID # echo $$ # The PID of your shell # fuser -va 22/tcp # 列出使用端口22的進(jìn)程 # fuser -va /home # 列出訪問 /home 分區(qū)的進(jìn)程 # strace df # 跟蹤系統(tǒng)調(diào)用和信號(hào) # truss df # 同上(FreeBSD/Solaris/類Unix) # history | tail -50 # 顯示最后50個(gè)使用過的命令優(yōu)先級(jí)
用?renice?更改正在運(yùn)行進(jìn)程的優(yōu)先級(jí)。負(fù)值是更高的優(yōu)先級(jí),最小為-20,其正值與 "nice" 值的意義相同。
# renice -5 586 # 更強(qiáng)的優(yōu)先級(jí) 586: old priority 0, new priority -5使用?nice?命令啟動(dòng)一個(gè)已定義優(yōu)先級(jí)的進(jìn)程。 正值為低優(yōu)先級(jí),負(fù)值為高優(yōu)先級(jí)。確定你知道?/usr/bin/nice?或者使用 shell 內(nèi)置命令(# which nice)。
# nice -n -5 top # 更高優(yōu)先級(jí)(/usr/bin/nice) # nice -n 5 top # 更低優(yōu)先級(jí)(/usr/bin/nice) # nice +5 top # tcsh 內(nèi)置 nice 命令(同上)nice 可以影響 CPU 的調(diào)度,另一個(gè)實(shí)用命令?ionice?可以調(diào)度磁盤 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) 上使用。你可以選擇一個(gè)類型(idle - best effort - real time),它的 man 頁很短并有很好的解釋。
# ionice c3 -p123 # 給 pid 123 設(shè)置為 idle 類型 # ionice -c2 -n0 firefox # 用 best effort 類型運(yùn)行 firefox 并且設(shè)為高優(yōu)先級(jí) # ionice -c3 -p$$ # 將當(dāng)前的進(jìn)程(shell)的磁盤 IO 調(diào)度設(shè)置為 idle 類型例中最后一條命令對(duì)于編譯(或調(diào)試)一個(gè)大型項(xiàng)目會(huì)非常有用。每一個(gè)運(yùn)行于此 shell 的命令都會(huì)有一個(gè)較低的優(yōu)先級(jí),但并不妨礙這個(gè)系統(tǒng)。$$ 是你 shell 的 pid (試試 echo $$)。
前臺(tái)/后臺(tái)
當(dāng)一個(gè)進(jìn)程在 shell 中已運(yùn)行,可以使用?[Ctrl]-[Z] (^Z),?bg?和?fg?來 調(diào)入調(diào)出前后臺(tái)。舉個(gè)例子:啟動(dòng) 2 個(gè)進(jìn)程,調(diào)入后臺(tái)。使用?jobs?列出后臺(tái)列表,然后再調(diào)入一個(gè)進(jìn)程到前臺(tái)。
# ping cb.vu > ping.log ^Z # ping 使用 [Ctrl]-[Z] 來暫停(停止) # bg # 調(diào)入后臺(tái)繼續(xù)運(yùn)行 # jobs -l # 后臺(tái)進(jìn)程列表 [1] - 36232 Running ping cb.vu > ping.log [2] + 36233 Suspended (tty output) top # fg %2 # 讓進(jìn)程 2 返回到前臺(tái)運(yùn)行使用?nohup?開啟一個(gè)持續(xù)運(yùn)行的進(jìn)程直到 shell 被關(guān)閉(避免掛斷)。
# nohup ping -i 60 > ping.log &Top
top?程序用來實(shí)時(shí)顯示系統(tǒng)中各個(gè)進(jìn)程的運(yùn)行信息。
# top當(dāng)?top?在運(yùn)行的時(shí)候,按下?h?鍵會(huì)顯示幫助畫面。常用鍵如下:
- u [用戶名]?只顯示屬于此用戶的進(jìn)程。使用 + 或者空白可以查看所有用戶
- k [PID]?結(jié)束 PID 進(jìn)程
- 1?顯示所有進(jìn)程狀態(tài)信息(只有Linux)
- R?將當(dāng)前排序倒轉(zhuǎn)
Kill命令與信號(hào)
使用?kill?或?killall?終止或發(fā)送一個(gè)信號(hào)給進(jìn)程。
# ping -i 60 cb.vu > ping.log & [1] 4712 # kill -s TERM 4712 # 同 kill -15 4712 # killall -1 httpd # 發(fā)送 HUP 信號(hào)終止進(jìn)程 httpd # pkill -9 http # 發(fā)送 TERM 信號(hào)終止包含 http 的進(jìn)程 # pkill -TERM -u www # 發(fā)送 TERM 信號(hào)終止 www 所有者進(jìn)程 # fuser -k -TERM -m /home # 終止所有訪問 /home 的進(jìn)程(卸載該分區(qū)前)下面是一些重要的信號(hào):
- 1 ? ? ??HUP?(掛起)
- 2 ? ? ??INT?(中斷)
- 3 ? ? ??QUIT?(退出)
- 9 ? ? ??KILL?(KILL 信號(hào)不能被捕捉,不能被忽略。)
- 15 ? ??TERM?(軟件終止信號(hào))
文件系統(tǒng)
權(quán)限|磁盤信息|Boot系統(tǒng)掛載點(diǎn)/磁盤使用情況|磁盤使用情況|誰打開了那些文件|掛載/重掛載一個(gè)文件系統(tǒng)|重掛載|給即時(shí)燒錄(on-the-fly)添加 swap|掛載一個(gè) SMB?共享|掛載鏡像文件|創(chuàng)建并刻錄 ISO 鏡像文件|創(chuàng)建基于文件的鏡像文件|創(chuàng)建基于內(nèi)存的文件系統(tǒng)|磁盤性能
權(quán)限
用?chmod?和?chown?更改訪問權(quán)限和所有權(quán)。對(duì)于所有用戶的默認(rèn)掩碼(umask)可以在 /etc/profile (Linux) 或 /etc/login.conf (FreeBSD) 中修改。其默認(rèn)掩碼(umask)通常為 022。掩碼可以和777做減法,從而得到755的權(quán)限。
1 --x 執(zhí)行 # Mode 764 = 執(zhí)行/讀/寫 | 讀/寫 | 讀 2 -w- 寫 # |---所有者|---用戶組|---其他用戶| 4 r-- 讀 ugo=a u=所有者, g=用戶組, o=其他用戶, a=所有用戶 # chmod [OPTION] MODE[,MODE] FILE # MODE 可以是 [ugoa]*([-+=]([rwxXst])) # chmod 640 /var/log/maillog # 更改 maillog 訪問權(quán)限為 -rw-r----- # chmod u=rw,g=r,o= /var/log/maillog # 同上 # chmod -R o-r /home/* # 遞歸去除所有其他用戶的可讀權(quán)限 # chmod u+s /path/to/prog # 在可執(zhí)行位設(shè)置 SUID (知道你在干什么!) # find / -perm -u+s -print # 查找所有設(shè)置過 SUID 位的程序 # chown user:group /path/to/file # 改變文件的所有者和文件關(guān)聯(lián)的組 # chgrp group /path/to/file # 改變文件關(guān)聯(lián)的組 # 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 # 顯示磁盤信息(扇區(qū)/大小) (FreeBSD) # hdparm -I /dev/sda # 顯示 IDE/ATA 磁盤信息 (Linux) # fdisk /dev/ad2 # 顯示和修改磁盤分區(qū)表 # smartctl -a /dev/ad2 # 顯示磁盤檢測(cè)信息Boot系統(tǒng)掛載點(diǎn)/磁盤使用情況
# mount | column -t # 顯示系統(tǒng)已掛載分區(qū)情況 # df # 顯示磁盤剩余空間和掛載的設(shè)備 # cat /proc/partitions # 顯示所有設(shè)備的所有分區(qū)(Linux)磁盤使用情況
# du -sh * # 列出當(dāng)前目錄下所有文件夾大小 # du -csh # 當(dāng)前目錄下所有目錄大小總數(shù) # du -ks * | sort -n -r # 由大到小排序顯示目錄大小 # ls -lSr # 由小到大顯示文件列表誰打開了那些文件
對(duì)于找出哪些文件阻止卸載分區(qū)并給出有代表性的錯(cuò)誤是有幫助的:
# umount /home/ umount: unmount of /home # 不能卸載,因?yàn)橛幸粋€(gè)文件鎖定了 homefailed: Device busy使用?fuser?或?lsof?在一個(gè)掛載點(diǎn)中查找已打開的文件:
# fuser -m /home # 列出訪問 /home 的進(jìn)程 # 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)關(guān)于一個(gè)應(yīng)用程序:
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關(guān)于單個(gè)文件:
# 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掛載/重掛載一個(gè)文件系統(tǒng)
舉個(gè) cdrom 的例子。如果已經(jīng)列于 /etc/fstab 中:
# mount /cdrom或在 /dev/ 中查找設(shè)備,亦或使用?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 掛載一個(gè) FreeBSD 分區(qū)
用 fdisk 查找分區(qū)號(hào),這通常是 root 分區(qū),但也可能是其他 BSD slice。如果 FreeBSD 有許多 slice,他們不列于同一個(gè) fdisk 分區(qū)表中,但可見于 /dev/sda* 或 /dev/hda* 中。
# fdisk /dev/sda # 查找 FreeBSD 分區(qū) /dev/sda3 * 5357 7905 20474842+ a5 FreeBSD # mount -t ufs -o ufstype=ufs2,ro /dev/sda3 /mnt /dev/sda10 = /tmp; /dev/sda11 /usr # 其他 slice重掛載
不用卸載一個(gè)設(shè)備來重掛載。 對(duì)?fsck?來說是必須的。舉個(gè)例子:
# mount -o remount,ro / # Linux # mount -o ro / # FreeBSD從 cdrom 拷貝原始數(shù)據(jù)進(jìn)一個(gè) iso 映像文件:
# dd if=/dev/cd0c of=file.iso給即時(shí)燒錄(on-the-fly)添加 swap
假設(shè)你需要很多的 swap (即刻),如一個(gè) 2GB 文件 /swap2gb (只限 Linux)。
# dd if=/dev/zero of=/swap2gb bs=1024k count=2000 # mkswap /swap2gb # 創(chuàng)建交換區(qū) # swapon /swap2gb # 激活這個(gè) swap?,F(xiàn)在可以使用了 # swapoff /swap2gb # 當(dāng)使用完畢,釋放這個(gè) swap # rm /swap2gb掛載一個(gè) SMB?共享
假設(shè)我們要訪問計(jì)算機(jī) 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 軟件包可以存儲(chǔ)認(rèn)證到一個(gè)文件中。例如,/home/user/.smb:
username=winuser password=winpwd現(xiàn)在可以像下面那樣掛載:
# 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 文件系統(tǒng)掛載鏡像文件創(chuàng)建并刻錄 ISO 鏡像文件
這將會(huì)拷貝 CD 或者 DVD 的扇區(qū)。當(dāng)不用?conv=notrunc,鏡像文件會(huì)等于 CD 內(nèi)容大小而非 CD 容量大小??聪旅婧?dd 例子。
# dd if=/dev/hdc of=/tmp/mycd.iso bs=2048 conv=notrunc使用 mkisofs 把目錄中所有文件創(chuàng)建成 CD/DVD 鏡像文件。克服文件名限制:-r 開啟 Rock Ridge 擴(kuò)展用于 Unix 系統(tǒng),-J 開啟 Joliet 擴(kuò)展用于微軟系統(tǒng)。-L 允許 ISO9660 文件名第一個(gè)字符為句點(diǎn)。
# mkisofs -J -L -r -V TITLE -o imagefile.iso /path/to/dir對(duì)于 FreeBSD,mkisofs 可以到 port 的 sysutils/cdrtools 中找到。
創(chuàng)建基于文件的鏡像文件
舉個(gè)例子,一個(gè)使用文件 /usr/vdisk.img 的 1GB 分區(qū)。這里我們使用 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?更快,但對(duì)于加密來說卻不夠安全。
# dd if=/dev/urandom of=/usr/vdisk.img bs=1024k count=1024 # losetup /dev/loop0 /usr/vdisk.img # 創(chuàng)建并聯(lián)結(jié) /dev/loop0 # mkfs.ext3 /dev/loop0 # mount /dev/loop0 /mnt # losetup -a # 查看已經(jīng)掛載的 loop 設(shè)備 # umount /mnt # losetup -d /dev/loop0 # Detach # rm /usr/vdisk.img創(chuàng)建基于內(nèi)存的文件系統(tǒng)
基于內(nèi)存的文件系統(tǒng)對(duì)于重量級(jí) IO 應(yīng)用程序來說非???。怎樣創(chuàng)建一個(gè)掛載到 /memdisk 的 64M 分區(qū):
# mount -t tmpfs -osize=64m tmpfs /memdisk磁盤性能
在 ad4s3c (/home) 分區(qū)上讀寫一個(gè) 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網(wǎng)絡(luò)
調(diào)試 (也可看流量分析)|路由|配置額外的 IP 地址|更改 MAC 地址|使用中的端口|防火墻|路由 IP 轉(zhuǎn)發(fā)|NAT - 網(wǎng)絡(luò)地址轉(zhuǎn)換|反向查詢|/etc/hosts|DHCP|通信量分析(Traffic analysis)|用 nmap 掃描|流量控制(QoS)
調(diào)試 (也可看流量分析)
# ethtool eth0 # 顯示以太網(wǎng)狀態(tài)(replaces mii-diag) # ethtool -s eth0 speed 100 duplex full # 把網(wǎng)卡 eth0 速度改為 100兆/秒,采用全雙工 # ethtool -s eth0 autoneg off # 禁用自動(dòng)協(xié)商模式 # ethtool -p eth1 # 閃爍網(wǎng)絡(luò)接口 LED 燈 - 如果支持的話,非常實(shí)用 # ip link show # 在 Linux 上顯示所有網(wǎng)絡(luò)接口(同 ifconfig 類似) # ip link set eth0 up # 使設(shè)備激活(或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 # 第一個(gè) IP # ifconfig eth0:0 192.168.51.254 netmask 255.255.255.0 # 第二個(gè) IP # ip addr add 192.168.50.254/24 dev eth0 # 等價(jià)命令 # ip addr add 192.168.51.254/24 dev eth0 label eth0:1更改 MAC 地址
通常在你更改之前先停下網(wǎng)絡(luò)接口。不要告訴我為什么你想改變 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對(duì)于 Windows 已經(jīng)有許多工具了。像?etherchange?;蛘呖纯?"Mac Makeup", "smac"。
使用中的端口
監(jiān)聽打開的端口:
# netstat -an | grep LISTEN # lsof -i # 列出所有因特網(wǎng)連接(Linux) # socklist # 列出打開的 socket (Linux) # sockstat -4 # 使用 socket 的應(yīng)用程序列表(FreeBSD) # netstat -anp --udp --tcp | grep LISTEN # Linux # netstat -tup # 列出活躍的連接(Linux) # netstat -tupl # 列出系統(tǒng)中正在監(jiān)聽的端口(Linux) # netstat -ano # Windows防火墻
檢查正在運(yùn)行的防火墻(只是典型配置):
# iptables -L -n -v # 狀態(tài)信息 Open the iptables firewall # iptables -P INPUT ACCEPT # 打開所有 # iptables -P FORWARD ACCEPT # iptables -P OUTPUT ACCEPT # iptables -Z # 把所有鏈的包及字節(jié)的計(jì)數(shù)器清空 # iptables -F # 清空所有鏈 # iptables -X # 刪除所有鏈路由 IP 轉(zhuǎn)發(fā)
查看然后啟用 IP 轉(zhuǎn)發(fā):
# cat /proc/sys/net/ipv4/ip_forward # 查看 IP 轉(zhuǎn)發(fā) 0=禁用, 1=啟用 # echo 1 > /proc/sys/net/ipv4/ip_forward或者編輯 /etc/sysctl.conf:
net.ipv4.ip_forward = 1NAT - 網(wǎng)絡(luò)地址轉(zhuǎn)換
# 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 # 轉(zhuǎn)發(fā)端口 20022 到內(nèi)部 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 # 轉(zhuǎn)發(fā) 993-995 范圍端口 # ip route flush cache # iptables -L -t nat # 查看 NAT 狀態(tài)信息使用 -D 替換 -A 來刪除端口轉(zhuǎn)發(fā)。
反向查詢
查找屬于一個(gè) 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
單個(gè)主機(jī)可以配置于文件 /etc/hosts 來代替本地正在運(yùn)行的?named?反向域名查詢。格式很簡(jiǎn)單,舉個(gè)例子:
78.31.70.238 sleepyowl.net sleepyowl對(duì)于 hosts 文件和 DNS 查詢之間的優(yōu)先級(jí),可在?/etc/nsswitch.conf?和?/etc/host.conf?中配置 order 名稱解析。
DHCP
一些發(fā)行版(SuSE)使用 dhcpcd 作為客戶端。默認(rèn)網(wǎng)絡(luò)接口是 eth0。
# dhcpcd -n eth0 # 觸發(fā)更新(并不總是可以工作) # dhcpcd -k eth0 # 釋放并關(guān)閉租約(lease)的全部信息存儲(chǔ)在:
/var/lib/dhcpcd/dhcpcd-eth0.info通信量分析(Traffic analysis)
Bmon?是一個(gè)小的流量監(jiān)控控制臺(tái),而且可以顯示不同的網(wǎng)絡(luò)接口的流量。
用 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 # 把數(shù)據(jù)報(bào)文寫入二進(jìn)制文件 # tcpdump -r traffic.rl0 # 從文件讀取數(shù)據(jù)報(bào)文(也可以使用 ethereal) # tcpdump port 80 # 兩個(gè)經(jīng)典命令 # tcpdump host google.com # tcpdump -i eth0 -X port \(110 or 143\) # 查看端口 110(POP) 或 143(IMAP)的數(shù)據(jù)報(bào)文 # tcpdump -n -i eth0 icmp # 只捕獲 ping # tcpdump -i eth0 -s 0 -A port 80 | grep GET # -s 0 為全部包, -A 為 ASCII另一些重要選項(xiàng):
- -A?? ? 顯示每個(gè)包清晰文本(除了報(bào)頭)
- -X?? ? 顯示包的 ASCII 文本
- -l?? ? 使標(biāo)準(zhǔn)輸出變?yōu)榫彌_行形式
- -D?? ? 顯示所有可用網(wǎng)絡(luò)接口
對(duì)于 Windows 可以使用?www.winpcap.org。使用 windump -D 來列出網(wǎng)絡(luò)接口。
用 nmap 掃描
Nmap?是一個(gè)用于 OS 探測(cè)的端口掃描工具,她通常在許多發(fā)行版上有安裝,并且同樣可用于 Windows。如果你不掃描你的服務(wù)器,駭客們會(huì)為你做這些...
# nmap cb.vu # 掃描主機(jī)上所有保留的 TCP 端口 # nmap -sP 192.168.16.0/24 # 找出在 0/24 上主機(jī)所使用的 IP # nmap -sS -sV -O cb.vu # 做秘密 SYN 掃描來探測(cè)系統(tǒng)和系統(tǒng)服務(wù)的版本信息 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)其他非標(biāo)準(zhǔn)但好用的工具有?hping?(www.hping.org),她是一個(gè) IP 分組組裝/分析器,和?fping?(fping.sourceforge.net)。fping 可以在一個(gè)循環(huán)隊(duì)列(round-robin fashion)中掃描多種主機(jī)。
流量控制(QoS)
流量控制管理著一個(gè)網(wǎng)絡(luò)的隊(duì)列、流量監(jiān)控、調(diào)度以及其他流量設(shè)置(traffic parameters)。以下簡(jiǎn)單實(shí)用的示例使用 Linux 和 FreeBSD 的能力來更好的利用帶寬。
上傳限制
DSL 或有線調(diào)制解調(diào)器有一個(gè)很長(zhǎng)的列隊(duì)來提高上傳吞吐量(upload throughput)。然而用一個(gè)快速的設(shè)備(如以太網(wǎng))填充這個(gè)列隊(duì)將大大減少交互性。這就是限制設(shè)備上傳速度有用的原因,以匹配調(diào)制解調(diào)器的實(shí)際能力,這可以有效提高交互性。設(shè)置大約為 modem 最大速度的 90%。
給 512K 上傳速度的 modem。
# tc qdisc add dev eth0 root tbf rate 480kbit latency 50ms burst 1540 # tc -s qdisc ls dev eth0 # 狀態(tài) # tc qdisc del dev eth0 root # 刪除隊(duì)列 # tc qdisc change dev eth0 root tbf rate 220kbit latency 50ms burst 1540服務(wù)質(zhì)量 (Quality of service)
使用?tc?的優(yōu)先級(jí)隊(duì)列來優(yōu)化 VoIP。在?voip-info.org?或?www.howtoforge.com?上可以看到完整的例子。假設(shè) VoIP 使用 UDP 端口 10000:11024 并且使用 eth0 設(shè)備(也可為 ppp0 或 so)。下列命令定義了三個(gè)隊(duì)列,并且用 QoS?0x1e(設(shè)置所有位) 強(qiáng)制 VOIP 流量到隊(duì)列 1。默認(rèn)流量流入隊(duì)列 3,Qos?Minimize-Delay?流入隊(duì)列 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 # 使用服務(wù)端端口范圍match ip dst 123.23.0.1 flowid 1:1 # 或/和使用服務(wù)器 IP狀態(tài)和移除:
# tc -s qdisc ls dev eth0 # queue status # tc qdisc del dev eth0 root # delete all QoS計(jì)算端口范圍和掩碼 (mask)
用你所計(jì)算的端口掩碼來定義 tc 過濾器的端口范圍。查詢 2^N 端口范圍結(jié)尾,推斷范圍并轉(zhuǎn)換成十六進(jìn)制。這就是你的掩碼 (mask)。例如 10000 -> 11024,它的范圍是 1024。
# 2^13 (8192) < 10000 < 2^14 (16384) # 結(jié)尾是 2^14 = 16384 # echo "obase=16;(2^14)-1024" | bc # 掩碼是 0x3C00?
實(shí)用命令
less|vi|mail|tar|dd|screen|Find|混雜的
less
less?命令用來在控制臺(tái)中分屏顯示文本文檔。它在許多發(fā)行版中可用。
# less unixtoolbox.xhtml一些重要指令(^N 代表 [control]-[N]):
- h H?? ? ? 顯示指令的匯總列表
- f ^F ^V SPACE?? ? ? 向前滾動(dòng)一屏(或者 N 行)
- b ^B ESC-v?? ? ? 向后滾動(dòng)一屏(或者 N 行)
- F?? ? ? 向前滾動(dòng);類似于"tail -f"
- /pattern?? ? ? 向前搜索匹配該模式的行
- ?pattern?? ? ? 向后搜索匹配該模式的行
- n?? ? ? 重復(fù)之前的搜索
- N?? ? ? 反方向重復(fù)之前的搜索
- q?? ? ? 退出
vi
Vi 在任何 Linux/Unix 發(fā)行安裝版(gentoo 沒有?)上都存在。因此,我們有必要了解一些基本的命令。Vi 有兩個(gè)模式:命令模式和插入模式。使用?[ESC]?鍵可進(jìn)入命令模式,使用?i?鍵可進(jìn)入插入模式。如果你迷失了,可在命令模式下鍵入?: help。
編輯器?nano?和?pico?通常也都可用,而且更容易(IMHO)使用。
Quit
- :w?newfilename ? ? ? 保存文件為 newfilename
- :wq or :x?? ? ? 保存并退出
- :q!?? ? ? 退出但不保存
移動(dòng)和查找
- /string?? ? ? 向前查找 string
- ?string?? ? ? 向后查找 string
- n?? ? ? 同方向重復(fù)上一次搜索命令
- N?? ? ? 反方向重復(fù)上一次搜索命令
- {?? ? ? 光標(biāo)移至段落結(jié)尾
- }?? ? ? 光標(biāo)移至段落開頭
- 1G?? ? ? 光標(biāo)移至文件的第一行首
- nG?? ? ? 光標(biāo)移至文件的第 n 行首
- G?? ? ? 光標(biāo)移至文件的最后一行首
- :%s/OLD/NEW/g?? ? ? 替換所有查找到的 OLD 為 NEW
刪除文本
- dd?? ? ? 刪除當(dāng)前行
- D?? ? ? 刪除光標(biāo)到當(dāng)前行末尾的字符
- dw?? ? ? 刪除單詞
- x?? ? ? 刪除字符
- u?? ? ? 回復(fù)上一次操作
- U?? ? ? 回復(fù)所有此行的更改
mail?命令是一個(gè)讀取和發(fā)送郵件的應(yīng)用程序,她通常已安裝。要發(fā)送一封郵件,可以簡(jiǎn)單的輸入 "mail user@domain"。其第一行為主題,然后是郵件內(nèi)容。在一個(gè)新行中使用單個(gè)點(diǎn)(.)來結(jié)束并發(fā)送郵件。例子:
# 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也是測(cè)試郵件服務(wù)器的簡(jiǎn)單方法。
tar
命令?tar?(磁帶存檔) 可以為文件和目錄創(chuàng)建檔案。歸檔文件 .tar 是未壓縮的,一個(gè)壓縮過的歸檔文件的后綴是 .tgz 或 .tar.gz (zip) 或者 .tbz (bzip2)。不要使用絕對(duì)路徑建立一個(gè)歸檔文件,你可能要解開這個(gè)歸檔文件到某個(gè)地方。一些常用命令如下:
創(chuàng)建
# cd / # tar -cf home.tar home/ # 歸檔整個(gè) /home 目錄(c 為創(chuàng)建) # tar -czf home.tgz home/ # 等同于 zip 壓縮 # tar -cjf home.tbz home/ # 等同于 bzip2 壓縮從一個(gè)目錄樹中只包含一個(gè)(或2個(gè))目錄,并保持相對(duì)目錄結(jié)構(gòu)。舉個(gè)例子,/usr/local/etc 和 /usr/local/www,它們?cè)跉w檔文件中的第一層目錄是 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 # 釋放單個(gè)文件更高級(jí)的
# tar c dir/ | gzip | ssh user@remote 'dd of=dir.tgz' # 歸檔壓縮 dir/ 目錄并存儲(chǔ)到遠(yuǎn)程主機(jī)上 # tar cvf - `find . -print` > backup.tar # 歸檔當(dāng)前目錄 # tar -cf - -C /etc . | tar xpf - -C /backup/etc # 拷貝目錄 # tar -cf - -C /etc . | ssh user@remote tar xpf - -C /backup/etc # 遠(yuǎn)程拷貝 # tar -czf home.tgz --exclude '*.o' --exclude 'tmp/' home/dd
程序?dd?(磁盤備份(disk dump) 或 destroy disk,也可看?dd 的含義) 用來拷貝分區(qū)、磁盤或者其它拷貝。通常這么用:
# dd if=<source> of=<target> bs=<byte size> conv=<conversion>重要的 conv 選項(xiàng):
- notrunc?? ? ? 不截短輸出文件
- noerror?? ? ? 出錯(cuò)時(shí)不停止處理(e.g. 壞扇區(qū))
- sync?? ? ? 把每個(gè)輸入塊填充到ibs個(gè)字節(jié),不足部分用空(NUL)字符補(bǔ)齊
默認(rèn)字節(jié)大小為 512 (一個(gè)扇區(qū))。MBR 處于磁盤的第一個(gè)扇區(qū),之后的 63 個(gè)扇區(qū)是空的。較大的字節(jié)大小可以加快拷貝速度但也需要更多的內(nèi)存。
備份和恢復(fù)
# 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 # 恢復(fù) / # dd bs=1M if=/dev/ad4s3e | gzip -c > ad4s3e.gz # 壓縮備份 # gunzip -dc ad4s3e.gz | dd of=/dev/ad0s3e bs=1M # 解壓恢復(fù) # dd bs=1M if=/dev/ad4s3e | gzip | ssh eedcoba@fry 'dd of=ad4s3e.gz' # 也可為遠(yuǎn)程的 # 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# 如果目標(biāo)(ad2)比較小,這是必須的。恢復(fù)
該?dd?命令會(huì)讀取分區(qū)的每一個(gè)區(qū)塊,即所有區(qū)塊。對(duì)于有問題的區(qū)塊,最好使用?conv=sync,noerror?選項(xiàng),dd 將會(huì)跳過壞的區(qū)塊并入 0。因此,這就是設(shè)置塊大小等于或小于磁盤塊大小的重要性。1k 大小似乎安全,用?bs=1k?來設(shè)置它。假如一個(gè)磁盤有壞扇區(qū)并且有個(gè)分區(qū)的數(shù)據(jù)要恢復(fù),那么用 dd 工具創(chuàng)建一個(gè)鏡像文件,掛載這個(gè)鏡像文件,然后拷貝內(nèi)容到新的磁盤中。如果用了?noerror?選項(xiàng),dd 會(huì)跳過壞扇區(qū)并寫入 0,也即壞扇區(qū)中的內(nèi)容會(huì)丟失。
# dd if=/dev/hda of=/dev/null bs=1m # 檢查壞扇區(qū) # dd bs=1k if=/dev/hda1 conv=sync,noerror,notrunc | gzip | ssh \ # 發(fā)送到遠(yuǎn)程 root@fry 'dd of=hda1.gz bs=1k' # dd bs=1k if=/dev/hda1 conv=sync,noerror,notrunc of=hda1.img # 存儲(chǔ)為一個(gè)映像文件 # mount -o loop /hda1.img /mnt # 掛載這個(gè)映像文件 # rsync -ax /mnt/ /newdisk/ # 拷貝到一個(gè)新磁盤 # dd if=/dev/hda of=/dev/hda # 刷新磁狀態(tài)# 上面的命令對(duì)于刷新磁盤(refresh disk)很有用。這絕對(duì)安全,但必須先卸載磁盤。刪除
# dd if=/dev/zero of=/dev/hdc # 刪除全部數(shù)據(jù) # dd if=/dev/urandom of=/dev/hdc # 更好的刪除全部數(shù)據(jù) # kill -USR1 PID # 查看 dd 進(jìn)度(僅Linux!)MBR 技巧
MBR 包含了引導(dǎo)程序和分區(qū)表,它的大小為 512 字節(jié)。前 446 字節(jié)為引導(dǎo)程序,446 到 512 字節(jié)為分區(qū)表。
# 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 和分區(qū)表 # dd if=/mbr_sda.bak of=/dev/sda bs=512 count=1 # 完全恢復(fù)MBR # dd if=/mbr_sda.bak of=/dev/sda bs=446 count=1 # 僅回復(fù)引導(dǎo)程序 # dd if=/mbr_sda.bak of=/dev/sda bs=1 count=64 skip=446 seek=446 # 恢復(fù)分區(qū)表screen
Screen 提供了兩個(gè)主要功能:
- 在一個(gè)終端內(nèi)運(yùn)行多個(gè)終端會(huì)話(terminal session)。
- 一個(gè)已啟動(dòng)的程序與運(yùn)行它的真實(shí)終端分離的,因此可運(yùn)行于后臺(tái)。真實(shí)的終端可以被關(guān)閉,還可以在稍后再重新接上(reattached)。
簡(jiǎn)短實(shí)例
開啟 screen:
# screen在 screen 會(huì)話中,我們可以開啟一個(gè)長(zhǎng)時(shí)間運(yùn)行的程序(如 top)。Detach 這個(gè)終端,之后可以從其他機(jī)器 reattach 這個(gè)相同的終端(比如通過 ssh)。
# top現(xiàn)在用?Ctrl-a Ctrl-d?來 detach。Reattach 終端:
# screen -r或更好的:
# screen -R -D現(xiàn)在 attach 到這里。具體意思是:先試圖恢復(fù)離線的 screen 會(huì)話。若找不到離線的 screen 會(huì)話,即建立新的 screen 會(huì)話給用戶。
Screen 命令 (在 screen 中)
所有命令都以?Ctrl-a?開始。
- Ctrl-a ??各功能的幫助摘要
- Ctrl-a c?創(chuàng)建一個(gè)新的 window (終端)
- Ctrl-a Ctrl-n 和 Ctrl-a Ctrl-p?切換到下一個(gè)或前一個(gè) window
- Ctrl-a Ctrl-N?N 為 0 到 9 的數(shù)字,用來切換到相對(duì)應(yīng)的 window
- Ctrl-a "?獲取所有正在運(yùn)行的 window 的可導(dǎo)航的列表
- Ctrl-a a?清楚錯(cuò)誤的 Ctrl-a
- Ctrl-a Ctrl-d?斷開所有會(huì)話,會(huì)話中所有任務(wù)運(yùn)行于后臺(tái)
- Ctrl-a x?用密碼鎖柱 screen 終端
當(dāng)程序內(nèi)部運(yùn)行終端關(guān)閉并且你登出該終端時(shí),該 screen 會(huì)話就會(huì)被終止。
Find
一些重要選項(xiàng):
- -x?(BSD)?-xdev?(Linux) ? ? ? 留于同一文件系統(tǒng) (fstab 中的 dev)
- -exec cmd {} \;?? ? ? 執(zhí)行命令并用全路徑替換 {}
- -iname?? ? ? 同 -name 一樣,但不區(qū)分大小寫
- -ls?? ? ? 顯示關(guān)于文件的信息(同 ls -la)
- -size n?? ? ? n 為 +-n (k M G T P)
- -cmin n?? ? ? 查找系統(tǒng)中最后 n 分鐘改變文件狀態(tài)的文件
小心 xarg 或 exec,因?yàn)楫?dāng)文件或目錄中包含空格時(shí)可能會(huì)返回錯(cuò)誤的結(jié)果。在有疑惑時(shí)用 "-print0 | xargs -0" 代替 "| xargs"。選項(xiàng) -print0 必須在 find 命令的最后??催@個(gè)不錯(cuò)的?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 # 顯示一個(gè)命令執(zhí)行完成所用的時(shí)間 # time cat # 使用 time 作為秒表,用 Ctrl-c 來停止 # set | grep $USER # 列顯當(dāng)前環(huán)境變量 # cal -3 # 顯示三個(gè)月日歷 # date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] # date 10022155 # 設(shè)置日期和時(shí)間 # whatis grep # 顯示命令的簡(jiǎn)短信息 # whereis java # 查詢命令的的路徑和標(biāo)準(zhǔn)目錄 # setenv varname value # 設(shè)置環(huán)境變量,設(shè)置變量 varname 的值為 value (csh/tcsh) # export varname="value" # 設(shè)置環(huán)境變量,設(shè)置變量 varname 的值為 value (sh/ksh/bash) # pwd # 顯示當(dāng)前工作目錄 # mkdir -p /path/to/dir # 如果存在不顯示錯(cuò)誤,建立所需的上級(jí)目錄 # mkdir -p project/{bin,src,obj,doc/{html,man,pdf},debug/some/more/dirs} # rmdir /path/to/dir # 移除目錄 # rm -rf /path/to/dir # 移除目錄和其內(nèi)容(強(qiáng)制) # cp -la /dir1 /dir2 # 存檔、硬連接目錄所有文件,用來替代拷貝 # cp -lpR /dir1 /dir2 # 同上 (FreeBSD) # cp unixtoolbox.xhtml{,.bak} # 拷貝文件成新擴(kuò)展名的快速方法 # mv /dir1 /dir2 # 修改目錄名?
媒體轉(zhuǎn)換
文本編碼|視頻轉(zhuǎn)換|拷貝音頻光盤
有時(shí)候需要轉(zhuǎn)換一個(gè)視頻、音頻文件或者文檔成其他格式。
文本編碼
文本編碼可以得到完全錯(cuò)誤的,特別是當(dāng)語言需要某些特殊字符像 à??。命令?iconv?可以從一個(gè)編碼轉(zhuǎn)換成另一個(gè)編碼。
# iconv -f <from_encoding> -t <to_encoding> <input_file> # iconv -f ISO8859-1 -t UTF-8 -o file.input > file_utf8 # iconv -l # 列顯系統(tǒng)所支持的字符編碼若文檔顯示良好,通常都可不使用 -f 選項(xiàng),iconv 會(huì)使用本地字符集(char-set)。
視頻轉(zhuǎn)換
使用 mpeg4 編碼壓縮佳能數(shù)碼相機(jī)視頻并修復(fù)無用音質(zhì)。
# 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對(duì)于聲音的處理可看?sox。
拷貝音頻光盤
程序?cdparanoia?可以保存音軌(FreeBSD port 在 audio/cdparanoia/),oggenc?可編碼 Ogg Vorbis 格式,lame?可轉(zhuǎn)換成 mp3。
# cdparanoia -B # 拷貝音軌成 wav 文件到當(dāng)前目錄列表(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 系統(tǒng)上,并且用她寫的腳本是(完全)可移植的;?man 1 sh?是一個(gè)好的參考。
基礎(chǔ)
變量和參數(shù)
使用?variable=value?的命令格式設(shè)置變量,其中 variable 是變量名稱,value是打算賦給該變量的值。使用 $variable 獲取變量值。
MESSAGE="Hello World" # 賦予一個(gè)字符串 PI=3.1415 # 賦予一個(gè)十進(jìn)制小數(shù) N=8 TWON=`expr $N * 2` # 算術(shù)表達(dá)式(只限整數(shù)) TWON=$(($N * 2)) # 另一種語法 TWOPI=`echo "$PI * 2" | bc -l` # 使用 bc 進(jìn)行浮點(diǎn)運(yùn)算 ZERO=`echo "c($PI/4)-sqrt(2)/2" | bc -l`命令行參數(shù):
$0, $1, $2, ... # $0 命令本身 $# # 命令參數(shù)個(gè)數(shù) $* # 所有參數(shù)(也可以是 $@)一些特殊的變量
$$ # 當(dāng)前進(jìn)程 ID $? # 最后命令退出狀態(tài)碼commandif [ $? != 0 ]; thenecho "command failed"fi mypath=`pwd` mypath=${mypath}/file.txt echo ${mypath##*/} # 只顯示文件名 echo ${mypath%%.*} # 除了擴(kuò)展名的全路徑 var2=${var:=string} # 如果var沒有被賦值,則string值先賦值給var,# 然后再賦值給var2結(jié)構(gòu)控制
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 為方法的第一個(gè)參數(shù) } myfunction "txt"產(chǎn)生一個(gè)文件
MYHOME=/home/colin cat > testhome.sh << _EOF # 所有_EOF前的代碼都會(huì)進(jìn)入到 testhome.sh 文件中去 if [ -d "$MYHOME" ] ; thenecho $MYHOME exists elseecho $MYHOME does not exist fi _EOF sh testhome.shBourne 腳本實(shí)例
來一個(gè)小實(shí)例,此腳本從本 xhtml 文檔創(chuàng)建一個(gè) PDF 小冊(cè)子:
#!/bin/sh # 此腳本可以創(chuàng)建一份供雙面打印機(jī)打印的 PDF 格式的書 if [ $# -ne 1 ]; then # 檢查參數(shù)是否等于 1echo 1>&2 "Usage: $0 HtmlFile"exit 1 # 如果不等于1,非0退出 fifile=$1 # 文件變量 fname=${file%.*} # 文件名變量 fext=${file#*.} # 文件擴(kuò)展名變量prince $file -o $fname.pdf # www.princexml.com pdftops -paper A4 -noshrink $fname.pdf $fname.ps # 創(chuàng)建 postscript 小冊(cè)子 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 命令的金礦。還有一個(gè)很好的?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> 結(jié)尾的行 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 # 為文件添加行號(hào)正則表達(dá)式
一些基本的正則表達(dá)式同樣可用于 sed。作為一個(gè)良好的啟蒙,可看?基本正則語法。
[\^$.|?*+() # 特殊字符,其他字符將匹配自身 \ # 轉(zhuǎn)義特殊字符,當(dāng)成普通字符對(duì)待 * # 重復(fù)前項(xiàng) 0 次或多次 . # 單個(gè)字符除換行符 .* # 匹配 0 個(gè)或多個(gè)字符 ^ # 匹配字符串行開始處 $ # 匹配字符串行結(jié)尾處 .$ # 匹配字符串行最后一個(gè)字符 ^ $ # 匹配單個(gè)空格的行 [^A-Z] # 匹配任何以 A-Z 字符開始的行一些實(shí)用命令
下列命令對(duì)于包含于一個(gè)腳本或者單行命令來說很有用。
sort -t. -k1,1n -k2,2n -k3,3n -k4,4n # 排序 IPv4 格式的 IP 地址 echo 'Test' | tr '[:lower:]' '[:upper:]' # 轉(zhuǎn)換成大寫 echo foo.bar | cut -d . -f 1 # 返回 foo PID=$(ps | grep script.sh | grep bin | awk '{print $1}') # 正在運(yùn)行名為 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":" \ # 創(chuàng)建 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 炸彈。會(huì)干掉你的機(jī)器 tail +2 file > file2 # 刪除文件的第一行我使用一種小伎倆來一次更改許多文件的擴(kuò)展名。舉個(gè)例子,從 .cxx 到 .cpp。排除最后的?| sh?先測(cè)試一下。你同樣可以使用命令?rename?來做這些,如果安裝了的話?;蛘呤褂?bash 內(nèi)建命令。
# 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 內(nèi)建的?
在線幫助
文檔
| Linux 文檔 | en.tldp.org |
| Linux Man Pages | www.linuxmanpages.com |
| Linux 命令目錄 | www.oreillynet.com/linux/cmd |
| Linux doc man howtos | linux.die.net |
| FreeBSD 手冊(cè) | 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 |
總結(jié)
以上是生活随笔為你收集整理的Unix/Linux/BSD命令大全|实用指南的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java dht 爬虫_DHT爬虫(go
- 下一篇: linux zsh 终端,linux 终