日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

發布時間:2024/8/1 linux 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 中的信息。

# 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 # 在使用的文件句柄數

運行級別

一旦內核加載完成,內核會啟動?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) # 關閉停止系統

?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

編譯內核

# 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 = 1

NAT - 網絡地址轉換

# 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?命令是一個讀取和發送郵件的應用程序,她通常已安裝。要發送一封郵件,可以簡單的輸入 "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 分鐘改變文件狀態的文件
# find . -type f ! -perm -444 # 尋找所有無法讀取的文件 # find . -type d ! -perm -111 # 尋找所有無法訪問的目錄 # find /home/user/ -cmin 10 -print # 尋找最后 10 分鐘創建或修改的文件 # find . -name '*.[ch]' | xargs grep -E 'expr' # 在當前目錄及子目錄搜索 'expr' 表達式 # find / -name "*.core" | xargs rm # 尋找 core 垃圾并刪除它們(也可試試 core.*) # find / -name "*.core" -print -exec rm {} \; # 另一種語法# 尋找圖像文件并創建一個歸檔文件,iname 為不區分大小寫。-r 為附加 # find . \( -iname "*.png" -o -iname "*.jpg" \) -print -exec tar -rf images.tar {} \; # find . -type f -name "*.txt" ! -name README.txt -print # 除 README.txt 的文件 # find /var/ -size +10M -exec ls -lh {} \; # 查找 > 10 MB 的文件 # find /var/ -size +10M -ls # 這個更簡單 # find . -size +10M -size -50M -print # find /usr/ports/ -name work -type d -print -exec rm -rf {} \; # 清理 port# 以 SUID 查找文件;這些文件很脆弱,必須保持安全。 # find / -type f -user root -perm -4000 -exec ls -l {} \;

小心 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.sh

Bourne 腳本實例

來一個小實例,此腳本從本 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 Pageswww.linuxmanpages.com
Linux 命令目錄www.oreillynet.com/linux/cmd
Linux doc man howtoslinux.die.net
FreeBSD 手冊www.freebsd.org/handbook
FreeBSD Man Pageswww.freebsd.org/cgi/man.cgi
FreeBSD 用戶 wikiwww.freebsdwiki.net
Solaris Man Pagesdocs.sun.com/app/docs/coll/40.10

其他 Unix/Linux 參考

Rosetta Stone for Unixbhami.com/rosetta.html (a Unix command translator)
Unix guide cross referenceunixguide.net/unixguide.shtml
Linux 命令行列表www.linuxguide.it/commands_list.php
Short Linux referencewww.pixelbeat.org/cmdline.html

總結

以上是生活随笔為你收集整理的Unix/Linux/BSD命令大全|实用指南的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。