linux命令备忘录
生活随笔
收集整理的這篇文章主要介紹了
linux命令备忘录
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
系統
硬件?|?狀態信息?|?用戶?|?限制?|?運行級別?|?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 中獲取的硬件信息FreeBSD
# sysctl hw.model # CPU 訊息 # sysctl hw # 得到很多硬件信息 # sysctl vm # 虛擬內存使用情況 # dmesg | grep "real mem" # 物理內存 # sysctl -a | grep mem # 內核內存的設置和信息 # sysctl dev # 顯示當前核心配置的設備 # pciconf -l -cv # 顯示 PCI 設備 # usbdevs -v # 顯示 USB 設備 # atacontrol list # 顯示 ATA 設備顯示狀態信息
以下的命令有助于找出正在系統中運行著的程序。 # top # 顯示和更新使用 cpu 最多的進程 # mpstat 1 # 顯示進程相關的信息 # vmstat 2 # 顯示虛擬內存的狀態信息 # iostat 2 # 顯示 I/O 狀態信息(2 秒 間隙) # systat -vmstat 1 # 顯示 BSD 系統狀態信息(1 秒 間隙) # systat -tcp 1 # 顯示 BSD TCP 連接信息(也可以試試 -ip) # systat -netstat 1 # 顯示 BSD 當前網絡連接信息 # systat -ifstat 1 # 顯示 BSD 當前網卡帶寬信息 # systat -iostat 1 # 顯示 BSD CPU 和磁盤使用情況 # tail -n 500 /var/log/messages # 顯示最新500條內核/系統日志的信息 # tail /var/log/warn # 顯示系統警告信息(看syslog.conf)用戶
# id # 顯示當前用戶和用戶組的 ID # last # 列出目前與過去登入系統的用戶相關信息 # who # 顯示目前登入系統的用戶信息 # groupadd admin # 建立新組"admin"和添加新用戶 colin 并加入 admin 用戶組(Linux/Solaris) # useradd -c "Colin Barschel" -g admin -m colin # userdel colin # 刪除用戶 colin(Linux/Solaris) # adduser joe # FreeBSD 添加用戶 joe(交互式) # rmuser joe # FreeBSD 刪除用戶 joe(交互式) # pw groupadd admin # 在 FreeBSD 上使用 pw # pw groupmod admin -m newmember # 添加新用戶到一個組 # pw useradd colin -c "Colin Barschel" -g admin -m -s /bin/tcsh # pw userdel colin; pw groupdel admin 加密過的密碼存儲在 /etc/shadow (Linux and Solaris) 或 /etc/master.passwd (FreeBSD) 中. 如果手動修改了 master.passwd,需要運行?# pwd_mkdb -p master.passwd?來重建數據庫。使用 nologin 來臨時阻止所有用戶登錄(root除外)。用戶登錄時將會顯示 nologin 中的信息。 # echo "Sorry no login now" > /etc/nologin # (Linux) # echo "Sorry no login now" > /var/run/nologin # (FreeBSD)
限制
某些應用程序需要設置可打開最大文件和 socket 數量(像代理服務器,數據庫)。 默認限制通常很低。Linux
每 shell/腳本
shell 的限制是受?ulimit?支配的。使用?ulimit -a?可查看其狀態信息。 舉個例子,改變可打開最大文件數從 1024 到 10240,可以這么做: # ulimit -n 10240 # 這只在shell中有用 ulimit?命令可以使用在腳本中來更改對此腳本的限制。每 用戶/進程
登錄用戶和應用程序的限制可以在?/etc/security/limits.conf?中配置。舉個例子: # cat /etc/security/limits.conf * hard nproc 250 # 限制所有用戶進程數 asterisk hard nofile 409600 # 限制應用程序可打開最大文件數系統級
用sysctl來設置內核限制。要使其永久,可以在?/etc/sysctl.conf?中進行配置。 # sysctl -a # 顯示所有系統限制 # sysctl fs.file-max # 顯示系統最大文件打開數 # sysctl fs.file-max=102400 # 更改系統最大文件打開數 # cat /etc/sysctl.conf fs.file-max=102400 # 在 sysctl.conf 中的永久項 # cat /proc/sys/fs/file-nr # 在使用的文件句柄數FreeBSD
每 shell/腳本
在 csh 或 tcsh 中使用?limits?命令,在 sh 或 bash 中使用?ulimit?命令。每 用戶/進程
在?/etc/login.conf?中配置登錄后的默認限制。未作限制的值為系統最大限制值。系統級
內核限制同樣使用 sysctl 來設置。永久配置,在?/etc/sysctl.conf?或?/boot/loader.conf?中。其語法與 Linux 相同,只是鍵值不同。 # sysctl -a # 顯示所有系統限制 # sysctl kern.maxfiles=XXXX # 最大文件描述符數 kern.ipc.nmbclusters=32768 # 在 /etc/sysctl.conf 中的永久項 kern.maxfiles=65536 # Squid 通常用這個值 kern.maxfilesperproc=32768 kern.ipc.somaxconn=8192 # TCP 列隊。apache/sendmail 最好用這個值 # sysctl kern.openfiles # 在使用的文件描述符數 # sysctl kern.ipc.numopensockets # 已經開啟的 socket 數目 詳情請看?FreeBSD 手冊 11章。Solaris
在?/etc/system?中的下列設置,會提高每個進程可以打開最大文件描述符的數量: set rlim_fd_max = 4096 # 一個進程可以打開文件描述符的"硬"限制 set rlim_fd_cur = 1024 # 一個進程可以打開文件描述符的"軟"限制運行級別
Linux
一旦內核加載完成,內核會啟動?init?進程,然后運行?rc?腳本,之后運行所有屬于其運行級別的命令腳本。這些腳本都儲存在 /etc/rc.d/rcN.d 中(N代表運行級別),并且都建立著到 /etc/init.d 子目錄中命令腳本程序的符號鏈接。默認運行級別配置在 /etc/inittab 中。它通常為 3 或 5: # grep default: /etc/inittab id:3:initdefault: 可以使用?init?來改變當前運行級別。舉個例子: # init 5 # 進入運行級別 5 運行級別列表如下:
- 0 ? ? ? 系統停止
- 1 ? ? ? 進入單用戶模式(也可以是 S)
- 2 ? ? ? 沒有 NFS 特性的多用戶模式
- 3 ? ? ? 完全多用戶模式(正常操作模式)
- 4 ? ? ? 未使用
- 5 ? ? ? 類似于級別3,但提供 XWindow 系統登錄環境
- 6 ? ? ? 重新啟動系統
FreeBSD
BSD 啟動步驟不同于 SysV, 她沒有運行級別。她的啟動狀態(單用戶,有或沒有 XWindow)被配置在?/etc/ttys中。所有的系統腳本都位于?/etc/rc.d/中,第三方應用程序位于?/usr/local/etc/rc.d/中。service 的啟動順序被配置在?/etc/rc.conf?和/etc/rc.conf.local中。默認行為可在?/etc/defaults/rc.conf?中進行配置。 這些腳本至少響應 start|stop|status. # /etc/rc.d/sshd status sshd is running as pid 552. # shutdown now # 進入單用戶模式 # exit # 返回到多用戶模式 # shutdown -p now # 關閉停止系統 # shutdown -r now # 重新啟動系統 同樣可以使用進程?init?進入下列狀態級別。舉個例子:?# init 6?為重啟。- 0 ? ? ? 停止系統并關閉電源 (信號?USR2)
- 1 ? ? ? 進入單用戶模式 (信號?TERM)
- 6 ? ? ? 重新啟動 (信號?INT)
- c ? ? ? 阻止進一步登錄 (信號?TSTP)
- q ? ? ? 重新檢查 ttys(5) 文件 (信號?HUP)
重設 root 密碼
Linux 方法 1
在引導加載器(lilo 或 grub)中,鍵入如下啟選項: init=/bin/sh 內核會掛載 root 分區,進程?init?會啟動 bourne shell 而不是?rc,然后是運行級別。使用命令?passwd?設置密碼然后重啟。別忘了需要在單用戶模式下做這些動作。如果重啟后 root 分區被掛載為只讀,重新掛在它為讀寫: # mount -o remount,rw / # passwd # 或者刪除 root 密碼 (/etc/shadow) # sync; mount -o remount,ro / # sync 在重新掛在為只讀之前 sync 一下 # reboot
FreeBSD 和 Linux 方法 2
FreeBSD 不會讓你這么做。解決方案是用其他操作系統(像系統緊急修復光盤)掛載 root 分區,然后更改密碼。- 用 live cd 或安裝盤啟動進入修復模式后,會得到一個 shell。
- 用 fdisk 查找 root 分區。比如:fdisk /dev/sda
- 掛載它并使用 chroot 命令:
內核模塊
Linux
# lsmod # 列出所有已載入內核的模塊 # modprobe isdn # 載入 isdn 模塊FreeBSD
# kldstat # 列出所有已載入內核的模塊 # kldload crypto # 載入 crypto 模塊編譯內核
Linux
# cd /usr/src/linux # make mrproper # 清除所有東西,包括配置文件 # make oldconfig # 從當前內核配置文件的基礎上創建一個新的配置文件 # make menuconfig # 或者 xconfig (Qt) 或者 gconfig (GTK) # make # 創建一個已壓縮的內核映像文件 # make modules # 編譯模塊 # make modules_install # 安裝模塊 # make install # 安裝內核 # rebootFreeBSD
要改變和重建內核,需要拷貝源配置文件然后編輯它。當然也可以直接編輯?GENERIC?文件。 # cd /usr/src/sys/i386/conf/ # cp GENERIC MYKERNEL # cd /usr/src # make buildkernel KERNCONF=MYKERNEL # make installkernel KERNCONF=MYKERNEL 要重建完全的操作系統: # make buildworld # 構建完全的系統,但不是內核 # make buildkernel # 使用 KERNCONF 配置文件編譯內核 # make installkernel # reboot # mergemaster -p # 建立臨時根環境并比對系統配置文件 # make installworld # mergemaster # 升級所有配置和其他文件 # reboot 對于源的一些小改動,有時候簡單的命令就足夠了: # make kernel world # 編譯并安裝內核和系統 # mergemaster # reboot進程
列表?|?優先級?|?后臺/前臺?|?Top?|?Kill
進程列表
PID是每個進程唯一號碼。使用?ps?獲取所有正在運行的進程列表。 # ps -auxefw # 所有正在運行進程的詳盡列表 然而,更典型的用法是使用管道或者?pgrep: # ps axww | grep 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?|?磁盤使用情況?|?已打開的文件?|?掛載/重掛?|?掛載 SMB?|?掛載映像文件?|?Burn ISO?|?Create image?|?Memory disk?|?Disk performance
權限
用?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
FreeBSD
如果新內核不能引導,要引導一個舊內核,停止啟動倒計時,做如下動作: # unload # load kernel.old # boot系統掛載點/磁盤使用情況
# mount | column -t # 顯示系統已掛載分區情況 # df # 顯示磁盤剩余空間和掛載的設備 # cat /proc/partitions # 顯示所有設備的所有分區(Linux)磁盤使用情況
# du -sh * # 列出當前目錄下所有文件夾大小 # du -csh # 當前目錄下所有目錄大小總數 # du -ks * | sort -n -r # 由大到小排序顯示目錄大小 # ls -lSr # 由小到大顯示文件列表誰打開了那些文件
對于找出哪些文件阻止卸載分區并給出有代表性的錯誤是有幫助的: # umount /home/ umount: unmount of /home # 不能卸載,因為有一個文件鎖定了 homefailed: Device busyFreeBSD 和大多數 Unix
# fstat -f /home # 對于一個掛載點 # fstat -p PID # 對于一個應用程序進程 ID # fstat -u user # 對于一個用戶 查找已打開日志文件(或其他已打開文件), 比如 Xorg: # ps ax | grep Xorg | awk '{print $1}' 1252 # fstat -p 1252 USER CMD PID FD MOUNT INUM MODE SZ|DV R/W root Xorg 1252 root / 2 drwxr-xr-x 512 r root Xorg 1252 text /usr 216016 -rws--x--x 1679848 r root Xorg 1252 0 /var 212042 -rw-r--r-- 56987 w 在 /var 中的只有一個 inum 為 212042 的文件: # find -x /var -inum 212042 /var/log/Xorg.0.logLinux
使用?fuser?或?lsof?在一個掛載點中查找已打開的文件: # fuser -m /home # 列出訪問 /home 的進程 # lsof /home COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME tcsh 29029 eedcoba cwd DIR 0,18 12288 1048587 /home/eedcoba (guam:/home) lsof 29140 eedcoba cwd DIR 0,18 12288 1048587 /home/eedcoba (guam:/home) 關于一個應用程序: ps ax | grep Xorg | awk '{print $1}' 3324 # lsof -p 3324 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME Xorg 3324 root 0w REG 8,6 56296 12492 /var/log/Xorg.0.log 關于單個文件: # lsof /var/log/Xorg.0.log COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME Xorg 3324 root 0w REG 8,6 56296 12492 /var/log/Xorg.0.log掛載/重掛載一個文件系統
舉個 cdrom 的例子。如果已經列于 /etc/fstab 中: # mount /cdrom 或在 /dev/ 中查找設備,亦或使用?dmesg?命令FreeBSD
# mount -v -t cd9660 /dev/cd0c /mnt # cdrom # mount_cd9660 /dev/wcd0c /cdrom # 另外一個方法 # mount -v -t msdos /dev/fd0c /mnt # 軟驅 /etc/fstab 中的一條: # Device Mountpoint FStype Options Dump Pass# /dev/acd0 /cdrom cd9660 ro,noauto 0 0 要允許用戶做這些,可以這么做: # sysctl vfs.usermount=1 # 或者在 /etc/sysctl.conf 中插入一條 "vfs.usermount=1"Linux
# mount -t auto /dev/cdrom /mnt/cdrom # 典型的 cdrom 掛載命令 # mount /dev/hdc -t iso9660 -r /cdrom # IDE # mount /dev/sdc0 -t iso9660 -r /cdrom # SCSI /etc/fstab 中的條目: /dev/cdrom /media/cdrom subfs noauto,fs=cdfss,ro,procuid,nosuid,nodev,exec 0 0用 Linux 掛載一個 FreeBSD 分區
用 fdisk 查找分區號,這通常是 root 分區,但也可能是其他 BSD slice。如果 FreeBSD 有許多 slice,他們不列于同一個 fdisk 分區表中,但可見于 /dev/sda* 或 /dev/hda* 中。 # fdisk /dev/sda # 查找 FreeBSD 分區 /dev/sda3 * 5357 7905 20474842+ a5 FreeBSD # mount -t ufs -o ufstype=ufs2,ro /dev/sda3 /mnt /dev/sda10 = /tmp; /dev/sda11 /usr # 其他 slice重掛載
不用卸載一個設備來重掛載。 對?fsck?來說是必須的。舉個例子: # mount -o remount,ro / # Linux # mount -o ro / # FreeBSD 從 cdrom 拷貝原始數據進一個 iso 映像文件: # dd if=/dev/cd0c of=file.iso給即時燒錄(on-the-fly)添加 swap
假設你需要很多的 swap (即刻),如一個 2GB 文件 /swap2gb (只限 Linux)。 # dd if=/dev/zero of=/swap2gb bs=1024k count=2000 # mkswap /swap2gb # 創建交換區 # swapon /swap2gb # 激活這個 swap。現在可以使用了 # swapoff /swap2gb # 當使用完畢,釋放這個 swap # rm /swap2gb掛載一個 SMB?共享
假設我們要訪問計算機 smbserver 上的名叫 myshare 的 SMB 共享,在 window PC 上鍵入的地址是 \\smbserver\myshare\。我掛載到 /mnt/smbshare 上。注意 cifs 必須是 IP 或 DNS 名,不是 Windows 名字。Linux
# smbclient -U user -I 192.168.16.229 -L //smbshare/ # 列出共享 # mount -t smbfs -o username=winuser //smbserver/myshare /mnt/smbshare # mount -t cifs -o username=winuser,password=winpwd //192.168.16.229/myshare /mnt/share 此外,mount.cifs 軟件包可以存儲認證到一個文件中。例如,/home/user/.smb: username=winuser password=winpwd 現在可以像下面那樣掛載: # mount -t cifs -o credentials=/home/user/.smb //192.168.16.229/myshare /mnt/smbshareFreeBSD
使用 -I 來獲取 IP (或 DNS 名);smbserver 是 Windows 名。 # smbutil view -I 192.168.16.229 //winuser@smbserver # 列出共享 # mount_smbfs -I 192.168.16.229 //winuser@smbserver/myshare /mnt/smbshare掛載鏡像文件
Linux loop-back
# mount -t iso9660 -o loop file.iso /mnt # 掛載 CD 鏡像文件 # mount -t ext3 -o loop file.img /mnt # 用 ext3 文件系統掛載鏡像文件FreeBSD
用于存儲設備 (如果需要做 # kldload md.ko 動作): # mdconfig -a -t vnode -f file.iso -u 0 # mount -t cd9660 /dev/md0 /mnt # umount /mnt; mdconfig -d -u 0 # 清除 md 設備 用于虛擬節點: # vnconfig /dev/vn0c file.iso; mount -t cd9660 /dev/vn0c /mnt # umount /mnt; vnconfig -u /dev/vn0c # 清除 vn 設備Solaris and FreeBSD
用于 loop-back 文件接口或 lofi: # lofiadm -a file.iso # mount -F hsfs -o ro /dev/lofi/1 /mnt # umount /mnt; lofiadm -d /dev/lofi/1 # 清除 lofi 設備創建并刻錄 ISO 鏡像文件
這將會拷貝 CD 或者 DVD 的扇區。當不用?conv=notrunc,鏡像文件會等于 CD 內容大小而非 CD 容量大小。看下面和?dd 例子。 # dd if=/dev/hdc of=/tmp/mycd.iso bs=2048 conv=notrunc 使用 mkisofs 把目錄中所有文件創建成 CD/DVD 鏡像文件。克服文件名限制:-r 開啟 Rock Ridge 擴展用于 Unix 系統,-J 開啟 Joliet 擴展用于微軟系統。-L 允許 ISO9660 文件名第一個字符為句點。 # mkisofs -J -L -r -V TITLE -o imagefile.iso /path/to/dir 對于 FreeBSD,mkisofs 可以到 port 的 sysutils/cdrtools 中找到。刻錄 ISO 鏡像文件
FreeBSD
FreeBSD 默認情況下沒有在 ATAPI 驅動上啟用 DMA。DMA 可用 sysctl 命令啟用,其參數如下,或者在 /boot/loader.conf 中添加如下條目: hw.ata.ata_dma="1" hw.ata.atapi_dma="1" burncd?用于 ATAPI 驅動(burncd?為基本系統的一部分),cdrecord?(在 sysutils/cdrtools 中)用于 SCSI 驅動。 # burncd -f /dev/acd0 data imagefile.iso fixate # ATAPI 驅動 # cdrecord -scanbus # 查找 burner 設備描述符(如 1,0,0) # cdrecord dev=1,0,0 imagefile.isoLinux
對于 Linux,同樣使用?cdrecord?如上文所述。此外,它還可以使用本地 ATAPI 接口查找設備描述符: # cdrecord dev=ATAPI -scanbus 然后同上面一樣燒錄 CD/DVD。dvd+rw-tools
dvd+rw-tools?工具包(FreeBSD: ports/sysutils/dvd+rw-tools)可以做上面的一切,其還包括 growisofs 工具來刻錄 CD 或 DVD。本實例所引用的 DVD 設備?/dev/dvd?可能是指向?/dev/scd0?(Linux)的符號連接,或者?/dev/cd0?(FreeBSD),或者?/dev/rcd0c(NetBSD/OpenBSD),或者?/dev/rdsk/c0t1d0s2?(Solaris)。對于本實例?FreeBSD 手冊 18.7 章?上有一份很好的文檔。 # -dvd-compat 選項將完結光盤,光盤便不可再附加數據 # growisofs -dvd-compat -Z /dev/dvd=imagefile.iso # 刻錄已存在的 iso 鏡像文件 # growisofs -dvd-compat -Z /dev/dvd -J -R /p/to/data # 直接刻錄轉換 Nero .nrg 文件成 .iso
Nero 簡單的添加了 300KB 的頭到一個常規的 iso 鏡像文件中。我們可用 dd 工具來去除它。 # dd bs=1k if=imagefile.nrg of=imagefile.iso skip=300轉換 bin/cue 鏡像成 .iso
bchunk?程序可以做到這一點。在 FreeBSD 中,它在 port 的 sysutils/bchunk 中。 # bchunk imagefile.bin imagefile.cue imagefile.iso創建基于文件的鏡像文件
舉個例子,一個使用文件 /usr/vdisk.img 的 1GB 分區。這里我們使用 vnode 0,但也可為 1。FreeBSD
# dd if=/dev/random of=/usr/vdisk.img bs=1K count=1M # mdconfig -a -t vnode -f /usr/vdisk.img -u 0 # 創建設備 /dev/md1 # bsdlabel -w /dev/md0 # newfs /dev/md0c # mount /dev/md0c /mnt # umount /mnt; mdconfig -d -u 0; rm /usr/vdisk.img # 清除 md 設備 這個基于文件的鏡像文件可以在 /etc/rc.conf 和 /etc/fstab 中配置成啟動期間自動掛載。可用?# /etc/rc.d/mdconfig start?(先用?# mdconfig -d -u 0?命令刪除 md0 設備) 測試你的設置。需要注意的是,那個自動設置僅工作于這個基于文件的鏡像文件不在 root 分區中。原因是 /etc/rc.d/mdconfig 腳本早于啟動就執行了,并且 root 分區仍然是只讀的。腳本 /etc/rc.d/mdconfig2 之后,鏡像文件將位于 root 分區外掛載。
/boot/loader.conf: md_load="YES" /etc/rc.conf: # mdconfig_md0="-t vnode -f /usr/vdisk.img" # /usr 不在 root 分區中 /etc/fstab: (行后的兩個 0 0 很重要,它告訴 fsck 忽略這個設備,現在還不存在。) /dev/md0 /usr/vdisk ufs rw 0 0 也可能在增加鏡像文件的大小之后,如增大到 300MB。 # umount /mnt; mdconfig -d -u 0 # dd if=/dev/zero bs=1m count=300 >> /usr/vdisk.img # mdconfig -a -t vnode -f /usr/vdisk.img -u 0 # growfs /dev/md0 # mount /dev/md0c /mnt # 文件分區現在為 300MB
Linux
# dd if=/dev/zero of=/usr/vdisk.img bs=1024k count=1024 # mkfs.ext3 /usr/vdisk.img # mount -o loop /usr/vdisk.img /mnt # umount /mnt; rm /usr/vdisk.img # 清楚Linux with losetup
/dev/zero?比?urandom?更快,但對于加密來說卻不夠安全。 # dd if=/dev/urandom of=/usr/vdisk.img bs=1024k count=1024 # losetup /dev/loop0 /usr/vdisk.img # 創建并聯結 /dev/loop0 # mkfs.ext3 /dev/loop0 # mount /dev/loop0 /mnt # losetup -a # 查看已經掛載的 loop 設備 # umount /mnt # losetup -d /dev/loop0 # Detach # rm /usr/vdisk.img創建基于內存的文件系統
基于內存的文件系統對于重量級 IO 應用程序來說非常快。怎樣創建一個掛載到 /memdisk 的 64M 分區:FreeBSD
# mount_mfs -o rw -s 64M md /memdisk # umount /memdisk; mdconfig -d -u 0 # 清除該 md 設備 md /memdisk mfs rw,-s64M 0 0 # /etc/fstab 條目Linux
# mount -t tmpfs -osize=64m tmpfs /memdisk磁盤性能
在 ad4s3c (/home) 分區上讀寫一個 1GB 的文件。 # time dd if=/dev/ad4s3c of=/dev/null bs=1024k count=1000 # time dd if=/dev/zero bs=1024k count=1000 of=/home/1Gb.file # hdparm -tT /dev/hda # 僅限 Linux網絡
路由?|?額外 IP?|?更改 MAC 地址?|?端口?|?防火墻?|?IP 轉發?|?NAT?|?DNS?|?DHCP?|?通信量?|?QoS?|?NIS
調試 (也可看流量分析)
Linux
# ethtool eth0 # 顯示以太網狀態(replaces mii-diag) # ethtool -s eth0 speed 100 duplex full # 把網卡 eth0 速度改為 100兆/秒,采用全雙工 # ethtool -s eth0 autoneg off # 禁用自動協商模式 # ethtool -p eth1 # 閃爍網絡接口 LED 燈 - 如果支持的話,非常實用 # ip link show # 在 Linux 上顯示所有網絡接口(同 ifconfig 類似) # ip link set eth0 up # 使設備激活(或Down掉)。同 "ifconfig eth0 up" # ip addr show # 在 Linux 上顯示所有 IP 地址(與 ifconfig 類似) # ip neigh show # 與 arp -a 類似其他系統
# ifconfig fxp0 # 查看 "media" 字段(FreeBSD) # arp -a # 查看路由(或主機) ARP 條目(所有系統) # ping cb.vu # 第一個要試的事情... # traceroute cb.vu # 列印到目的地的路由路徑 # ifconfig fxp0 media 100baseTX mediaopt full-duplex # 100兆/秒 全雙工(FreeBSD) # netstat -s # 對每個網絡協議做系統級分析 另一些命令,雖然不總是默認安裝,但很好找: # arping 192.168.16.254 # 在網絡層上 Ping # tcptraceroute -f 5 cb.vu # 使用 tcp 替換 icmp 來跟蹤,透過防火墻路由
列印路由表
# route -n # Linux 或使用 "ip route" # netstat -rn # Linux, BSD 和 UNIX # route print # Windows添加刪除路由
FreeBSD
# route add 212.117.0.0/16 192.168.1.1 # route delete 212.117.0.0/16 # route add default 192.168.1.1 永久的添加路由可在 /etc/rc.conf 配置文件中設置 static_routes="myroute" route_myroute="-net 212.117.0.0/16 192.168.1.1"Linux
# route add -net 192.168.20.0 netmask 255.255.255.0 gw 192.168.16.254 # ip route add 192.168.20.0/24 via 192.168.16.254 # 等同于上面命令 # route add -net 192.168.20.0 netmask 255.255.255.0 dev eth0 # route add default gw 192.168.51.254 # ip route add default via 192.168.51.254 dev eth0 # 等同于上面命令 # route delete -net 192.168.20.0 netmask 255.255.255.0Solaris
# route add -net 192.168.20.0 -netmask 255.255.255.0 192.168.16.254 # route add default 192.168.51.254 1 # 1 = 通過此路由跳數減 1 # route change default 192.168.50.254 1 永久條目配置在?/etc/defaultrouter?中。Windows
# Route add 192.168.50.0 mask 255.255.255.0 192.168.51.253 # Route add 0.0.0.0 mask 0.0.0.0 192.168.51.254 使用?add -p?來是路由設置永久有效。配置額外的 IP 地址
Linux
# ifconfig eth0 192.168.50.254 netmask 255.255.255.0 # 第一個 IP # ifconfig eth0:0 192.168.51.254 netmask 255.255.255.0 # 第二個 IP # ip addr add 192.168.50.254/24 dev eth0 # 等價命令 # ip addr add 192.168.51.254/24 dev eth0 label eth0:1FreeBSD
# ifconfig fxp0 inet 192.168.50.254/24 # 第一個 IP # ifconfig fxp0 alias 192.168.51.254 netmask 255.255.255.0 # 第二個 IP 永久條目設置在 /etc/rc.conf 中 ifconfig_fxp0="inet 192.168.50.254 netmask 255.255.255.0" ifconfig_fxp0_alias0="192.168.51.254 netmask 255.255.255.0"Solaris
用?ifconfig -a?命令檢查設置 # ifconfig hme0 plumb # 啟用網卡 # ifconfig hme0 192.168.50.254 netmask 255.255.255.0 up # 第一個 IP # ifconfig hme0:1 192.168.51.254 netmask 255.255.255.0 up # 第二個 IP更改 MAC 地址
通常在你更改之前先停下網絡接口。不要告訴我為什么你想改變 MAC 地址...... # ifconfig eth0 down # ifconfig eth0 hw ether 00:01:02:03:04:05 # Linux # ifconfig fxp0 link 00:01:02:03:04:05 # FreeBSD # ifconfig hme0 ether 00:01:02:03:04:05 # Solaris # sudo ifconfig en0 ether 00:01:02:03:04:05 # Mac OS X Tiger # sudo ifconfig en0 lladdr 00:01:02:03:04:05 # Mac OS X Leopard 對于 Windows 已經有許多工具了。像?etherchange。或者看看 "Mac Makeup", "smac"。使用中的端口
監聽打開的端口: # netstat -an | grep LISTEN # lsof -i # 列出所有因特網連接(Linux) # socklist # 列出打開的 socket (Linux) # sockstat -4 # 使用 socket 的應用程序列表(FreeBSD) # netstat -anp --udp --tcp | grep LISTEN # Linux # netstat -tup # 列出活躍的連接(Linux) # netstat -tupl # 列出系統中正在監聽的端口(Linux) # netstat -ano # Windows防火墻
檢查正在運行的防火墻(只是典型配置):Linux
# iptables -L -n -v # 狀態信息 Open the iptables firewall # iptables -P INPUT ACCEPT # 打開所有 # iptables -P FORWARD ACCEPT # iptables -P OUTPUT ACCEPT # iptables -Z # 把所有鏈的包及字節的計數器清空 # iptables -F # 清空所有鏈 # iptables -X # 刪除所有鏈FreeBSD
# ipfw show # 狀態信息 # ipfw list 65535 # 如果顯示 "65535 deny ip from any to any",那防火墻已被禁用 # sysctl net.inet.ip.fw.enable=0 # 禁用 # sysctl net.inet.ip.fw.enable=1 # 啟用路由 IP 轉發
Linux
查看然后啟用 IP 轉發: # cat /proc/sys/net/ipv4/ip_forward # 查看 IP 轉發 0=禁用, 1=啟用 # echo 1 > /proc/sys/net/ipv4/ip_forward 或者編輯 /etc/sysctl.conf: net.ipv4.ip_forward = 1FreeBSD
查看并啟用: # sysctl net.inet.ip.forwarding # 查看 IP 轉發 0=禁用, 1=啟用 # sysctl net.inet.ip.forwarding=1 # sysctl net.inet.ip.fastforwarding=1 # 專用路由器或防火墻 Permanent with entry in /etc/rc.conf: gateway_enable="YES" # 如果主機是網關則設置為 YES。Solaris
# ndd -set /dev/ip ip_forwarding 1 # 查看 IP 轉發 0=禁用, 1=啟用NAT - 網絡地址轉換
Linux
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # 激活 NAT # iptables -t nat -A PREROUTING -p tcp -d 78.31.70.238 --dport 20022 -j DNAT \ --to 192.168.16.44:22 # 轉發端口 20022 到內部 IP 端口(ssh) # iptables -t nat -A PREROUTING -p tcp -d 78.31.70.238 --dport 993:995 -j DNAT \ --to 192.168.16.254:993:995 # 轉發 993-995 范圍端口 # ip route flush cache # iptables -L -t nat # 查看 NAT 狀態信息 使用 -D 替換 -A 來刪除端口轉發。FreeBSD
# natd -s -m -u -dynamic -f /etc/natd.conf -n fxp0 Or edit /etc/rc.conf with: firewall_enable="YES" # 設置 YES 來啟用防火墻功能 firewall_type="open" # 防火墻類型(看 /etc/rc.firewall) natd_enable="YES" # 啟用 natd (如果 firewall_enable == YES)。 natd_interface="tun0" # 公共的網絡接口或要使用的 IP 地址。 natd_flags="-s -m -u -dynamic -f /etc/natd.conf" 端口轉發: # cat /etc/natd.conf same_ports yes use_sockets yes unregistered_only # redirect_port tcp insideIP:2300-2399 3300-3399 # 端口范圍 redirect_port udp 192.168.51.103:7777 7777DNS
在 unix 上,對于所有的網絡接口的 DNS 條目都存儲在 /etc/resolv.conf 文件中。主機域也儲存在這個文件中。最小化配置如下: nameserver 78.31.70.238 search sleepyowl.net intern.lab domain sleepyowl.net 檢查系統域名: # hostname -d # 等同于 dnsdomainnameWindows
在 Windows 上,DNS 配置于每個網絡接口。要顯示配置的 DNS 和清空 DNS 緩存可是使用: # ipconfig /? # 顯示幫助 # ipconfig /all # 顯示所有信息包括 DNS # ipconfig /flushdns # 清除 DNS 緩存轉發查詢
Dig 是你測試 DNS 設置的好朋友。舉個例子,用于測試的 DNS 服務器為?213.133.105.2 ns.second-ns.de。查看哪個服務器客戶端接收應答(簡單應答). # dig sleepyowl.net sleepyowl.net. 600 IN A 78.31.70.238 ;; SERVER: 192.168.51.254#53(192.168.51.254) 路由器 192.168.51.254 應答了,并返回了一條 A 條目(記錄)。任何條目都可查詢,DNS 服務器可用 @ 來選定: # dig MX google.com # dig @127.0.0.1 NS sun.com # 測試本地服務器 # dig @204.97.212.10 NS MX heise.de # 查詢外部 # dig AXFR @ns1.xname.org cb.vu # 查看區傳送(zone transfer) 程式 host 也很強大。 # host -t MX cb.vu # 獲取郵件 MX 記錄 # host -t NS -T sun.com # 通過 TCP 連接獲取 NS 記錄 # host -a sleepyowl.net # 獲取所有反向查詢
查找屬于一個 IP 地址(in-addr.arpa.)的域名。可用?dig,?host?和?nslookup?命令查詢: # dig -x 78.31.70.238 # host 78.31.70.238 # nslookup 78.31.70.238/etc/hosts
單個主機可以配置于文件 /etc/hosts 來代替本地正在運行的?named?反向域名查詢。格式很簡單,舉個例子: 78.31.70.238 sleepyowl.net sleepyowl 對于 hosts 文件和 DNS 查詢之間的優先級,可在?/etc/nsswitch.conf?和?/etc/host.conf?中配置 order 名稱解析。這個文件同樣存在于 Windows 上,通常在: C:\WINDOWS\SYSTEM32\DRIVERS\ETCDHCP
Linux
一些發行版(SuSE)使用 dhcpcd 作為客戶端。默認網絡接口是 eth0。 # dhcpcd -n eth0 # 觸發更新(并不總是可以工作) # dhcpcd -k eth0 # 釋放并關閉 租約(lease)的全部信息存儲在: /var/lib/dhcpcd/dhcpcd-eth0.infoFreeBSD
FreeBSD (和 Debian) 使用?dhclient。要配置一個網絡接口(如:bge0)運行: # dhclient bge0 租約(lease)的全部信息存儲在: /var/db/dhclient.leases.bge0 使用 /etc/dhclient.conf 設置 prepend 選項或強制不同的選項: # cat /etc/dhclient.conf interface "rl0" {prepend domain-name-servers 127.0.0.1;default domain-name "sleepyowl.net";supersede domain-name "sleepyowl.net"; }Windows
dhcp 租約(lease)使用?ipconfig?來更新: # ipconfig /renew # 更新所有適配器 # ipconfig /renew LAN # 更新名叫 "LAN" 的適配器 # ipconfig /release WLAN # 釋放名叫 "WLAN" 的適配器 是的,這是一個使用簡單名稱重新命名你的適配器的好主意!通信量分析(Traffic analysis)
Bmon?是一個小的流量監控控制臺,而且可以顯示不同的網絡接口的流量。用 tcpdump 嗅探(sniff)
# tcpdump -nl -i bge0 not port ssh and src \(192.168.16.121 or 192.168.16.54\) # tcpdump -l > dump && tail -f dump # 緩沖輸出 # tcpdump -i rl0 -w traffic.rl0 # 把數據報文寫入二進制文件 # tcpdump -r traffic.rl0 # 從文件讀取數據報文(也可以使用 ethereal) # tcpdump port 80 # 兩個經典命令 # tcpdump host google.com # tcpdump -i eth0 -X port \(110 or 143\) # 查看端口 110(POP) 或 143(IMAP)的數據報文 # tcpdump -n -i eth0 icmp # 只捕獲 ping # tcpdump -i eth0 -s 0 -A port 80 | grep GET # -s 0 為全部包, -A 為 ASCII 另一些重要選項:- -A?? ? 顯示每個包清晰文本(除了報頭)
- -X?? ? 顯示包的 ASCII 文本
- -l?? ? 使標準輸出變為緩沖行形式
- -D?? ? 顯示所有可用網絡接口
用 nmap 掃描
Nmap?是一個用于 OS 探測的端口掃描工具,她通常在許多發行版上有安裝,并且同樣可用于 Windows。如果你不掃描你的服務器,駭客們會為你做這些... # nmap cb.vu # 掃描主機上所有保留的 TCP 端口 # nmap -sP 192.168.16.0/24 # 找出在 0/24 上主機所使用的 IP # nmap -sS -sV -O cb.vu # 做秘密 SYN 掃描來探測系統和系統服務的版本信息 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 3.8.1p1 FreeBSD-20060930 (protocol 2.0) 25/tcp open smtp Sendmail smtpd 8.13.6/8.13.6 80/tcp open http Apache httpd 2.0.59 ((FreeBSD) DAV/2 PHP/4. [...] Running: FreeBSD 5.X Uptime 33.120 days (since Fri Aug 31 11:41:04 2007) 其他非標準但好用的工具有?hping?(www.hping.org),她是一個 IP 分組組裝/分析器,和?fping?(fping.sourceforge.net)。fping 可以在一個循環隊列(round-robin fashion)中掃描多種主機。流量控制(QoS)
流量控制管理著一個網絡的隊列、流量監控、調度以及其他流量設置(traffic parameters)。以下簡單實用的示例使用 Linux 和 FreeBSD 的能力來更好的利用帶寬。上傳限制
DSL 或有線調制解調器有一個很長的列隊來提高上傳吞吐量(upload throughput)。然而用一個快速的設備(如以太網)填充這個列隊將大大減少交互性。這就是限制設備上傳速度有用的原因,以匹配調制解調器的實際能力,這可以有效提高交互性。設置大約為 modem 最大速度的 90%。Linux
給 512K 上傳速度的 modem。 # tc qdisc add dev eth0 root tbf rate 480kbit latency 50ms burst 1540 # tc -s qdisc ls dev eth0 # 狀態 # tc qdisc del dev eth0 root # 刪除隊列 # tc qdisc change dev eth0 root tbf rate 220kbit latency 50ms burst 1540FreeBSD
FreeBSD 使用?dummynet?來控制帶寬,其配置工具為 ipfw。Pipe 用來設置限制帶寬的單位[K|M]{比特/秒|字節/秒},0 意味著沒有限制。使用同樣的 pipe 數字可重新配置它。舉個例子,限制上傳帶寬為 500K。 # kldload dummynet # 如有必要加載這個模塊 # ipfw pipe 1 config bw 500Kbit/s # 創建一個帶寬限制的 pipe # ipfw add pipe 1 ip from me to any # 轉移所有上傳進入這個 pipe服務質量 (Quality of service)
Linux
使用?tc?的優先級隊列來優化 VoIP。在?voip-info.org?或?www.howtoforge.com?上可以看到完整的例子。假設 VoIP 使用 UDP 端口 10000:11024 并且使用 eth0 設備(也可為 ppp0 或 so)。下列命令定義了三個隊列,并且用 QoS?0x1e(設置所有位) 強制 VOIP 流量到隊列 1。默認流量流入隊列 3,Qos?Minimize-Delay?流入隊列 2。 # tc qdisc add dev eth0 root handle 1: prio priomap 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 0 # tc qdisc add dev eth0 parent 1:1 handle 10: sfq # tc qdisc add dev eth0 parent 1:2 handle 20: sfq # tc qdisc add dev eth0 parent 1:3 handle 30: sfq # tc filter add dev eth0 protocol ip parent 1: prio 1 u32 \match ip dport 10000 0x3C00 flowid 1:1 # 使用服務端端口范圍match ip dst 123.23.0.1 flowid 1:1 # 或/和使用服務器 IP 狀態和移除: # tc -s qdisc ls dev eth0 # queue status # tc qdisc del dev eth0 root # delete all QoS計算端口范圍和掩碼 (mask)
用你所計算的端口掩碼來定義 tc 過濾器的端口范圍。查詢 2^N 端口范圍結尾,推斷范圍并轉換成十六進制。這就是你的掩碼 (mask)。例如 10000 -> 11024,它的范圍是 1024。 # 2^13 (8192) < 10000 < 2^14 (16384) # 結尾是 2^14 = 16384 # echo "obase=16;(2^14)-1024" | bc # 掩碼是 0x3C00FreeBSD
假設最大連接帶寬為 500Kbit/s,我們使用優先級 100:10:1 定義 3 個隊列給 VoIP:ssh:剩余所有。 # ipfw pipe 1 config bw 500Kbit/s # ipfw queue 1 config pipe 1 weight 100 # ipfw queue 2 config pipe 1 weight 10 # ipfw queue 3 config pipe 1 weight 1 # ipfw add 10 queue 1 proto udp dst-port 10000-11024 # ipfw add 11 queue 1 proto udp dst-ip 123.23.0.1 # 或/和使用服務器 IP # ipfw add 20 queue 2 dsp-port ssh # ipfw add 30 queue 3 from me to any # 剩余所有 狀態和移除: # ipfw list # 規則信息 # ipfw pipe list # 管道信息 # ipfw flush # 刪除除默認外所有規則NIS 調試
一些可工作在已配置好的 NIS 客戶端上的命令: # ypwhich # 獲取提供 NIS 服務的服務器名 # domainname # 已配置的 NIS 域名 # ypcat group # 列印 NIS 映射 group # cd /var/yp && make # 重建 yp 數據庫 ypbind 正在運行嗎? # ps auxww | grep ypbind /usr/sbin/ypbind -s -m -S servername1,servername2 # FreeBSD /usr/sbin/ypbind # Linux # yppoll passwd.byname Map passwd.byname has order number 1190635041. Mon Sep 24 13:57:21 2007 The master server is servername.domain.net.Linux
# cat /etc/yp.conf ypserver servername domain domain.net broadcastSSH SCP
公鑰認證?|?指紋?|?SCP?|?隧道(Tunneling)
Public key authentication
使用公鑰認證而不是密碼連接主機。方法是附加你的公鑰文件到遠程主機。本例中我們用客戶端產生的 key?從?host-client?連接到?host-server。- 使用 ssh-keygen 生成密鑰對。私鑰放在?~/.ssh/id_dsa,公鑰在?~/.ssh/id_dsa.pub。
- 拷貝你的公鑰到服務器的?~/.ssh/authorized_keys2。
使用來自 ssh.com 的 Windows 客戶端
ssh.com 的非商業性版本的客戶端可下載自它主 FTP 站點:ftp.ssh.com/pub/ssh/。 用 ssh.com 客戶端產生的密鑰需要在 OpenSSH 服務器上進行轉換。可以使用 ssh-keygen 命令來完成。- 使用 ssh.com 客戶端創建一對密鑰:Settings - User Authentication - Generate New....
- 我使用 DSA 密鑰類型;密鑰長度為 2048。
- 拷貝 ssh.com 客戶端產生的公鑰到服務器的 ~/.ssh 目錄。
- 她的密鑰對在 C:\Documents and Settings\%USERNAME%\Application Data\SSH\UserKeys。
- 在服務器上使用 ssh-keygen 轉換公鑰: # cd ~/.ssh # ssh-keygen -i -f keyfilename.pub >> authorized_keys2
在 Windows 上使用 Putty
Putty?是一個簡單并且自由的(MIT許可)?ssh Windows 客戶端。- 使用 puTTYgen 程序創建密鑰對。
- 保存密鑰對(比如:C:\Documents and Settings\%USERNAME%\.ssh).
- 拷貝公鑰到服務器的 ~/.ssh 目錄: # scp .ssh/puttykey.pub root@192.168.51.254:.ssh/
- 使用 ssh-keygen 在 OpenSSH 服務器上轉換這個公鑰: # cd ~/.ssh # ssh-keygen -i -f puttykey.pub >> authorized_keys2
- 在 Putty 中設置指向私鑰的位置:Connection - SSH - Auth
檢查指紋
在首次連接時,SSH 會請求保存不知道的主機指紋。要避免中間人(man-in-the-middle)攻擊,服務器的管理員可以發送密鑰指紋給客戶端,來讓其在首次登陸時驗證服務器的真實性。使用?ssh-keygen -l?獲取服務器的指紋: # ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub # RSA 密鑰 2048 61:33:be:9b:ae:6c:36:31:fd:83:98:b7:99:2d:9f:cd /etc/ssh/ssh_host_rsa_key.pub # ssh-keygen -l -f /etc/ssh/ssh_host_dsa_key.pub # DSA 密鑰(默認) 2048 14:4a:aa:d9:73:25:46:6d:0a:48:35:c7:f4:16:d4:ee /etc/ssh/ssh_host_dsa_key.pub 現在客戶端在連接到服務器時可驗證其服務器的真實性: # ssh linda The authenticity of host 'linda (192.168.16.54)' can't be established. DSA key fingerprint is 14:4a:aa:d9:73:25:46:6d:0a:48:35:c7:f4:16:d4:ee. Are you sure you want to continue connecting (yes/no)? yes安全文件傳輸
一些簡單的命令:# scp file.txt host-two:/tmp # scp joe@host-two:/www/*.html /www/tmp # scp -r joe@host-two:/www /www/tmp 在 Konqueror 或 Midnight 控制臺中,用地址?fish://user@gate?來訪問遠程文件系統是可行的,就是比較慢而已。
此外,也可以用基于 SCP 文件系統客戶端的?sshfs?來掛載一個遠程目錄。看 fuse sshfs.
隧道(Tunneling)
SSH 隧道可以讓你通過 SSH 連接進行端口轉發(轉發/反向隧道),從而確保了傳輸及端口訪問的安全。它只能工作在 TCP 協議上。通常端口轉發命令如下(也可看?ssh 和 NAT 實例): # ssh -L localport:desthost:destport user@gate # gate 為目標主機網關 # ssh -R destport:desthost:localport user@gate # 轉發你的 localport 到目標端口 # ssh -X user@gate # 轉發 X 程序 這將會連接到 gate 并轉發端口到目標主機 desthost:destport。注意 desthost 為 gate 中的目標主機名。因此,如果連接到了 gate,那么 desthost 就是 localhost。也可以做更多的端口轉發。在 gate 上直接轉發
假設我們想訪問在 gate 上運行的 CVS(2401端口) 和 HTTP(80端口)。下面是個簡單的例子,desthost 就是 localhost,我們使用本的端口 8080 代替 80 端口,所以我們不需要 root 權限。一旦 ssh session 打開,二個服務就都可在本地端口訪問。 # ssh -L 2401:localhost:2401 -L 8080:localhost:80 user@gate轉發 Netbios 和遠程桌面到第二個服務器
假設有一臺在 gate 后面沒有運行 ssh 的 Winodws SMB 服務器。我們需要訪問 SMB 共享和遠程桌面。 # ssh -L 139:smbserver:139 -L 3388:smbserver:3389 user@gate 現在這個 SMB 共享可以使用 \\127.0.0.1\ 訪問,但只能在本地共享關閉的情況下,因為本的共享也是在 139 端口監聽的。保持本的共享也是可行的,因此我們需要為這個通道使用新 IP 地址來新建一個虛擬設備,SMB 共享將會使用此地址連接。此外,本地 RDP 已經在 3389 端口監聽了,所以我們選擇端口 3388。對于這個例子,讓我們使用一個虛擬 IP 地址 10.1.1.1。
- 對于 Putty 上使用源端口=10.1.1.1:139。它可以創建多重回路(multiple loop)設備和通道。在 Windows 2000 上,只有 Putty 為我工作。
- 對于 ssh.com 的客戶端,要禁用 "Allow local connections only"。因為 ssh.com 客戶端綁定了所有地址,所以只能連接單個共享。
- # 系統->控制面板->添加硬件 # 是,我已經連接了此硬件(Y) # 添加新的硬件設備(在列表最下面)。
- # 安裝我手動選擇的硬件 # 網絡適配器 # Microsoft , Microsoft Loopback Adapter。
- 配置這個假設備的 IP 地址為 10.1.1.1,掩碼 255.255.255.0,沒有網關。
- 高級->WINS,開啟 LMHOSTS 查詢;禁用 TCP/IP 上的 NetBIOS。
- # 啟用 Microsoft 網絡客戶端。# 禁用 Microsoft 網絡文件和打印機共享
調試
如果不能工作:- 端口有沒有轉發:運行控制臺運行 netstat -an 命令并查看有沒有 0.0.0.0:139 或者 10.1.1.1:139
- 有沒有 telnet 到 10.1.1.1 139?
- 你需要打開 "本地端口接受其他主機連接"。
- "Microsoft 網絡文件和打印機共享" 有沒有被禁用?
在 NAT 后面連接兩個客戶端
假設兩個客戶端在一個 NAT 網關后面,cliadmin 客戶端要連接到 cliuser 客戶端(目的地),兩者都可用 ssh 登錄到正在運行 sshd 的 gate 上。你不需要 root 權限,只要端口大于 1024 即可。我們在 gate 上使用 2022 端口。而且,由于 gate 使用與本地,所以網關端口不是必須的。開啟 cliuser 客戶端(從目標到 gate): # ssh -R 2022:localhost:22 user@gate # 轉發客戶端 22 端口到 gate:2022 端口 開啟 cliadmin 客戶端(從主機到 gate): # ssh -L 3022:localhost:2022 admin@gate # 轉發客戶端 3022 端口到 gate:2022 端口 現在 admin 可以直接連接 cliuser 客戶端: # ssh -p 3022 admin@localhost # local:3022 -> gate:2022 -> client:22
在 NAT 后面的 VNC 連接
假設一個在 NAT 后面,監聽在端口 5900 上可被訪問的 Windows VNC 客戶端。開啟 cliwin 客戶端到 gate: # ssh -R 15900:localhost:5900 user@gate 開啟 cliadmin 客戶端(從主機到 gate): # ssh -L 5900:localhost:15900 admin@gate 現在 admin 直接連接到 VNC 客戶端: # vncconnect -display :0 localhost
使用 SSH 建立 VPN
自 4.3 版開始,OpenSSH 可以使用 tun/tap?設備來加密一個隧道。其非常類似于基于 TLS 的 VPN 解決方案(像 OpenVPN)。對于 SSH 的一個優勢是,她不需要安裝和配置額外的軟件。另外隧道使用 SSH 認證(像共享密鑰)。 其缺點是,對于一個緩慢的連接, 其傳輸效率較低。并且這個隧道依賴于單個(易斷的) TCP 鏈接。這個技術對于快速設置一個基于 IP 的 VPN 來說非常有用。她對于用單個 TCP 端口轉發沒有限制,并且在所有 3/4 層 協議像 ICMP、TCP/UDP 等上都可用。不管怎么樣,下面這些選擇在 sshd_conf 文件中是必須的: PermitRootLogin yes PermitTunnel yes單個 P2P 連接
這里,我們用點對點隧道連接 hclient 和 hserver 兩個主機。這個連接是從 hclient 開始到 hserver 的,并且是用 root 來做。這個通道的連接點是 10.0.1.1(服務端)和 10.0.1.2(客戶端),然后我們創建設備 tun5(當然也可以是其它數字)。這個過程非常簡單:- 使用 SSH 的通道選項 -w 來連接
- 設置隧道的 IP 地址。服務端和客戶端各一次。
連接到服務端
連接始于客戶端,然后再服務端執行命令。Linux上的服務端
cli># ssh -w5:5 root@hserver srv># ifconfig tun5 10.0.1.1 netmask 255.255.255.252 # 在服務端 shell 上執行FreeBSD上的服務端
cli># ssh -w5:5 root@hserver srv># ifconfig tun5 10.0.1.1 10.0.1.2 # 在服務端 shell 上執行連接到客戶端
在客戶端上執行命令: cli># ifconfig tun5 10.0.1.2 netmask 255.255.255.252 # Linux上的客戶端 cli># ifconfig tun5 10.0.1.2 10.0.1.1 # FreeBSD上的客戶端 現在兩個主機都連上了,并且可以在任何 3/4 層協議上使用此通道 IP 地址透明的通訊。連接兩個網絡
除上面的 p2p 設置外,一個更有用的是SSH VPN 用兩個 gate 連接兩個私有網絡。假設有這樣一個例子,netA 為 192.168.51.0/24 還有 netB 為 192.168.16.0/24。設置過程同上面相似,我們只需要添加 routing。如果 gate 不同于默認網關,那在私有網絡接口上必須開啟 NAT。192.168.51.0/24 (netA)|gateA <-> gateB|192.168.16.0/24 (netB)
- 使用隧道選項 -w 連接 SSH。
- 配置隧道的 IP 地址。服務端和客戶端各一次。
- 為兩個網絡添加 routing。
- 如果需要,在 gate 的私有網絡接口上開啟 NAT。
連接 gateA 到 gateB
連接從 gateA 開始,命令執行于 gateB。Linux 上的 gateB
gateA># ssh -w5:5 root@gateB gateB># ifconfig tun5 10.0.1.1 netmask 255.255.255.252 # 在 gateB 的 shell 中執行 gateB># route add -net 192.168.51.0 netmask 255.255.255.0 dev tun5 gateB># echo 1 > /proc/sys/net/ipv4/ip_forward # 如果不是默認網關 gateB># iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEFreeBSD 上的 gateB
gateA># ssh -w5:5 root@gateB # 創建 tun5 設備 gateB># ifconfig tun5 10.0.1.1 10.0.1.2 # 在 gateB 的 shell 中執行 gateB># route add 192.168.51.0/24 10.0.1.2 gateB># sysctl net.inet.ip.forwarding=1 # 如果不是默認網關 gateB># natd -s -m -u -dynamic -n fxp0 # 看 NAT gateA># sysctl net.inet.ip.fw.enable=1配置 gateA
在 gateA 上執行命令:Linux 上的 gateA
gateA># ifconfig tun5 10.0.1.2 netmask 255.255.255.252 gateA># route add -net 192.168.16.0 netmask 255.255.255.0 dev tun5 gateA># echo 1 > /proc/sys/net/ipv4/ip_forward gateA># iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEFreeBSD 上的 gateA
gateA># ifconfig tun5 10.0.1.2 10.0.1.1 gateA># route add 192.168.16.0/24 10.0.1.2 gateA># sysctl net.inet.ip.forwarding=1 gateA># natd -s -m -u -dynamic -n fxp0 # 看 NAT gateA># sysctl net.inet.ip.fw.enable=1 現在兩個私有網絡都可以通過 SSH VPN 來透明的連接。如果 gate 不是默認網關,那么 IP 轉發和 NAT 設置都是必須的。在這種情況下,客戶端將不知道在哪里轉發響應(response),并且 NAT 必須是開啟的。RSYNC
Rsync 差不多可以代替 cp 和 scp,此外,斷點續傳是重啟有效的。尾部的斜杠也有著不同的意思,請閱讀 man 頁面......這里有一些例子:拷貝目錄中所有內容: # rsync -a /home/colin/ /backup/colin/ # rsync -a /var/ /var_bak/ # rsync -aR --delete-during /home/user/ /backup/ # 使用相對路徑(看下面) 同之前一樣,但使用了壓縮和網絡。Rsync 使用 SSH 進行傳輸,并且使用 SSH 密鑰,如果設置的話。和 SCP 一樣使用 ":"。一個典型的拷貝: # rsync -axSRzv /home/user/ user@server:/backup/user/ 排除在 /home/user/ 中任何 tmp 目錄,并且保持相對目錄層次結構,遠程目錄的結構就是 /backup/home/user/。典型的用于備份的命令。 # rsync -azR --exclude /tmp/ /home/user/ user@server:/backup/ SSH 連接使用端口 20022: # rsync -az -e 'ssh -p 20022' /home/colin/ user@server:/backup/colin/ 使用 rsync 守護進程(使用"::")是很快的,但沒有透過 SSH 加密。 位置 /backup 定義在了配置文件 /etc/rsyncd.conf 中。變量 RSYNC_PASSWORD 可以設置用來免除手動輸入密碼。 # rsync -axSRz /home/ ruser@hostname::rmodule/backup/ # rsync -axSRz ruser@hostname::rmodule/backup/ /home/ # 回拷貝 一些重要選項:
- -a, --archive?歸檔模式,等于 -rlptgoD (非 -H)
- -r, --recursive?對子目錄以遞歸模式處理
- -R, --relative?使用相對路徑名
- -H, --hard-links?保留硬鏈結
- -S, --sparse?對稀疏文件進行特殊處理以節省DST的空間
- -x, --one-file-system?不跨越文件系統邊界
- --exclude=PATTERN?指定排除不需要傳輸的文件模式
- --delete-during?傳輸期間刪除
- --delete-after?傳輸結束以后再刪除
在 Windows 上使用 Rsync
可以通過 cygwin 或 獨立打包的?cwrsync?來在 Windows 上運行 rsync。這對于自動備份來說非常方便。只裝其中一個(不是兩個),然后添加路徑到 Windows 系統變量中:# 控制面板 -> 系統 -> 高級標簽,環境變量按鈕。編輯 "Path" 添加 rsync 的安裝路徑,比如:C:\Program Files\cwRsync\bin 或者 C:\cygwin\bin。這可以讓?rsync?和?ssh?可用于 Windows 命令窗口中。公鑰認證
Rsync 是自動使用 SSH 隧道的,因此在服務端使用 SSH 認證。自動備份可免受用戶的影響,rsync 命令對于使用 SSH 公鑰認證可以不需要密碼。下面所有的命令都可在 windows 控制臺中執行。在控制臺(開始 -> 運行 -> cmd)中像在?SSH?中描述的那樣創建和上傳密鑰,根據你的情況改變 "user" 和 "server"。如果文件 authorized_keys2 不存在,拷貝 id_dsa.pub 成 authorized_keys2 并上傳它。 # ssh-keygen -t dsa -N '' # 創建密鑰對 # rsync user@server:.ssh/authorized_keys2 . # 從服務器拷貝本地文件 # cat id_dsa.pub >> authorized_keys2 # 或者使用編輯器添加這個公鑰 # rsync authorized_keys2 user@server:.ssh/ # 拷貝文件回服務器 # del authorized_keys2 # 刪除本地拷貝 現在測試一下(在同一行里面): rsync -rv "/cygdrive/c/Documents and Settings/%USERNAME%/My Documents/" \ 'user@server:My\ Documents/'
自動備份
使用批處理文件自動備份并添加到任務計劃(程序 -> 附件 -> 系統工具 -> 任務計劃)。舉個例子,創建批處理文件 backup.bat 取代 user@server。 @ECHO OFF REM rsync the directory My Documents SETLOCAL SET CWRSYNCHOME=C:\PROGRAM FILES\CWRSYNC SET CYGWIN=nontsec SET CWOLDPATH=%PATH% REM uncomment the next line when using cygwin SET PATH=%CWRSYNCHOME%\BIN;%PATH% echo Press Control-C to abort rsync -av "/cygdrive/c/Documents and Settings/%USERNAME%/My Documents/" \ 'user@server:My\ Documents/' pauseSUDO
Sudo 可以給用戶一些超級用戶的權限而不需要 root 密碼。Sudo 對于一個服務器和工作站混合的多用戶環境來說非常有用。使用 sudo 運行命令: # sudo /etc/init.d/dhcpd restart # 用 root 權限運行 rc 腳本 # sudo -u sysadmin whoami # 使用其他用戶運行命令配置
Sudo 的配置在?/etc/sudoers?中,并且只能用?visudo?編輯。其基本語法是(列表是以逗號分隔的): user hosts = (runas) commands # 在 /etc/sudoers 中- users?一個或多個用戶或是%用戶組(像 %wheel) 來獲得權限
- hosts?主機列表(或 ALL)
- runas?列出用戶以何種身份(或 ALL)來執行命令,放在 ( ) 內!
- commands?列出可被 users 以 runas 或 root 權限運行的命令(或 ALL)
文件加密
單個文件
加密和解密: # openssl des -salt -in file -out file.des # openssl des -d -salt -in file.des -out file 那個 file 可以是歸檔文件(tar archive)。歸檔并加密整個目錄
# tar -cf - directory | openssl des -salt -out directory.tar.des # 加密 # openssl des -d -salt -in directory.tar.des | tar -x # 解密壓縮歸檔并加密整個目錄
# tar -zcf - directory | openssl des -salt -out directory.tar.gz.des # 加密 # openssl des -d -salt -in directory.tar.gz.des | tar -xz # 解密- 在使用-k mysecretpassword后,des會取消交互式的密碼請求。不過,這非常不安全。
- 使用des3代替des來獲得更強的加密(Triple-DES Cipher)。這同樣會消耗更多的CPU。
GPG
GnuPG?是眾所周知的對郵件或任何數據進行加密和簽名的軟件。此外,gpg 還提供高級密鑰管理系統。此章節只涵蓋了文件加密,沒有郵件加密、簽名或者信任網絡(Web-Of-Trust)。單純的加密是一個對稱式的加密算法(symmetric cipher)。在本例中,文件是用一個秘密來加密的,任何人知道了這個密碼都可以對其進行解密,因此就不需要密鑰。Gpg 添加后綴 ".gpg" 到已加密的文件名。 # gpg -c file # 使用密碼加密文件 # gpg file.gpg # 文件解密(選項 -o 其他文件)
使用密鑰
對于更詳細的請看?GPG 快速上手?和?GPG/PGP 基礎,特別是?gnupg 文檔。密鑰對(私鑰,公鑰)為非對稱加密技術。 要點如下:
- 你的公鑰是用來給別人加密文件的并且只有你作為接收者才可以解密(甚至不是一個人加密的文件也可以解密)。公鑰是公開的也就意味著可以分發。
- 用你的密碼加密的私鑰用來解密用你的公鑰加密的文件。這個密鑰必須保持安全。因為如果遺失了私鑰或者密碼,那么所有的文件都是使用你的公鑰加密的。
- 多個密鑰文件被稱為密鑰環(keyrings),她可以包含一個以上的密鑰。
C:/Documents and Settings/%USERNAME%/Application Data/gnupg/ 中。 ~/.gnupg/pubring.gpg # 包含你的公鑰和所有其他導入的信息 ~/.gnupg/secring.gpg # 可包含多個私鑰 常用選項的簡短描述:
- -e?加密數據
- -d?解密數據
- -r?為某個收件者加密('全名' 或者 'email@domain')
- -a?輸出經過 ascii 封裝的密鑰
- -o?指定輸出文件
只用于個人的加密
不需要導出/導入任何密鑰,因為你都已經有了。 # gpg -e -r 'Your Name' file # 使用你的公鑰加密 # gpg -o file -d file.gpg # 解密。使用 -o 指定輸出文件用密鑰加密-解密
首先你需要導出給別人使用的公鑰。并且你需要導入來自 Alice 她所加密文件的公鑰。你可以用簡單的 ascii 文檔或者使用公鑰服務器來保存這些密鑰。舉個例子,Alice 導出她的公鑰,然后你導入它,之后你就可以加密一個文件給她。這個加密文件只有 Alice 可以解密。 # gpg -a -o alicekey.asc --export 'Alice' # Alice 導出她的公鑰到 ascii 文件中 # gpg --send-keys --keyserver subkeys.pgp.net KEYID # Alice 把她的公鑰放入一個服務器 # gpg --import alicekey.asc # 你導入她的密鑰到你的公鑰環(pubring)中 # gpg --search-keys --keyserver subkeys.pgp.net 'Alice' # 或者從一個服務器中獲取他的公鑰 一旦這些公鑰導入后,加密或解密一個文件會非常簡單: # gpg -e -r 'Alice' file # 給 Alice 加密文件 # gpg -d file.gpg -o file # 解密 Alice 給你的加密文件
密鑰管理
# gpg --list-keys # 列出所有公鑰并查看其 KEYIDKEYID 跟在 '/' 后面 比如:pub 1024D/D12B77CE 它的 KEYID 是 D12B77CE # gpg --gen-revoke 'Your Name' # 產生一份撤銷密鑰證書 # gpg --list-secret-keys # 列出所有私鑰 # gpg --delete-keys NAME # 從本的密鑰環中刪除一個公鑰 # gpg --delete-secret-key NAME # 從本的密鑰環中刪除一個私鑰 # gpg --fingerprint KEYID # 顯示 KIYID 這個密鑰的指紋 # gpg --edit-key KEYID # 編輯密鑰(比如簽名或者添加/刪除 email)分區加密
Linux with LUKS?|?Linux dm-crypt only?|?FreeBSD GELI?|?FreeBSD 只使用密碼
有(許多)其他替代方法來加密磁盤,我只呈現我所知道和使用的方法。請記住,安全只是系統還未經過實際考驗而已。入侵者可以輕易通過鍵盤事件記錄密碼。此外,當已經加載了分區,其數據是可以自由訪問的,并不會阻止入侵者去訪問它。Linux
這部分我們使用可用于 2.6 內核的 Linux dm-crypt (device-mapper)。在這個實例中,讓我們加密?/dev/sdc1?分區,它可為任何其他分區、磁盤、USB或者用?losetup?創建的基于文件的分區。對于基于文件的分區,我們使用?/dev/loop0。看?鏡像文件分區。Device mapper 利用標簽來標識一個分區。我們使用?sdc1?作為此標簽,但可以為任何字符串。dm-crypt with LUKS
LUKS 和 dm-crypt 是較好的加密技術,并且可為同一個分區設置多個口令,更改密碼也很方便。可簡單輸入?# cryptsetup --help?來測試 LUKS 是否可用。如果沒有顯示任何關于 LUKS 的信息,可看下面Without LUKS?的介紹。第一步如果需要的話創建一個分區:fdisk /dev/sdc。創建加密分區
# dd if=/dev/urandom of=/dev/sdc1 # 可選 # cryptsetup -y luksFormat /dev/sdc1 # 這破壞了在 sdc1 上的數據 # cryptsetup luksOpen /dev/sdc1 sdc1 # mkfs.ext3 /dev/mapper/sdc1 # 創建 ext3 文件系統 # mount -t ext3 /dev/mapper/sdc1 /mnt # umount /mnt # cryptsetup luksClose sdc1 # Detach 已加密的分區Attach
# cryptsetup luksOpen /dev/sdc1 sdc1 # mount -t ext3 /dev/mapper/sdc1 /mntDetach
# umount /mnt # cryptsetup luksClose sdc1dm-crypt without LUKS
# cryptsetup -y create sdc1 /dev/sdc1 # 或任何其他分區像 /dev/loop0 # dmsetup ls # 檢查一下,將顯示:sdc1 (254, 0) # mkfs.ext3 /dev/mapper/sdc1 # 只有第一次要這么做! # mount -t ext3 /dev/mapper/sdc1 /mnt # umount /mnt/ # cryptsetup remove sdc1 # Detach 已加密的分區 這樣做等同于(非 mkfs 部分) re-attach 分區。如果密碼不正確,mount 命令將會失敗。對于這個例子,只要簡單的移除 sdc1 (cryptsetup remove sdc1)并重建即可。FreeBSD
兩個流行的 FreeBSD 磁盤加密模塊為?gbde?和?geli。我現在使用?geli?原因是它夠快并且它使用加解密硬件加速設備。詳情可看?FreeBSD 使用手冊 18.6。geli?模塊必須已編譯或加載進內核: options GEOM_ELI device crypto # 內核配置文件中加入這兩行 # echo 'geom_eli_load="YES"' >> /boot/loader.conf # 也可以在系統引導時加載或者做:kldload geom_eli使用密碼和密鑰
我為一個典型的磁盤加密使用這些設置,其使用了一個口令和一個加密主密鑰(master key)的密鑰。這意味著你需要密碼和生產的密鑰?/root/ad1.key?來 attach 分區。主密鑰存儲在這個加密分區中并且不可見。看下面為 USB 或 映像文件的加密設置。創建加密分區
# dd if=/dev/random of=/root/ad1.key bs=64 count=1 # 加密主密鑰的密鑰 # geli init -s 4096 -K /root/ad1.key /dev/ad1 # 對于磁盤也可用 -s 8192 # geli attach -k /root/ad1.key /dev/ad1 # 將 /dev/ad1 與所生成的密鑰 /root/ad1.key 關聯 # dd if=/dev/random of=/dev/ad1.eli bs=1m # 可選,需要很長時間 # newfs /dev/ad1.eli # 創建文件系統 # mount /dev/ad1.eli /mntAttach
# geli attach -k /root/ad1.key /dev/ad1 # fsck -ny -t ffs /dev/ad1.eli # 檢查文件系統 # mount /dev/ad1.eli /mntDetach
Detach 步驟會在關機時自動完成。 # umount /mnt # geli detach /dev/ad1.eli/etc/fstab
加密分區在 /etc/fstab 中配置成自動加載。系統啟動時會詢問加密分區的密碼。對于本例下列設置是必須的: # grep geli /etc/rc.conf geli_devices="ad1" geli_ad1_flags="-k /root/ad1.key" # grep geli /etc/fstab /dev/ad1.eli /home/private ufs rw 0 0僅用密碼
加密一個 USB stick 或者映像文件使用密碼而不是密鑰來得更方便。這種情況下,沒有必要隨身攜帶額外的密鑰文件。所做步驟同上面非常相似,只是不需要密鑰文件。讓我們來加密一個 1 GB 的映像文件/cryptedfile。 # dd if=/dev/zero of=/cryptedfile bs=1M count=1000 # 1 GB 文件 # mdconfig -at vnode -f /cryptedfile # geli init /dev/md0 # 僅用密碼加密 # geli attach /dev/md0 # newfs -U -m 0 /dev/md0.eli # mount /dev/md0.eli /mnt # umount /dev/md0.eli # geli detach md0.eli 現在可以把這個映像文件加載成僅需密碼的文件系統。 # mdconfig -at vnode -f /cryptedfile # geli attach /dev/md0 # mount /dev/md0.eli /mntSSL 認證
所謂的 SSL/TLS 認證是加密的公鑰認證,它由一個公用密鑰和私用密鑰組成。證書用來認證終端和加密數據的。例如,用在 web 服務器(https)或者郵件服務器(imaps)。步驟
- 我們需要一個證書頒發機構來簽署我們的證書。這一步通常由供應商提供,如 Thawte、Verisign等。不過,我們也可以創建我們自己的。
- 創建一個證書簽發申請(signing request)。這個申請需要一個已經包含所有必需的信息的未簽署證書(公共部分)。該證書申請通常發送到認證供應商去簽署。這一步同樣也在本地機器上創建了私鑰。
- 證書頒發機構簽署證書。
- 如果有需要,加入證書和密鑰到單個文件來給應用程序使用(web 服務器、郵件服務器等)。
配置 OpenSSL
我們使用 /usr/local/certs 作為這個例子的目錄或者根據你的設置相應的編輯 /etc/ssl/openssl.cnf 文件,因此你知道文件將創建在哪里。以下是 openssl.cnf 的相關部分: [ CA_default ] dir = /usr/local/certs/CA # 保存所有信息的文件夾 certs = $dir/certs # 已生成證書的默認保存目錄 crl_dir = $dir/crl # 生成的證書撤銷列表(CRL)的默認保存目錄 database = $dir/index.txt # 保存已簽發證書的文本數據庫文件 確保所有目錄已經創建 # mkdir -p /usr/local/certs/CA # cd /usr/local/certs/CA # mkdir certs crl newcerts private # echo "01" > serial # 僅當 serial 不存在時 # touch index.txt創建一個認證授權
如果你沒有來自供應商的認證授權,你必須創建你自己的。如果打算去供應商簽署申請,那么這個步驟不是必須的。創建認證授權 (CA): # openssl req -new -x509 -days 730 -config /etc/ssl/openssl.cnf \ -keyout CA/private/cakey.pem -out CA/cacert.pem創建證書簽發申請
要創建一個新證書(比如給郵件服務器或 web 服務器),首先用其私鑰創建證書申請。如果你的應用程序不支持加密的私鑰(比如 UW-IMAP 就不支持),那么就用?-nodes?來禁用加密。 # openssl req -new -keyout newkey.pem -out newreq.pem \ -config /etc/ssl/openssl.cnf # openssl req -nodes -new -keyout newkey.pem -out newreq.pem \ -config /etc/ssl/openssl.cnf # 不對這個密鑰加密簽署證書
該證書申請由 CA 簽發確認,這個步驟通常由供應商完成。注意:在下面命令中替換 "servername" 成你的服務器名稱。 # cat newreq.pem newkey.pem > new.pem # openssl ca -policy policy_anything -out servernamecert.pem \ -config /etc/ssl/openssl.cnf -infiles new.pem # mv newkey.pem servernamekey.pem 現在,servernamekey.pem 就是私鑰,servernamecert.pem 就為服務器的證書。創建聯合認證(united certificate)
IMAP 服務器想要私鑰和服務器證書在同一個文件中。通常,這還是比較容易處理的,但是該文件要保證安全! Apache 也可以處理好它。創建一個包含證書和密鑰的文件 servername.pem 。- 用文本編輯器打開私鑰文件(servernamekey.pem),并拷貝私鑰到 "servername.pem" 文件中去。
- 服務器證書(servernamecert.pem)也做同樣的動作。
-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQDutWy+o/XZ/[...]qK5LqQgT3c9dU6fcR+WuSs6aejdEDDqBRQ -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIERzCCA7CgAwIBAgIBBDANB[...]iG9w0BAQQFADCBxTELMAkGA1UEBhMCREUx -----END CERTIFICATE----- 現在我們的 /usr/local/certs/ 目錄中有了這些;
- CA/private/cakey.pem?(CA 服務器私鑰)
- CA/cacert.pem?(CA 服務器公鑰)
- certs/servernamekey.pem?(服務器私鑰)
- certs/servernamecert.pem?(服務器已簽署的證書)
- certs/servername.pem?(私鑰和服務器證書)
查看證書信息
要查看證書信息,只要這么做: # openssl x509 -text -in servernamecert.pem # 顯示證書信息 # openssl req -noout -text -in server.csr # 顯示申請信息 # openssl s_client -connect cb.vu:443 # 檢查 web 服務器認證信息CVS
服務器設置?|?CVS 測試?|?SSH 隧道?|?CVS 使用
服務器設置
CVS 環境初始化
決定主 repository 將要創建和重置的 cvs 根目錄。比如 /usr/local/cvs (根): # mkdir -p /usr/local/cvs # setenv CVSROOT /usr/local/cvs # 設置 CVSROOT 環境變量(本地) # cvs init # 創建所有初始化 CVS 配置文件 # cd /root # cvs checkout CVSROOT # 簽出配置文件來修改他們 # cd CVSROOT edit config ( fine as it is) # cvs commit config cat >> writers # 創建 writers 文件 (也可為 readers) colin ^D # 使用 [Control][D] 退出編輯 # cvs add writers # 添加文件 writers 進 repository # cvs edit checkoutlist # cat >> checkoutlist writers ^D # 使用 [Control][D] 退出編輯 # cvs commit # 提交所有配置更改 添加一個?readers?文件,如果你要區分讀寫權限的話。注意:?不要在主 cvs 中直接編輯文件,而應該簽出要編輯的文件,修改完成后再簽入。我們所做的文件?writers?用來定義可寫權限。下面有三種流行的方式去訪問 CVS。前兩個不需要任何進一步的配置。看?CVSROOT?部分的實例了解如何使用它們:
- 直接本的訪問文件系統。用戶需要有足夠的權限來直接訪問 CVS,除了要登錄到操作系統,沒有進一步的驗證。然而這僅對本地 repository 才有用。
- 使用 ext 協議通過 ssh 來遠程訪問。任何有 ssh shell 賬戶和在 CVS 服務器上可讀寫權限的都可直接使用 ext 協議通過 ssh 來訪問 CVS,而不需要任何額外的隧道。沒有服務器來處理運行在 CVS 上的驗證工作。ssh 登錄會去驗證。
- 用 pserver 來遠程訪問。這是對于有較大用戶量的首選方法,用戶由 CVS 的 pserver 通過一個專門的密碼數據庫來驗證,因此不需要本地用戶帳戶。這種設置在下面會有說明。
用 inetd 設置網絡
如果不需要網絡訪問,CVS 可以運行于本地。對于遠程訪問,在 /etc/inetd.conf (Suse 為 /etc/xinetd.d/cvs)中配置如下行,可讓守護進程 inetd 啟動 pserver: cvspserver stream tcp nowait cvs /usr/bin/cvs cvs \ --allow-root=/usr/local/cvs pserver 這是個用來阻斷從 internet 訪問 cvs 端口的好方法,可使用 ssh 隧道來遠程的訪問 repository。單獨認證
CVS 用戶可能不是操作系統的一部分(即不是本地用戶)。這其實可從安全的角度去看。簡單的添加一個叫?passwd?(in the CVSROOT directory) 的文件,其包含 crypt 格式的用戶登錄名和密碼。這也可以使用 apache 的 htpasswd 工具來完成。注意:這個 passwd 文件僅僅是文件,可以在 CVSROOT 中直接編輯。它不能被簽出。更多信息請用 htpasswd --help # htpasswd -cb passwd user1 password1 # -c 創建文件 # htpasswd -b passwd user2 password2 現在添加?:cvs?到每行的結尾處,用來告訴 cvs 服務器更改用戶到 cvs (或任何你正在運行的 cvs 服務器下)。它看起來像這樣: # cat passwd user1:xsFjhU22u8Fuo:cvs user2:vnefJOsnnvToM:cvs
測試它
測試作為一般用戶登錄(比如我) # cvs -d :pserver:colin@192.168.50.254:/usr/local/cvs login Logging in to :pserver:colin@192.168.50.254:2401/usr/local/cvs CVS password:CVSROOT 變量
這是個環境變量用來指定 repository 的位置。對于本地使用,該變量只需設置成 repository 的目錄。對于通過網絡使用,傳輸協議必須指定。使用?setenv CVSROOT string?(csh, tcsh shell) 或者?export CVSROOT=string?( sh, bash shell) 設置 CVSROOT 環境變量。 # setenv CVSROOT :pserver:<username>@<host>:/cvsdirectory For example: # setenv CVSROOT /usr/local/cvs # 僅限本的使用 # setenv CVSROOT :local:/usr/local/cvs # 同上 # setenv CVSROOT :ext:user@cvsserver:/usr/local/cvs # 通過 SSH 直接訪問 # setenv CVS_RSH ssh # ext 協議訪問 # setenv CVSROOT :pserver:user@cvsserver.254:/usr/local/cvs # 通過 pserver 網絡訪問 一旦登錄成功就可導入一個新項目進 repository:cd 進入你的項目根目錄 cvs import <module name> <vendor tag> <initial tag> cvs -d :pserver:colin@192.168.50.254:/usr/local/cvs import MyProject MyCompany START 在 repository 中有個名叫 MyProject 新項目(之后用來簽出)。CVS 會導入當前目錄的內容進新項目。簽出: # cvs -d :pserver:colin@192.168.50.254:/usr/local/cvs checkout MyProject 或者 # setenv CVSROOT :pserver:colin@192.168.50.254:/usr/local/cvs # cvs checkout MyProject
通過 SSH 隧道訪問 CVS
我們需要兩個 shell 來做這個。在第一個 shell 中,我們連接到 cvs 服務器并對 cvs 連接進行端口轉發(port-forward)。在第二個 shell 中,我們就像在本地一樣使用 cvs。?在 shell 1: # ssh -L2401:localhost:2401 colin@cvs_server # 直接連接到 cvs 服務器。或: # ssh -L2401:cvs_server:2401 colin@gateway # 使用一個網關間接連接到 cvs 服務器 在 shell 2: # setenv CVSROOT :pserver:colin@localhost:/usr/local/cvs # cvs login Logging in to :pserver:colin@localhost:2401/usr/local/cvs CVS password: # cvs checkout MyProject/src
CVS 命令及其使用
導入
該 import 命令用來添加整個目錄,它必須運行于要導入的目錄中。比如,目錄 /devel/ 包含的所有文件和子目錄要導入。該目錄名在 CVS 中(模塊)將會稱為 "myapp"。 # cvs import [options] directory-name vendor-tag release-tag # cd /devel # 必須在該目錄中來導入 # cvs import myapp Company R1_0 # 修訂(release)標簽可以為任何單個單詞 在添加了一個新目錄 "/devel/tools/" 后,也可這么導入。 # cd /devel/tools # cvs import myapp/tools Company R1_0簽出、更新和提交
# cvs co myapp/tools # 僅會簽出 tools 目錄 # cvs co -r R1_1 myapp # 簽出修訂版本為 R1_1 的 myapp (sticky) # cvs -q -d update -P # 典型的 CVS 更新 # cvs update -A # 重置所有 sticky 標簽(或日期、選項) # cvs add newfile # 添加一個新文件 # cvs add -kb newfile # 添加一個二進制文件 # cvs commit file1 file2 # 僅提交這兩個文件 # cvs commit -m "message" # 提交所有更改并為這個更改添加日志消息創建一個 patch
It is best to create and apply a patch from the working development directory related to the project, or from within the source directory. # cd /devel/project # diff -Naur olddir newdir > patchfile # Create a patch from a directory or a file # diff -Naur oldfile newfile > patchfile應用一個 patch
Sometimes it is necessary to strip a directory level from the patch, depending how it was created. In case of difficulties, simply look at the first lines of the patch and try -p0, -p1 or -p2. # cd /devel/project # patch --dry-run -p0 < patchfile # Test the path without applying it # patch -p0 < patchfile # patch -p1 < patchfile # strip off the 1st level from the pathSVN
Server setup?|?SVN+SSH?|?SVN over http?|?SVN usage
Subversion (SVN)?is a version control system designed to be the successor of CVS (Concurrent Versions System). The concept is similar to CVS, but many shortcomings where improved. See also the?SVN book.Server setup
The initiation of the repository is fairly simple (here for example?/home/svn/?must exist): # svnadmin create --fs-type fsfs /home/svn/project1 Now the access to the repository is made possible with:- file://?Direct file system access with the svn client with. This requires local permissions on the file system.
- svn://?or?svn+ssh://?Remote access with the svnserve server (also over SSH). This requires local permissions on the file system.
- http://?Remote access with webdav using apache. No local users are necessary for this method.
Remote access with ssh
No special setup is required to access the repository via ssh, simply replace?file://?with?svn+ssh/hostname. For example: # svn checkout svn+ssh://hostname/home/svn/project1 As with the local file access, every user needs an ssh access to the server (with a local account) and also read/write access. This method might be suitable for a small group. All users could belong to a subversion group which owns the repository, for example: # groupadd subversion # groupmod -A user1 subversion # chown -R root:subversion /home/svn # chmod -R 770 /home/svnRemote access with http (apache)
Remote access over http (https) is the only good solution for a larger user group. This method uses the apache authentication, not the local accounts. This is a typical but small apache configuration: LoadModule dav_module modules/mod_dav.so LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so # Only for access control <Location /svn>DAV svn# any "/svn/foo" URL will map to a repository /home/svn/fooSVNParentPath /home/svnAuthType BasicAuthName "Subversion repository"AuthzSVNAccessFile /etc/apache2/svn.aclAuthUserFile /etc/apache2/svn-passwdRequire valid-user </Location> The apache server needs full access to the repository: # chown -R www:www /home/svn Create a user with htpasswd2: # htpasswd -c /etc/svn-passwd user1 # -c creates the fileAccess control svn.acl example
# Default it read access. "* =" would be default no access [/] * = r [groups] project1-developers = joe, jack, jane # Give write access to the developers [project1:] @project1-developers = rwSVN commands and usage
See also the?Subversion Quick Reference Card.?Tortoise SVN?is a nice Windows interface.Import
A new project, that is a directory with some files, is imported into the repository with the?import?command. Import is also used to add a directory with its content to an existing project. # svn help import # Get help for any command # Add a new directory (with content) into the src dir on project1 # svn import /project1/newdir http://host.url/svn/project1/trunk/src -m 'add newdir'Typical SVN commands
# svn co http://host.url/svn/project1/trunk # Checkout the most recent version # Tags and branches are created by copying # svn mkdir http://host.url/svn/project1/tags/ # Create the tags directory # svn copy -m "Tag rc1 rel." http://host.url/svn/project1/trunk \http://host.url/svn/project1/tags/1.0rc1 # svn status [--verbose] # Check files status into working dir # svn add src/file.h src/file.cpp # Add two files # svn commit -m 'Added new class file' # Commit the changes with a message # svn ls http://host.url/svn/project1/tags/ # List all tags # svn move foo.c bar.c # Move (rename) files # svn delete some_old_file # Delete files實用命令
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?? ? ? 回復所有此行的更改
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)字符補齊
備份和恢復
# 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 終端
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 分鐘改變文件狀態的文件
混雜的
# 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 # 修改目錄名軟件安裝
列出已安裝過的軟件包
# rpm -qa # 列出已安裝過的軟件包(RH, SuSE, 基于 RPM 的) # dpkg -l # Debian, Ubuntu # pkg_info # 列出所有已安裝過的軟件包(FreeBSD) # pkg_info -W smbd # 查看 smbd 安裝了那些軟件包(FreeBSD) # pkginfo # Solaris添加/刪除軟件
前端界面:SuSE 為 yast2/yast,Red Hat 為 redhat-config-packages。 # rpm -i pkgname.rpm # 安裝軟件包(RH, SuSE, 基于 RPM 的) # rpm -e pkgname # 刪除軟件包Debian
# apt-get update # 更新源列表 # apt-get install emacs # 安裝 emacs 軟件包 # dpkg --remove emacs # 刪除 emacs 軟件包 # dpkg -S file # 查找擁有該 file 的軟件包Gentoo
Gentoo 使用 emerge 作為 "Portage" 軟件包管理系統的核心。 # emerge --sync # 同步更新本地 protage 樹 # emerge -u packagename # 安裝或更新一個軟件包 # emerge -C packagename # 刪除軟件包 # revdep-rebuild # 修復依賴關系的缺失Solaris
<cdrom> 路徑通常為?/cdrom/cdrom0. # pkgadd -d <cdrom>/Solaris_9/Product SUNWgtar # pkgadd -d SUNWgtar # 添加下載的軟件包(先要 bunzip2) # pkgrm SUNWgtar # 刪除軟件包FreeBSD
# pkg_add -r rsync # 獲取并安裝 rsync # pkg_delete /var/db/pkg/rsync-xx # 刪除 rsync 軟件包 可使用?PACKAGESITE?環境變量來設置哪里可以獲取軟件包。舉個例子: # export PACKAGESITE=ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages/Latest/ # or ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-6-stable/Latest/FreeBSD ports
Port 樹?/usr/ports/?是一個準備編譯和安裝的軟件集。可用?portsnap?工具來跟新 port。 # portsnap fetch extract # 當第一次運行這個命令,會創建 port 樹 # portsnap fetch update # 跟新 port 樹 # cd /usr/ports/net/rsync/ # 選擇軟件安裝目錄 # make install distclean # 安裝并清理(也可看 man ports) # make package # Make 一個二進制軟件包庫路徑
由于復雜的依賴關系和運行時鏈接,程序難于分發或拷貝到其他系統。不過對于較少依賴關系的小程序,缺失的庫可被拷貝過去。運行時庫(即缺失的庫)可用?ldd?和?ldconfig?來檢查和管理。 # ldd /usr/bin/rsync # 列出所有所需的運行時庫 # ldconfig -n /path/to/libs/ # 添加一個路徑到共享庫目錄Add a path to the shared libraries directories # ldconfig -m /path/to/libs/ # FreeBSD # LD_LIBRARY_PATH # 設置連接庫路徑的環境變量媒體轉換
有時候需要轉換一個視頻、音頻文件或者文檔成其他格式。文本編碼
文本編碼可以得到完全錯誤的,特別是當語言需要某些特殊字符像 à??。命令?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)。Unix - DOS 新行
在 Unix Shell 中轉換 DOS (CR/LF) 到 Unix (LF) 新行格式。也可使用?dos2unix?和?unix2dos?工具,如果你有它們的話。 # sed 's/.$//' dosfile.txt > unixfile.txt 在 Windows 環境中轉換 Unix 到 Dos 新行格式。需要在 mingw 或 cygwin 中使用 sed。 # sed -n p unixfile.txt > dosfile.txtPDF 轉換成 Jpeg 和 連接一串 PDF 文件
用?gs?(GhostScript) 工具轉換 PDF 文檔的每一頁成 jpeg (或 png)圖像。也可以使用更短的?convert?(來自 ImageMagick 或 GraphicsMagick 工具) 命令。 # gs -dBATCH -dNOPAUSE -sDEVICE=jpeg -r150 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 \-dMaxStripSize=8192 -sOutputFile=unixtoolbox_%d.jpg unixtoolbox.pdf # convert unixtoolbox.pdf unixtoolbox-%03d.png # convert *.jpeg images.pdf # 把所有圖片轉換成一份簡單的 PDF 文檔 Ghostscript 同樣可連接多個 pdf 文件成一份 PDF 文檔。這僅可工作于這些 PDF 文件都 "呈現一致(well behaved)" 的情況下。 # gs -q -sPAPERSIZE=a4 -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=all.pdf \ file1.pdf file2.pdf ... # 在 Windows 上使用 '#' 代替 '='視頻轉換
使用 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打印
打印命令 lpr
# lpr unixtoolbox.ps # 用默認打印機打印 # export PRINTER=hp4600 # 更改默認打印機 # lpr -Php4500 #2 unixtoolbox.ps # 指定打印機 hp4500 并打印 2 份 # lpr -o Duplex=DuplexNoTumble ... # 啟用雙面打印 # lpr -o PageSize=A4,Duplex=DuplexNoTumble ... # lpq # 查看默認打印機的隊列 # lpq -l -Php4500 # 詳細顯示打印機隊列信息 # lprm - # 刪除所有打印機內的用戶打印作業 # lprm -Php4500 3186 # 刪除作業 3186。可使用 lpq 查看作業號 # lpc status # 列印所有可用打印機 # lpc status hp4500 # 如果打印機在線,查看其狀態和列隊長度 當要打印 PDF 文件時,一些打印設備不具備處理 postscript 的能力。可以這樣解決: # gs -dSAFER -dNOPAUSE -sDEVICE=deskjet -sOutputFile=\|lpr file.pdf數據庫
PostgreSQL
更改 root 用戶或其它用戶的密碼
# psql -d template1 -U pgsql > alter user pgsql with password 'pgsql_password'; # pgsql 為需要更改密碼的用戶名創建用戶和數據庫
命令?createuser,?dropuser,?createdb?和?dropdb?等同于 SQL 命令的快捷方式。我們創建一個新用戶叫 bob 和一個數據庫叫 bobdb;使用數據庫的超級用戶 pgsql 來創建: # createuser -U pgsql -P bob # -P 會請求一個秘密 # createdb -U pgsql -O bob bobdb # 新數據庫 bobdn 的所有者是 bob # dropdb bobdb # 刪除數據庫 bobdb # dropuser bob # 刪除用戶 bob 一般數據庫認證機制配置在 pg_hba.conf 文件中。允許遠程訪問
文件?$PGSQL_DATA_D/postgresql.conf?可指定綁定地址。對于 Postgres 8.x 通常為?listen_addresses = '*'。文件?$PGSQL_DATA_D/pg_hba.conf?定義了訪問控制。舉例: # TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD host bobdb bob 212.117.81.42 255.255.255.255 password host all all 0.0.0.0/0 password
備份和恢復
使用 pgsql 或 postgres 用戶來完成備份與恢復。下面是備份和恢復單個數據庫: # pg_dump --clean dbname > dbname_sql.dump # psql dbname < dbname_sql.dump 備份和恢復所有數據庫(包括用戶): # pg_dumpall --clean > full.dump # psql -f full.dump postgres 在這個例子中,你可以聲明任意現有的數據庫進行連接,但是如果你是向一個空的數據庫集群裝載,那么 postgres 應該是比較好的選擇。MySQL
更改 mysql root 用戶或其它用戶的密碼
方法 1
# /etc/init.d/mysql stop or # killall mysqld # mysqld --skip-grant-tables # mysqladmin -u root password 'newpasswd' # /etc/init.d/mysql start方法 2
# mysql -u root mysql mysql> UPDATE USER SET PASSWORD=PASSWORD("newpassword") where user='root'; mysql> FLUSH PRIVILEGES; # 使用用戶名替代"root" mysql> quit創建用戶和數據庫
# mysql -u root mysql mysql> CREATE DATABASE bobdb; mysql> GRANT ALL ON *.* TO 'bob'@'%' IDENTIFIED BY 'pwd'; # 使用 localhost 替代 % 來限制網絡訪問 mysql> DROP DATABASE bobdb; # 刪除數據庫 bobdb mysql> DROP USER bob; # 刪除用戶 bob mysql> DELETE FROM mysql.user WHERE user='bob and host='hostname'; # 刪除 mysql 數據庫 user 表中 user=bob,host=hostname 的記錄 mysql> FLUSH PRIVILEGES;允許遠程訪問
遠程訪問通常允許單個數據庫,而不是所有的數據庫。文件?/etc/my.cnf?包含約定的 IP 地址。通常為?bind-address =?綁定地址。 # mysql -u root mysql mysql> GRANT ALL ON bobdb.* TO bob@'xxx.xxx.xxx.xxx' IDENTIFIED BY 'PASSWORD'; mysql> REVOKE GRANT OPTION ON foo.* FROM bar@'xxx.xxx.xxx.xxx'; mysql> FLUSH PRIVILEGES; # 使用 'hostname' 也可為 '%' 來完全訪問備份和恢復
備份和恢復單個數據庫: # mysqldump -u root -psecret --add-drop-database dbname > dbname_sql.dump # mysql -u root -psecret -D dbname < dbname_sql.dump 備份和恢復所有的數據庫: # mysqldump -u root -psecret --add-drop-database --all-databases > full.dump # mysql -u root -psecret < full.dump 這里 mysql root 的密碼為 "secret",-p 選項后面沒有空格。當單獨使用 -p 選項(不跟密碼),命令行提示符后會要求輸入密碼。SQLite
SQLite?是一個小而強大的、獨立的(self-contained)、無服務器的(serverless)、零配置的(zero-configuration) SQL 數據庫。備份和恢復
實用備份和恢復 SQLite 數據庫命令。舉個例子,你可以編輯備份文件來修改字段的屬性和類型,然后再恢復這個數據庫。這比使用 SQL 命令來得容易。對于 3.x 數據庫可使用?sqlite3。 # sqlite database.db .dump > dump.sql # 備份 # sqlite database.db < dump.sql # 恢復轉換 2.x 到 3.x 數據庫
sqlite database_v2.db .dump | sqlite3 database_v3.db磁盤限額
磁盤限額用來限制磁盤空間大小和/或用戶(或用戶組)可用的文件數。The quotas are allocated on a per-file system basis and are enforced by the kernel.Linux 設置
Quota 工具包通常已安裝,其包含一些命令行工具。在 fstab 中激活用戶配額并重新掛載分區。如果分區正在使用,關閉所有使用的文件,或者重啟系統。添加?usrquota?到 fstab 的掛載類型中,舉個例子: /dev/sda2 /home reiserfs rw,acl,user_xattr,usrquota 1 1 # mount -o remount /home # mount # 檢查 usrquota 已經激活,否則重啟 用?quotacheck?初始化 quota.user 文件。 # quotacheck -vum /home # chmod 644 /home/aquota.user # 讓用戶檢查自己的配額 用腳本(e.g. SuSE 的 /etc/init.d/quotad)或?quotaon?來啟用限額: quotaon -vu /home 檢查配額啟用情況: quota -v
FreeBSD 設置
Quota 工具是 FreeBSD 基本系統的一部分,然而內核需要 quota 選項。如果不存在,新增它并重新編譯內核。 options QUOTA 與 Linux 一樣,添加限額到 fstab 選項(是 userquota,而不是 usrquota)中: /dev/ad0s1d /home ufs rw,noatime,userquota 2 2 # mount /home # 重新掛載分區 在 /etc/rc.conf 中啟用磁盤限額并開啟 quota 服務。 # grep quotas /etc/rc.conf enable_quotas="YES" # 在啟動時打開限額(或者 "NO") check_quotas="YES" # 在啟動時檢查限額(或者 "NO") # /etc/rc.d/quota start分配限額
磁盤限額默認并不限制(設置為0)。用?edquota?來對單用戶進行限制。一個 quota 也可給許多用戶復用。雖然 quota 實現之間的文件結構不同,但其原理是相同的:限制節點(inodes)數量以及使用者可以取用的磁盤區塊數量。Only change the values of soft and hard. 如果未指定,默認區塊大小為 1k。使用?edquota -t?設置 grace 時間。舉個例子: # edquota -u colinLinux
Disk quotas for user colin (uid 1007):Filesystem blocks soft hard inodes soft hard/dev/sda8 108 1000 2000 1 0 0FreeBSD
Quotas for user colin: /home: kbytes in use: 504184, limits (soft = 700000, hard = 800000)inodes in use: 1792, limits (soft = 0, hard = 0)給許多用戶分配限額
命令?edquota -p?用來復用一個 quota 給其他用戶。舉個例子,復用所指用戶的限額給所有用戶: # edquota -p refuser `awk -F: $3 > 499 {print $1}' /etc/passwd` # edquota -p refuser user1 user2 # 復用給 2 個用戶檢查
用戶只需輸入?quota?(文件 quota.user 必須可讀) 來可以檢查他們的限額。Root 可以查看所有用戶的限額。 # quota -u colin # 查看用戶的限額 # repquota /home # 所有用戶在這個分區上的限額情況SHELLS
許多 Linux 發行版使用 BASH Shell,BSD 使用的是 tcsh,Bourne Shell 僅用于腳本。過濾器(Filter)非常有用并且可用于管道(pipe):- grep?? ?模式匹配
- sed?? ? 查找并替換字符串或字符
- cut?? ? 從一個標記開始打印所指定列數據
- sort?? ?按字母或數字排序
- uniq?? ?刪除一個文件中重復行
bash
Bash、sh 的重定向和管道: # cmd 1> file # 重定向標準輸出到 file。 # cmd 2> file # 重定向標準錯誤輸出到 file。 # cmd 1>> file # 重定向標準輸出并追加到 file。 # cmd &> file # 重定向標準輸出和標準錯誤輸出到 file。 # cmd >file 2>&1 # 重定向標準錯誤輸出到標準輸出然后重定向到 file。 # cmd1 | cmd2 # cmd1 的輸出通過管道連接到 cmd2 的輸入 # cmd1 2>&1 | cmd2 # cmd1 的輸出和錯誤輸出通過管道連接到 cmd2 的輸入 修改你的配置文件 ~/.bashrc (也可以是 ~/.bash_profile)。下列條目非常有用,使用". .bashrc"重新加載。 # in .bashrc bind '"\e[A"':history-search-backward # 使用上下鍵查找 bind '"\e[B"':history-search-forward # 歷史命令。無價之寶! set -o emacs # Set emacs mode in bash (看下面) set bell-style visible # Do not beep, inverse colors# 設置一個漂亮的提示符像 [user@host]/path/todir> PS1="\[\033[1;30m\][\[\033[1;34m\]\u\[\033[1;30m\]" PS1="$PS1@\[\033[0;33m\]\h\[\033[1;30m\]]\[\033[0;37m\]" PS1="$PS1\w\[\033[1;30m\]>\[\033[0m\]" # 要檢查當前可用別名(alias),只需簡單輸入命令 alias alias ls='ls -aF' # 添加指示符(*/=>@| 其中之一) alias ll='ls -aFls' # 清單 alias la='ls -all' alias ..='cd ..' alias ...='cd ../..' export HISTFILESIZE=5000 # 巨大的歷史記錄 export CLICOLOR=1 # 使用顏色(如果可用) export LSCOLORS=ExGxFxdxCxDxDxBxBxExExtcsh
Tcsh、csh 的重定向和管道(> 和 >> 同 sh 中一樣): # cmd >& file # 重定向標準輸出和標準錯誤輸出到 file。 # cmd >>& file # 追加標準輸出和標準錯誤輸出到 file。 # cmd1 | cmd2 # cmd1 的輸出通過管道連接到 cmd2 的輸入 # cmd1 |& cmd2 # cmd1 的輸出和錯誤輸出通過管道連接到 cmd2 的輸入 Csh/tcsh 的設置在?~/.cshrc?中,使用"source .cshrc"來重新加載。例子: # in .cshrc alias ls 'ls -aF' alias ll 'ls -aFls' alias la 'ls -all' alias .. 'cd ..' alias ... 'cd ../..' set prompt = "%B%n%b@%B%m%b%/> " # 像 user@host/path/todir> set history = 5000 set savehist = ( 6000 merge ) set autolist # 控制命令補全和變量補全 set visiblebell # 使用閃動屏幕的方式來取代蜂鳴器鳴叫 # Bindkey 和顏色 bindkey -e Select Emacs bindings # 將命令行編輯器切換到emacs模式 bindkey -k up history-search-backward # 使用上下鍵來搜索 bindkey -k down history-search-forward setenv CLICOLOR 1 # 使用顏色(可能的話) setenv LSCOLORS ExGxFxdxCxDxDxBxBxExEx 該 emacs 模式將使用 emacs 快捷鍵來修改命令提示行。這是非常有用的(不單為 Emacs 用戶)。最常用的命令如下:- C-a ? ? ? 移動光標到行頭
- C-e ? ? ? 移動光標到行尾
- M-b ? ? ? 移動光標到前一個單詞
- M-f ? ? ? 移動光標到后一個單詞
- M-d ? ? ? 剪切下一個單詞
- C-w ? ? ? 剪切最后一個單詞
- C-u ? ? ? 剪切光標前所有字符
- C-k ? ? ? 剪切光標后所有字符
- C-y ? ? ? 粘帖最后剪切的字符(簡易的粘帖)
- C-_ ? ? ? 重做
腳本
基礎?|?腳本實例?|?sed/實用命令
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 ]; do echo $count sleep 1 count=$(($count + 1)) done myfunction() { 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 else echo $MYHOME does not exist fi _EOF sh testhome.shBourne 腳本實例
來一個小實例,此腳本從本 xhtml 文檔創建一個 PDF 小冊子: #!/bin/sh # 此腳本可以創建一份供雙面打印機打印的 PDF 格式的書 if [ $# -ne 1 ]; then # 檢查參數是否等于 1 echo 1>&2 "Usage: $0 HtmlFile" exit 1 # 如果不等于1,非0退出 fi file=$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.ps ps2pdf13 -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/passwd testuser=$(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 內建的編程
C 基礎
strcpy(newstr,str) /* 拷貝 str 到 newstr */ expr1 ? expr2 : expr3 /* if (expr1) expr2 else expr3 */ x = (y > z) ? y : z; /* if (y > z) x = y; else x = z; */ int a[]={0,1,2}; /* 初始化數組 (或者 a[3]={0,1,2}; */ int a[2][3]={{1,2,3},{4,5,6}}; /* 初始化二維數組 */ int i = 12345; /* 從 i 轉換成 char str */ char str[10]; sprintf(str, "%d", i);C 實例
一個最小化的 C 程式 simple.c: #include <stdio.h> main() {int number=42;printf("The answer is %i\n", number); } 編譯: # gcc simple.c -o simple # ./simple The answer is 42C++ 基礎
*pointer // 指向對象的指針 &obj // 對象 obj 的地址 obj.x // 類(對象) obj 成員 x pobj->x // 指針 pobj 指向類(對象)成員 x// (*pobj).x 同 pobj->xC++ 實例
來一個稍微現實一點的 C++ 程序,我們在一個頭文件(IPv4.h)中創建一個類并且實現它(IPv4.cpp),然后創建一個程式來使用其功能。這個類的成員方法實現了 IP 地址從一串整數轉換成我們熟知的點分格式。這是一個最小化的 C++ 程式和多源文件(multi-source)的編譯。IPv4 class
IPv4.h:
#ifndef IPV4_H #define IPV4_H #include <string>namespace GenericUtils { // 創建 namespace class IPv4 { // 類定義 public: IPv4(); ~IPv4(); std::string IPint_to_IPquad(unsigned long ip);// 成員方法接口 }; } //namespace GenericUtils #endif // IPV4_HIPv4.cpp:
#include "IPv4.h" #include <string> #include <sstream> using namespace std; // 使用 namespace using namespace GenericUtils; IPv4::IPv4() {} // 默認構造/析構函數 IPv4::~IPv4() {} string IPv4::IPint_to_IPquad(unsigned long ip) { // 成員方法實現 ostringstream ipstr; // 使用字符串流 ipstr << ((ip &0xff000000) >> 24) // 位右移 << "." << ((ip &0x00ff0000) >> 16) << "." << ((ip &0x0000ff00) >> 8) << "." << ((ip &0x000000ff)); return ipstr.str(); }程序 simplecpp.cpp
#include "IPv4.h" #include <iostream> #include <string> using namespace std;int main (int argc, char* argv[]) { string ipstr; // 定義變量 unsigned long ipint = 1347861486; // 數字形式的 IP GenericUtils::IPv4 iputils; // 創建一個類的對象 ipstr = iputils.IPint_to_IPquad(ipint); // 調研類的成員方法 cout << ipint << " = " << ipstr << endl; // 輸出結果 return 0; } 編譯和執行: # g++ -c IPv4.cpp simplecpp.cpp # 編譯成目標文件 # g++ IPv4.o simplecpp.o -o simplecpp.exe # 連接目標代碼,生成可執行文件 # ./simplecpp.exe 1347861486 = 80.86.187.238 使用?ldd?腳本檢查并列出可執行程序所依賴的共享庫文件。這個命令同樣可以用來檢查共享庫的丟失。 # ldd /sbin/ifconfig簡單的 Makefile
相應的最小化多源文件(multi-source)編譯 Makefile 顯示如下。每一個命令行必須以?tab?開始!可以將一個較長行使用反斜線"\"來分解為多行。 CC = g++ CFLAGS = -O OBJS = IPv4.o simplecpp.osimplecpp: ${OBJS}${CC} -o simplecpp ${CFLAGS} ${OBJS} clean:rm -f ${TARGET} ${OBJS}轉載于:https://www.cnblogs.com/youyouii/p/10119466.html
總結
以上是生活随笔為你收集整理的linux命令备忘录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【JY】反应谱的详解与介绍
- 下一篇: [pion]测试你的TURN服务器