Linux運維筆記-日常操作命令總結(1)


 

在linux日常運維中,我們平時會用到很多常規的操作命令。

Centos系統中自動獲取本機ip的方法

1)Centos7系統 (如果ip所在網卡設備不是eth0,只需更改下面命令中的eth0為具體的網卡設備名稱即可)
# ifconfig eth0|sed -n '2p'|sed -e 's/^.*inet//g' -e 's/netmask.*$//g'
# ifconfig eth0|sed -n '2p'|sed 's/^.*inet//g;s/netmask.*$//g'
# ifconfig eth0| sed -nr '2s/(^[^0-9]+)([0-9.]+)+( .*$)/\2/gp'
# ifconfig eth0|sed -n '/broadcast/p'|sed -r 's@inet (.*) netmask.*@\1@'
# ifconfig eth0 |grep netmask|tr -s " "|cut -d" " -f3
 
 
例如:
[root@bz4ccs001ap1001 ~]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1400
        inet 172.20.20.93  netmask 255.255.255.0  broadcast 172.20.20.255
        inet6 fe80::f816:3eff:fe45:3a6b  prefixlen 64  scopeid 0x20<link>
        ether fa:16:3e:45:3a:6b  txqueuelen 1000  (Ethernet)
        RX packets 370851491  bytes 75867300558 (70.6 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 359199243  bytes 90333108242 (84.1 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 
[root@bz4ccs001ap1001 ~]# ifconfig eth0|sed -n '2p'
        inet 172.20.20.93  netmask 255.255.255.0  broadcast 172.20.20.255
 
[root@bz4ccs001ap1001 ~]# ifconfig eth0|sed -n '2p'|sed 's/^.*inet//g'
 172.20.20.93  netmask 255.255.255.0  broadcast 172.20.20.255
 
[root@bz4ccs001ap1001 ~]# ifconfig eth0|sed -n '2p'|sed 's/^.*inet//g'|sed 's/netmask.*$//g'
 172.20.20.93 
 
[root@bz4ccs001ap1001 ~]# ifconfig eth0|sed -n '2p'|sed -e 's/^.*inet//g' -e 's/netmask.*$//g'
 172.20.20.93 
 
注意:
在使用sed命令的時候,如果只是獲取信息,最好不要加-i參數,加-i參數后面必須要跟文件名,並且會在文件里生效
不加-i參數,就只是在當前輸出里生效
 
如下,使用-i參數
[root@bz4ccs001ap1001 ~]# ifconfig eth0|sed -n '2p'|sed -i 's/^.*inet//g'
sed: no input files
 
不使用-i參數
[root@bz4ccs001ap1001 ~]# ifconfig eth0|sed -n '2p'|sed 's/^.*inet//g'  
 172.20.20.93  netmask 255.255.255.0  broadcast 172.20.20.255
 
2)Centos6系統
# ifconfig eth0| sed -nr '2s/(^[^0-9]+)([0-9.]+)+( .*$)/\2/gp'

=========================================================================
使用hostname命令也可以獲取ip地址
[root@k8s-kevin ~]# hostname -i
172.16.60.241
[root@k8s-kevin ~]# hostname -I           #一般用-I參數獲取本機ip地址
172.16.60.241 172.30.232.0 

查看服務器的外網ip

[root@redis-new01 ~]# curl ifconfig.me
[root@redis-new01 ~]# curl ifconfig.me/all 

umount卸載不掉的處理方法

已經在/etc/fstab里配置了掛載路徑,如下:
[root@kevin ~]# cat /etc/fstab 
..........
..........
192.168.10.10:/APP /root/app/ glusterfs defaults,_netdev 0 0

[root@kevin ~]# df -h
..........
..........
192.168.10.10:/APP  2.0T  1.8T  110G  95% /root/app

如果mount掛載掉了,只需要重新掛載即可!
"mount -a"命令表示將/etc/fstab的所有內容重新加載。
[root@kevin ~]# umount /root/app    #先卸載
[root@kevin ~]# umount -a           #由於已經/etc/fstab里配置了掛載,這里只需要mount -a即可!

=======================================================
如果再執行umount的時候報錯如下:
[root@kevin ~]# umount /root/app
umount: /root/app: device is busy.
       (In some cases useful info about process that use
        the device is found by lsof(8) or fuser(1))

想查看下占用/root/app的進程,還有報錯
[root@kevin ~]# umount -m -k /root/app
Cannot  stat /root/app: Transport endpoint is not connected
Cannot  stat /root/app: Transport endpoint is not connected
Cannot  stat /root/app: Transport endpoint is not connected

加-f強制卸載,仍然是報錯
[root@kevin ~]# umount -f /root/app
umount2: Device or resource busy
umount: /root/app: device is busy.
        (In some cases useful info about process that use
        the device is found by lsof(8) or fuser(1))
umount2: Device or resource busy

接着使用lsof命令查看占用/root/app的進程
[root@kevin ~]# lsof |grep /roo/app
bash       14393     root  cwd       DIR               0,18       4096  9927484108586066995 /root/app/script/ansible/script

kill掉以上進程
[root@kevin ~]# kill -9 14393

這時,就可以順利進行umount卸載和重新掛載了
[root@kevin ~]# umount /root/app
[root@kevin ~]# mount -a

終端命令行限制設置- stty命令

比如在遠程一台機器的終端里粘貼一條長命令,發現粘貼后,命令的前一部分就自動縮進消失了!
這是因為這台機器的終端命令行做了columns列限制,即長度多了限制。

stty命令說明: http://man.linuxde.net/stty

例子:
[root@docker-registry ~]# stty -a
speed 38400 baud; rows 40; columns 187; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O;
min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

[root@docker-registry ~]# stty size         #查看命令行的行和列數限制
40 187

[root@docker-registry ~]# stty columns 500  #設置命令行的列數。上面的問題就是columns列數限制引起的,將其設置大點就可以了

[root@docker-registry ~]# stty rows 200     #設置命令行的行數

[root@docker-registry ~]# stty size       
200 500

[root@docker-registry ~]# stty -a         
speed 38400 baud; rows 200; columns 500; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

添加主機名

centos6修改主機名
[root@localhost ~]# hostname kevin-web01
[root@localhost ~]# vim /etc/sysconfig/network
HOSTNAME= kevin-web01
[root@localhost ~]# vim /etc/hosts
127.0.0.1 kevin-web01
  
還有一種終極修改(使用"sysctl kernel.hostname"可以查看)
[root@localhost ~]# echo "kernel.hostname = kevin-web01" >> /etc/sysctl.conf
[root@localhost ~]# sysctl -p          
  
=======================================
centos7修改主機名:參考https://www.cnblogs.com/kevingrace/p/8384467.html

修改靜態主機名
[root@localhost ~]# hostnamectl --static set-hostname kevin-web01

還可以修改/etc/hostname文件,修改后reboot才會生效。
[root@localhost ~]# cat /etc/hostname
localhost.localdomain       
[root@localhost ~]# echo "kevin-web01" > /etc/hostname   
[root@localhost ~]# cat /etc/hostname          
kevin-web01

tomcat中的war包直接解壓方法

tomcat里面的war包可以使用unzip解壓
先關閉tomcat服務,然后創建webapps,將war包放到webapps下解包,然后再將war包刪除,最后啟動tomcat

git提交文件

在修改文件后,執行下面操作進行代碼提交到git:
git add .                                            
git status                               #查看修改了哪些文件信息
git commit -m "edit message"                         
git push                                             

強制踢掉登陸用戶的方法

[root@zabbix-server ~]# who
root     tty1         2017-10-24 22:33
root     pts/0        2017-10-30 09:30 (172.16.24.193)
root     pts/2        2017-10-30 10:19 (172.16.24.193)
chenlin  pts/3        2017-10-26 15:13 (172.16.24.6)

只有root用戶才能踢人。任何用戶都可以踢掉自己。

第一種方法:通過查找出TTY的pid進行kill
[root@zabbix-server ~]# ps -ef|grep pts/3
root      6443  6365  0 10:20 pts/2    00:00:00 grep pts/3
chenlin  26645 26629  0 Oct26 ?        00:00:00 sshd: chenlin@pts/3
chenlin  26646 26645  0 Oct26 pts/3    00:00:00 -bash
[root@zabbix-server ~]# kill -9 26645
[root@zabbix-server ~]# who
root     tty1         2017-10-24 22:33
root     pts/0        2017-10-30 09:30 (172.16.24.193)
root     pts/2        2017-10-30 10:19 (172.16.24.193)

第二種:pkill -kill -t TTY
[root@zabbix-server ~]# pkill -kill -t tty1
[root@zabbix-server ~]# who
root     pts/0        2017-10-30 09:30 (172.16.24.193)
root     pts/2        2017-10-30 10:19 (172.16.24.193)
[root@zabbix-server ~]# pkill -kill -t pts/0
[root@zabbix-server ~]# who
root     pts/2        2017-10-30 10:19 (172.16.24.193)

當一台服務器uptime命令查看負載很高的時候,可以通過

top命令(按數字1可以查看到每顆CPU的使用情況;大寫P降序查看CPU使用率,大寫M降序查看內存使用率)
htop命令(和top命令差不多,P、M分別表示降序查看CPU和內存使用率)
iftop命令(流量監控,可以看出哪些機器跟本機有連接)
還可以查看crontab有沒有定時任務在消耗資源

iostat命令(iostat 2 5,重點看下%idel剩余使用率)查看IO性能
iotop命令是一個用來監視磁盤I/O使用狀況的top類工具,使用iotop命令可以很方便的查看每個進程是如何使用IO的.

mpstat命令(mpstat 2 5,重點看下%idel剩余使用率)查看CPU性能

vim使用技巧

刪除不包含任何空格的空行:g/^$/d 
刪除包含空格的空行:g/^\s*$/d  
刪除行首空格:%s/^\s*//g
刪除行尾空格:%s/\s*$//g
在所有"--"處進行分行:%s/--/\r/g
刪除只有空格的行: %s/^\s\+$//
刪除連續兩個或兩個以上空行,只留一個: %s/\n\{3,\}/\r\r/
清空一行的內容而不刪除一行: 0D    (或者0d$)
復制第6行到第9行之間的內容到第12行后面: 6,9 co 12
刪除每行第一個字符: %s/^.//g

刪除當前光標下的字符: x
刪除光標之后的單詞剩余部分: dw
刪除光標之后的該行剩余部分: d$       (刪除光標之前的該行剩余部分: d^)
刪除當前行: dd 
c功能和d相同,區別在於完成刪除操作后進入INSERT MODE(即進入編輯模式),比如cw刪除貫標之后的單詞剩余部分后進入編輯模式

==================vim快捷鍵==================
gg  光標跳到第一行
nG  光標跳到第n行。也可以在尾行模式下輸入:n  回車即可
G   光標跳到最后一行

o  光標跳到當前所在行的下一行
O  光標跳到當前所在行的上一行

yyp  復制當前所在行的內容到下一行
yyP  復制當前所在行的內容到上一行

dd    刪除當前所在行
ndd   刪除當前以下n行

shift+v  選中行區域
ctrl+v   選中列區域

命令行模式下按鍵^    跳到行首,相當於home鍵
命令行模式下按鍵$    跳到行尾,相當於end鍵

命令行模式下按鍵u    撤銷
命令行模式下按鍵r    恢復

尾行模式下輸入:%s/m/n/g   替換文件中所有行中的m字符為n字符
尾行模式下輸入:s/m/n/g    替換光標所在行的m字符為n字符

Linux終端窗口命令行里的快捷鍵

ctrl +a   跳到行首
ctrl +e   跳到行尾
ctrl +u   剪切光標之前的內容
ctrl +k   剪切光標之后的內容
ctrl +w   刪除光標之前的內容
ctrl +s   鎖住當前終端
ctrl +q   當當前終端解鎖

Linux運維經常使用技巧

1)使用pgrep快速查找一個PID
pgrep遍歷目前正在運行的進程然后列出符合查找規則的進程ID(PID)。
[root@redis-new01 ~]# pgrep ssh
這條命令會列出所有與ssh有關的進程。

2)執行上次執行過的命令
這個標題有些繞口,但是它是名副其實的。
[root@redis-new01 ~]# !!
這會執行你上一次在命令行中執行過的命令。

3)執行最近一次以xx開頭的命令(lxx)
如果你想要從命令行歷史中執行一個iptables開頭的命令時,你可以使用如下命令:
[root@redis-new01 ~]# !ipta
它會執行最近一次在命令行中執行且以字母ipta開頭的命令。

4)反復執行一個命令並在屏幕上輸出
watch會反復運行一個命令,並在屏幕上打印輸出。它可以讓你實時的觀察程序的輸出變化。默認情況下,程序每2秒運行一次。watch命令與tail命令很相似。
[root@redis-new01 ~]# watch -d ls -l
這條命令會監視當前目錄的所有文件,並且高亮文件所發生的改變。

5)在VI/VIM中快速保存
如果你很匆忙,你可以通過"shift + zz"快速地從vim的插入模式中退出。

6)可以使用如下命令返回你上一次所在的目錄:
[root@redis-new01 ~]# cd -

7)設置文件的時間戳。日期格式是(YYMMDDhhmm)
比如下面這條命令可以把aaa文件的時間戳設置成2017-01-01 12:00
[root@test3-237 ~][root@redis-new01 ~]# touch -c -t 1801011200 aaa
[root@test3-237 ~][root@redis-new01 ~]# ll aaa
-rw-r--r--. 1 root root 9 Jan  1  2018 aaa
[root@test3-237 ~][root@redis-new01 ~]# stat aaa
  File: `aaa'
  Size: 9           Blocks: 8          IO Block: 4096   regular file
Device: fc02h/64514d  Inode: 265217      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-01-01 12:00:00.000000000 +0800
Modify: 2018-01-01 12:00:00.000000000 +0800
Change: 2017-04-24 16:35:53.028995737 +0800

8)訪問上一個命令中的最后一個參數,使用Esc + .
[root@test3-237 ~][root@redis-new01 ~]# ls /usr/local/mysql/

比如執行了上面的命令,現在想切換到/usr/local/mysql目錄下,做法是:
先輸入cd,然后在后面依次按鍵Esc 加上 .號就會自動補出/usr/local/mysql(即上一個命令中的最后一個參數)

rar包解壓

[root@redis-new01 ~]# mkdir -p  /home/tools
[root@redis-new01 ~]# cd /home/tools
[root@redis-new01 ~]# wget http://www.rarlab.com/rar/rarlinux-3.8.0.tar.gz
[root@redis-new01 ~]# tar zxvf rarlinux-3.8.0.tar.gz
[root@redis-new01 ~]# cd rar
[root@redis-new01 rar]# make
[root@redis-new01 rar]# make install 

將/opt/www目錄壓縮為www.rar命令為:
[root@redis-new01 ~]# rar a www.rar /opt/www

將www.rar解壓命令(下面兩種方式)
1)rar x www.rar          //解壓成www目錄
2)unrar -e www.tar       //解壓出來的是www目錄下的文件,而不是直接的www目錄

=========================
1)報錯
bash: /usr/local/bin/rar: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
解決辦法:
[root@redis-new01 ~]# yum install glibc.i686

2)報錯
error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
解決辦法:
[root@redis-new01 ~]# yum install libstdc++.so.6

usemod針對系統用戶的修改命令

常用參數:
-a|--append     ##把用戶追加到某些組中,僅與-G選項一起使用 
-c|--comment    ##修改/etc/passwd文件第五段comment 
-d|--home       ##修改用戶的家目錄通常和-m選項一起使用 
-e|--expiredate ##指定用戶帳號禁用的日期,格式YY-MM-DD 
-f|--inactive   ##用戶密碼過期多少天后采用就禁用該帳號,0表示密碼已過期就禁用帳號,-1表示禁用此功能,默認值是-1 
-g|--gid        ##修改用戶的gid,改組一定存在
-G|--groups     ##把用戶追加到某些組中,僅與-a選項一起使用 
-l|--login      ##修改用戶的登錄名稱 
-L|--lock       ##鎖定用戶的密碼 
-m|--move-home  ##修改用戶的家目錄通常和-d選項一起使用 
-s|--shell      ##修改用戶的shell 
-u|--uid        ##修改用戶的uid,該uid必須唯一 
-U|--unlock     ##解鎖用戶的密碼

示例說明:
1)新建用戶test,密碼test,另外添加usertest組
[root@kevin-test ~]# useradd test 
[root@kevin-test ~]# echo "test" | passwd --stdin test 
[root@kevin-test ~]# groupadd usertest 

2)把test用戶加入usertest組
[root@kevin-test ~]# usermod -aG usertest test          ##多個組之間用空格隔開 
[root@kevin-test ~]# id test 
  uid=500(test) gid=500(test) groups=500(test),501(usertest) 

3)修改test用戶的家目錄
[root@kevin-test ~]# usermod -md /home/usertest 
[root@kevin-test ~]# ls /home 
usertest 

4)修改用戶名
[root@kevin-test ~]# usermod -l testnew(新用戶)  test(老用戶) 
[root@kevin-test ~]# id testnew 
uid=500(testnew) gid=500(test) groups=500(test),501(usertest) 

5)鎖定testnew的密碼
[root@kevin-test ~]# sed -n '$p' /etc/shadow 
testnew:$6$1PwPVBn5$o.MIEYONzURQPvn/YqSp69kt2CIASvXhOnjv/tZ5m4NN6bJyLjCG7S6vmji/PFDfbyITdm1WmtV45CfHV5vux/:15594:0:99999:7::: 

[root@kevin-test ~]# usermod -L testnew 
[root@kevin-test ~]# sed -n '$p' /etc/shadow 
testnew:!$6$1PwPVBn5$o.MIEYONzURQPvn/YqSp69kt2CIASvXhOnjv/tZ5m4NN6bJyLjCG7S6vmji/PFDfbyITdm1WmtV45CfHV5vux/:15594:0:99999:7::: 

6)解鎖testnew的密碼
[root@kevin-test ~]# usermod -U testnew 
[root@kevin-test ~]# sed -n '$p' /etc/shadow 
testnew:$6$1PwPVBn5$o.MIEYONzURQPvn/YqSp69kt2CIASvXhOnjv/tZ5m4NN6bJyLjCG7S6vmji/PFDfbyITdm1WmtV45CfHV5vux/:15594:0:99999:7::: 

7)修改用戶的shell
[root@kevin-test ~]# sed '$!d' /etc/passwd 
testnew:x:500:500::/home/usertest:/bin/bash 
[root@kevin-test ~]# usermod -s /bin/sh testnew 
[root@kevin-test ~]# sed -n '$p' /etc/passwd 
testnew:x:500:500::/home/usertest:/bin/sh 

也可以手動編輯 vi /etc/passwd 找到testnew編輯保存即可
[root@kevin-test ~]# vim /etc/password

8)修改用戶的UID
[root@kevin-test ~]# usermod -u 578 testnew (UID必須唯一) 
[root@kevin-test ~]# id testnew 
uid=578(testnew) gid=500(test) groups=500(test),501(usertest) 

9)修改用戶的GID
[root@kevin-test ~]# groupadd -g 578 test1 
[root@kevin-test ~]# usermod -g 578 testnew (578組一定要存在) 
[root@kevin-test ~]# id testnew 
uid=578(testnew) gid=578(test1) groups=578(test1),501(usertest) 

10)指定帳號過期日期
[root@kevin-test ~]# sed -n '$p' /etc/shadow 
testnew:$6$1PwPVBn5$o.MIEYONzURQPvn/YqSp69kt2CIASvXhOnjv/tZ5m4NN6bJyLjCG7S6vmji/PFDfbyITdm1WmtV45CfHV5vux/:15594:0:99999:7::: 
[root@kevin-test ~]# usermod -e 2012-09-11 testnew 
[root@kevin-test ~]# sed -n '$p' /etc/shadow 
testnew:$6$1PwPVBn5$o.MIEYONzURQPvn/YqSp69kt2CIASvXhOnjv/tZ5m4NN6bJyLjCG7S6vmji/PFDfbyITdm1WmtV45CfHV5vux/:15594:0:99999:7::15594: 

11)指定用戶帳號密碼過期多少天后,禁用該帳號
[root@kevin-test ~]# usermod -f 0 testnew 
[root@kevin-test ~]# sed -n '$p' /etc/shadow 
testnew:$6$1PwPVBn5$o.MIEYONzURQPvn/YqSp69kt2CIASvXhOnjv/tZ5m4NN6bJyLjCG7S6vmji/PFDfbyITdm1WmtV45CfHV5vux/:15594:0:99999:7:0:15594:

nmap滲透測試工具使用

查看192.168.10.0/24網段的機器啟用情況
[root@redis-new01 ~]#  nmap -sn 192.168.10.0/24    

=============================================================================
Nmap是一款網絡掃描和主機檢測的非常有用的工具。 Nmap是不局限於僅僅收集信息和枚舉,同時可以用來作為一個漏洞探測器或安全掃描器。
它可以適用於winodws,linux,mac等操作系統。Nmap是一款非常強大的實用工具,可用於:
- 檢測活在網絡上的主機(主機發現)
- 檢測主機上開放的端口(端口發現或枚舉)
- 檢測到相應的端口(服務發現)的軟件和版本
- 檢測操作系統,硬件地址,以及軟件版本
- 檢測脆弱性的漏洞(Nmap的腳本)
- Nmap是一個非常普遍的工具,它有命令行界面和圖形用戶界面。

Nmap使用不同的技術來執行掃描,包括:TCP的connect()掃描,TCP反向的ident掃描,FTP反彈掃描等。所有這些掃描的類型有自己的優點和缺點,
Nmap的使用取決於目標主機,因為有一個簡單的(基本)掃描和預先掃描之間的差異。我們需要使用一些先進的技術來繞過防火牆和入侵檢測/防御系統,
以獲得正確的結果。下面是一些基本的命令和它們的用法的例子:

掃描單一的一個主機,命令如下:
[root@redis-new01 ~]# nmap cnblogs.com
[root@redis-new01 ~]# nmap 192.168.1.2

掃描整個子網,命令如下:
[root@redis-new01 ~]# nmap 172.16.60.207/24

掃描多個目標,命令如下:
[root@redis-new01 ~]# nmap 192.168.1.2 192.168.1.5

掃描一個范圍內的目標,如下:
[root@redis-new01 ~]# nmap 172.16.60.207-100                              //掃描IP地址為172.16.60.207-172.16.60.20700內的所有主機

如果你有一個ip地址列表,將這個保存為一個txt文件,和namp在同一目錄下,掃描這個txt內的所有主機,命令如下:
[root@redis-new01 ~]# nmap -iL target.txt

如果你想看到你掃描的所有主機的列表,用以下命令:
[root@redis-new01 ~]# nmap -sL 172.16.60.207/24

掃描除過某一個ip外的所有子網主機,命令:
[root@redis-new01 ~]# nmap 172.16.60.207/24 -exclude 172.16.60.207

掃描除過某一個文件中的ip外的子網主機命令
[root@redis-new01 ~]# nmap 172.16.60.207/24 -exclude file xxx.txt  (xxx.txt中的文件將會從掃描的主機中排除)

掃描特定主機上的80,21,23端口,命令如下
[root@redis-new01 ~]#  nmap -p80,21,23 172.16.60.207
Starting Nmap 5.51 ( http://nmap.org ) at 2018-10-27 22:24 CST
Nmap scan report for 172.16.60.207
Host is up (0.00039s latency).
PORT   STATE  SERVICE
21/tcp open ftp
23/tcp open telnet
80/tcp open http
MAC Address: 00:50:56:88:52:B7 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 0.17 seconds

以上是Nmap的基礎知識,下面開始深入的探討一下Nmap的掃描技術.

======Tcp SYN Scan (sS)======
這是一個基本的掃描方式,它被稱為半開放掃描,因為這種技術使得Nmap不需要通過完整的握手,就能獲得遠程主機的信息。
Nmap發送SYN包到遠程主機,但是它不會產生任何會話.因此不會在目標主機上產生任何日志記錄,因為沒有形成會話。這個就是SYN掃描的優勢.

如果Nmap命令中沒有指出掃描類型,默認的就是Tcp SYN.但是它需要root/administrator權限.
[root@redis-new01 ~]# nmap -sS 172.16.60.207

======Tcp connect() scan(sT)======
如果不選擇SYN掃描,TCP connect()掃描就是默認的掃描模式.不同於Tcp SYN掃描,Tcp connect()掃描需要完成三次握手,並且要求調用系統
的connect().Tcp connect()掃描技術只適用於找出TCP和UDP端口.
[root@redis-new01 ~]# nmap -sT 172.16.60.207

======Udp scan(sU)======
顧名思義,這種掃描技術用來尋找目標主機打開的UDP端口.它不需要發送任何的SYN包,因為這種技術是針對UDP端口的。UDP掃描發送UDP
數據包到目標主機,並等待響應,如果返回ICMP不可達的錯誤消息,說明端口是關閉的,如果得到正確的適當的回應,說明端口是開放的.
[root@redis-new01 ~]# nmap -sU 172.16.60.207

======FIN scan (sF)======
有時候Tcp SYN掃描不是最佳的掃描模式,因為有防火牆的存在.目標主機有時候可能有IDS和IPS系統的存在,防火牆會阻止掉SYN數據包。
發送一個設置了FIN標志的數據包並不需要完成TCP的握手.
root@bt:~[root@redis-new01 ~]#  nmap -sF 192.168.1.8
Starting Nmap 5.51  at 2012-07-08 19:21 PKT
Nmap scan report for 192.168.1.8
Host is up (0.000026s latency).
Not shown: 999 closed ports
PORT STATE SERVICE
111/tcp open|filtered rpcbind

FIN掃描也不會在目標主機上創建日志(FIN掃描的優勢之一).個類型的掃描都是具有差異性的,FIN掃描發送的包只包含FIN標識,NULL掃描
不發送數據包上的任何字節,XMAS掃描發送FIN、PSH和URG標識的數據包.

======PING Scan (sP)======
PING掃描不同於其它的掃描方式,因為它只用於找出主機是否是存在在網絡中的.它不是用來發現是否開放端口的.PING掃描需要ROOT權限,
如果用戶沒有ROOT權限,PING掃描將會使用connect()調用.
[root@redis-new01 ~]# nmap -sP 172.16.60.207

======版本檢測(sV)======
版本檢測是用來掃描目標主機和端口上運行的軟件的版本.它不同於其它的掃描技術,它不是用來掃描目標主機上開放的端口,不過它需要從
開放的端口獲取信息來判斷軟件的版本.使用版本檢測掃描之前需要先用TCP SYN掃描開放了哪些端口.
[root@redis-new01 ~]# nmap -sV 172.16.60.207

======Idle scan (sL)======
Idle scan是一種先進的掃描技術,它不是用你真實的主機Ip發送數據包,而是使用另外一個目標網絡的主機發送數據包.
[root@redis-new01 ~]# nmap -sL 192.168.1.6 172.16.60.207

Idle scan是一種理想的匿名掃描技術,通過目標網絡中的192.168.1.6向主機172.16.60.207發送數據,來獲取172.16.60.207開放的端口

有需要其它的掃描技術,如 FTP bounce(FTP反彈), fragmentation scan(碎片掃描), IP protocol scan(IP協議掃描),
以上討論的是幾種最主要的掃描方式.

======Nmap的OS檢測(O)======
Nmap最重要的特點之一是能夠遠程檢測操作系統和軟件,Nmap的OS檢測技術在滲透測試中用來了解遠程主機的操作系統和軟件是非常有用的,
通過獲取的信息你可以知道已知的漏洞。Nmap有一個名為的nmap-OS-DB數據庫,該數據庫包含超過2600操作系統的信息。 Nmap把TCP和UDP數據包發送到目標機器上,然后檢查結果和數據庫對照。

上面的例子清楚地表明,Nmap的首次發現開放的端口,然后發送數據包發現遠程操作系統。操作系統檢測參數是O(大寫O)
[root@redis-new01 ~][root@redis-new01 ~]#  nmap -O 172.16.60.207

Nmap的操作系統指紋識別技術:
- 設備類型(路由器,工作組等)
- 運行(運行的操作系統)
- 操作系統的詳細信息(操作系統的名稱和版本)
- 網絡距離(目標和攻擊者之間的距離跳)

如果遠程主機有防火牆,IDS和IPS系統,你可以使用-PN命令來確保不ping遠程主機,因為有時候防火牆會組織掉ping請求.
-PN命令告訴Nmap不用ping遠程主機。

[root@redis-new01 ~]# nmap -O -PN 172.16.60.207/24
以上命令告訴發信主機遠程主機是存活在網絡上的,所以沒有必要發送ping請求,使用-PN參數可以繞過PING命令,但是不影響主機的系統的發現。
Nmap的操作系統檢測的基礎是有開放和關閉的端口,如果OS scan無法檢測到至少一個開放或者關閉的端口,會返回以下錯誤:
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port

OS Scan的結果是不可靠的,因為沒有發現至少一個開放或者關閉的端口.

這種情況是非常不理想的,應該是遠程主機做了針對操作系統檢測的防范。如果Nmap不能檢測到遠程操作系統類型,那么就沒有必要使用-osscan_limit檢測。

想好通過Nmap准確的檢測到遠程操作系統是比較困難的,需要使用到Nmap的猜測功能選項, –osscan-guess 猜測認為最接近目標的匹配操作系統類型。

[root@redis-new01 ~]# nmap -O –osscan-guess 172.16.60.207

命令行日常系快捷鍵(不分大小寫)

CTRL + A 移動光標到行首
CTRL + E 移動光標到行末
CTRL + U 剪切光標前的內容
CTRL + K 剪切光標至行末的內容
CTRL + Y 粘貼
CTRL + S 鎖住當前終端
CTRL + Q 解鎖
CRTL + T 將光標所在當前字符移到前一個字符的前面
CRTL + W 刪除光標前面的內容
Shift + Insert 向終端內粘貼文本
ESC + . 顯示上一條命令的最后一部分

暫停或掛起前台的命令,並在后台運行它(相當於nohup .... &)

當在linux終端里運行一個要執行很長時間的命令,為了讓其在后台運行(釋放當前終端),步驟如下:
CTRL + Z     將這個命令在前台掛起,會顯示一個序列號,比如1
bg 1            即bg 序列號
disown -a     將其放到后台運行。這樣即使退出ssh登陸后,命令仍會在目標機器上運行

設置系統環境變量

1)在終端命令行下設置,這是臨時設置。服務器重啟后就失效了。比如export PATH=$APTH:/usr/local/mysql/bin 
2) 在/etc/profile文件里設置,這是永久性設置。比如
[root@redis-new01 ~]# vim /etc/profile
.....
export PATH=$APTH:/usr/local/mysql/bin

[root@redis-new01 ~]# source /etc/profile

需要注意的是:
在/etc/profile里設置系統環境變量時,路徑末尾不能以"/"結尾,否則將導致整個PATH變量出錯。

alias設置別名:

在當前用戶家目錄的.bashrc文件中設置,如下設置:
[root@wangshibo ~]# cat /root/.bashrc
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias nginx='/opt/zwl/myscripts/nginx.sh'
alias phpd5329='/opt/zwl/myscripts/phpd5329.sh'
alias mysql='/Data/app/mysql5.6.25/bin/mysql'
alias grep='grep --color'

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

linux下刪除特殊字符命名文件(加轉義符號)

[root@cdn tmp]# touch \(22\)
[root@cdn tmp]# touch \1231
[root@cdn tmp]# touch \\1231
[root@cdn tmp]# touch \<22:23\>
[root@cdn tmp]# ll
-rw-r--r-- 1 root root 0 Nov 19 11:47 (22)
-rw-r--r-- 1 root root 0 Nov 19 11:48 1231
-rw-r--r-- 1 root root 0 Nov 19 11:49 \1231
-rw-r--r-- 1 root root 0 Nov 19 11:48 <22:23>
刪除的時候,也要加上轉義符號"/"
[root@cdn tmp]# rm -rf 1231
[root@cdn tmp]# rm -rf \\1231
[root@cdn tmp]# rm -rf \(22\)
[root@cdn tmp]# rm -rf \<22:23\>

echo命令中使用-e選項啟用'\'轉義,將'\n'解析成換行,如下:

[root@bastion-IDC ~]# echo -e "q11\n3452345\nHASHHDF\n數據庫\nuuu\n4444" >a.txt
[root@bastion-IDC ~]# cat a.txt
q11
3452345
HASHHDF
數據庫
uuu
4444

xargs命令:這個命令的使用率很高!

可參考:http://man.linuxde.net/xargs

xargs這個命令可以變多行為一行輸出
結合管道符|使用,表示將前面命令結果輸出

[root@slave-server ~]# rpm -qa|grep ssh
openssh-5.3p1-118.1.el6_8.x86_64
openssh-server-5.3p1-118.1.el6_8.x86_64
libssh2-1.4.2-2.el6_7.1.x86_64
openssh-clients-5.3p1-118.1.el6_8.x86_64
[root@slave-server ~]# rpm -qa|grep ssh|xargs
openssh-5.3p1-118.1.el6_8.x86_64 openssh-server-5.3p1-118.1.el6_8.x86_64 libssh2-1.4.2-2.el6_7.1.x86_64 openssh-clients-5.3p1-118.1.el6_8.x86_64

[root@slave-server ~]# cat test.file
dfs 123 45  56 
asdf ii  iij  jnh 
fg hy 7u 8i 9o 
0o o00 67y jhsdafhja asdfasdfasdfasdfasdfs
[root@slave-server ~]# cat test.file|xargs
dfs 123 45 56 asdf ii iij jnh fg hy 7u 8i 9o 0o o00 67y jhsdafhja asdfasdfasdfasdfasdfs

xargs 結合-n選項,表示以n個字符為一行行輸出:
[root@slave-server ~]# cat test.file |xargs -n2
dfs 123
45 56
asdf ii
iij jnh
fg hy
7u 8i
9o 0o
o00 67y
jhsdafhja asdfasdfasdfasdfasdfs
[root@slave-server ~]# cat test.file |xargs -n5
dfs 123 45 56 asdf
ii iij jnh fg hy
7u 8i 9o 0o o00
67y jhsdafhja asdfasdfasdfasdfasdfs

xargs結合-d選項表示自定義一個定界符:
[root@slave-server ~]# echo "nameXnameXnameXname" | xargs -dX
name name name name
[root@slave-server ~]# echo "nameXnameXnameXname" | xargs -dX -n1
name
name
name
name

[root@slave-server ~]# echo "nameXnameXnameXname" | xargs -dX -n2
name name
name name

[root@slave-server ~]# echo "nameXnameXnameXname" | xargs -dX -n3
name name name
name

xargs結合選項-I,使用-I指定一個替換字符串{},這個字符串在xargs擴展時會被替換掉,當-I與xargs結合使用,每一個參數命令都會被執行一次:
[root@slave-server ~]# cat arg.txt 

aaa
bbb
ccc
[root@slave-server ~]# cat arg.txt |xargs 
aaa bbb ccc
[root@slave-server ~]# cat arg.txt |xargs -I {} echo wang {} -l
wang aaa -l
wang bbb -l
wang ccc -l
[root@slave-server ~]# cat arg.txt |xargs -I {} echo wang {} shibo
wang aaa shibo
wang bbb shibo
wang ccc shibo

停止php進程
[root@slave-server ~]# ps -ef|grep php|grep -v grep|awk -F" " '{print $2}'|xargs kill -9

[root@slave-server opt]# ll
total 12
-rw-r--r--. 1 root root  0 Jan  6 07:09 aa
-rw-r--r--. 1 root root  0 Jan  6 07:09 bb
-rw-r--r--. 1 root root  0 Jan  6 07:09 dd
-rw-r--r--. 1 root root 24 Jan  6 06:23 haha.txt
-rw-r--r--. 1 root root 17 Jan  6 06:29 hehe.txt
-rw-r--r--. 1 root root  6 Jan  6 06:32 test.sh
-rw-r--r--. 1 root root  0 Jan  6 07:09 vv
[root@slave-server opt]# ls -l|awk -F" " '{print $9}'|xargs 
aa bb dd haha.txt hehe.txt test.sh vv

系統常規運維命令

cat /etc/issue 查看系統版本
cat /etc/redhat-release 查看系統版本
getconf LONG_BIT 查看系統的位數(32bit or 64bit)
arch 顯示機器的處理器架構
uname -m 顯示機器的處理器架構 
uname -r 顯示正在使用的內核版本 
dmidecode -q 顯示硬件系統部件 - (SMBIOS / DMI) 
hdparm -i /dev/hda 羅列一個磁盤的架構特性 
hdparm -tT /dev/sda 在磁盤上執行測試性讀取操作 
cat /proc/cpuinfo 顯示CPU info的信息 
cat /proc/interrupts 顯示中斷 
cat /proc/meminfo 校驗內存使用 
cat /proc/swaps 顯示哪些swap被使用 
cat /proc/version 顯示內核的版本 
cat /proc/net/dev 顯示網絡適配器及統計 
cat /proc/mounts 顯示已加載的文件系統 
lspci -tv 羅列 PCI 設備 
lsusb -tv 顯示 USB 設備

cal 2007 顯示2007年的日歷表 
date 041217002007.00 設置日期和時間 - 月日時分年.秒 
clock -w 將時間修改保存到 BIOS

echo 1 >/proc/sys/vm/drop_caches 手動釋放緩存
echo 1 >/proc/sys/net/ipv4/ip_forward 打開ip路由轉發功能
echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all 禁止ping(禁止別人ping本機ip)

ntpdate us.pool.ntp.org     在線更新系統時間

系統最小化安裝,沒裝開發環境,需要yum groupinstall -y "development tools"安裝

date命令總結

date命令是顯示或設置系統時間與日期。 很多shell腳本里面需要打印不同格式的時間或日期,以及要根據時間和日期執行操作。
延時通常用於腳本執行過程中提供一段等待的時間。日期可以以多種格式去打印,也可以使用命令設置固定的格式。在類UNIX系統中,
日期被存儲為一個整數,其大小為自世界標准時間(UTC)1970年1月1日0時0分0秒起流逝的秒數。

選項:
-d<字符串>:顯示字符串所指的日期與時間。字符串前后必須加上雙引號; 
-s<字符串>:根據字符串來設置日期與時間。字符串前后必須加上雙引號; 
-u:顯示GMT; 
--help:在線幫助; 
--version:顯示版本信息。

參數:
<+時間日期格式>:指定顯示時使用的日期時間格式。

日期格式字符串列表:
%a    當前locale 的星期名縮寫(例如: 日,代表星期日),星期的簡稱(Sun~Sat) 
%A    當前locale 的星期名全稱 (如:星期日),星期的全稱(Sunday~Saturday) 
%b    當前locale 的月名縮寫 (如:一,代表一月)
%B    當前locale 的月名全稱 (如:一月),月的全稱(January~December) 
%c    當前locale 的日期和時間 (如:2005年3月3日 星期四 23:05:25),日期和時間(Tue Nov 20 14:12:58 2012) 
%C    世紀;比如 %Y,通常為省略當前年份的后兩位數字(例如:20)
%d    按月計的日期(例如:01),一個月的第幾天(01~31) 
%D    按月計的日期;等於%m/%d/%y;日期(mm/dd/yy) ,相當於%x
%e    按月計的日期,添加空格,等於%_d
%F    完整日期格式,等價於 %Y-%m-%d
%g    ISO-8601 格式年份的最后兩位 (參見%G)
%G    ISO-8601 格式年份 (參見%V),一般只和 %V 結合使用
%h    等於%b,月的簡稱(Jan~Dec) 
%H    小時,24小時制(00~23)
%I    小時,12小時制(01~12)
%c    按年計的日期(001-366)
%k    小時,24小時制(0~23)
%l    小時,12小時制(1~12) 
%m    月份(01~12) 
%M    分鍾(00~59) 
%j    一年的第幾天(001~366)
%n    換行
%N    納秒(000000000-999999999)
%p    顯示出AM或PM,即顯示當前locale下的"上午"或者"下午",未知時輸出為空
%P    與%p 類似,但是輸出小寫字母
%r    當前locale下的12 小時時鍾時間 (hh:mm:ss %p)(如:11:11:04 下午)
%R    24 小時時間的時和分,等價於 %H:%M
%s    自UTC 時間 1970-01-01 00:00:00 以來所經過的秒數,即從1970年1月1日00:00:00到目前經歷的秒數 
%S    顯示秒(00~59)
%t    輸出制表符 Tab
%T    顯示時間,24小時制(hh:mm:ss),等於%H:%M:%S
%u    星期,1 代表星期一
%U    一年中的第幾周,以周日為每星期第一天(00-53)
%V    ISO-8601 格式規范下的一年中第幾周,以周一為每星期第一天(01-53)
%w    一星期中的第幾日(0-6),0 代表周一,一個星期的第幾天(0代表星期天)
%W    一年中的第幾周,以周一為每星期第一天(00-53),一年的第幾個星期(00~53,星期一為第一天)
%x    當前locale 下的日期描述 (如:12/31/99)
%X    顯示時間的格式(%H:%M:%S),當前locale 下的時間描述 (如:23:13:48)   
%Z    顯示時區,日期域(CST)
%y    年份最后兩位數位 (00-99),(2016則是16)
%Y    年份
%z +hhmm              數字時區(例如,-0400)
%:z +hh:mm            數字時區(例如,-04:00)
%::z +hh:mm:ss        數字時區(例如,-04:00:00)
%:::z                 數字時區帶有必要的精度 (例如,-04,+05:30)
%Z                    按字母表排序的時區縮寫 (例如,EDT)


默認情況下,日期的數字區域以0 填充。
以下可選標記可以跟在"%"后:
-       (連字符)不填充該域
_      (下划線)以空格填充
0     (數字0)以0 填充
^     如果可能,使用大寫字母
#     如果可能,使用相反的大小寫

在任何標記之后還允許一個可選的域寬度指定,它是一個十進制數字。
作為一個可選的修飾聲明,它可以是E,在可能的情況下使用本地環境關聯的
表示方式;或者是O,在可能的情況下使用本地環境關聯的數字符號。

時間輸出
date是Linux系統里自帶的一個系統命令,用來顯示當前的系統時間,不過默認顯示的結果里包括很多信息,特別是做為文件名輸出時,
不是很方便
好在date命令里包含格式化輸出的選項

實例操作說明:
加減操作: 
date +%Y%m%d //顯示前天年月日 
date -d "+1 day" +%Y%m%d //顯示前一天的日期 
date -d "-1 day" +%Y%m%d //顯示后一天的日期 
date -d "-1 month" +%Y%m%d //顯示上一月的日期 
date -d "+1 month" +%Y%m%d //顯示下一月的日期 
date -d "-1 year" +%Y%m%d //顯示前一年的日期 
date -d "+1 year" +%Y%m%d //顯示下一年的日期

設定時間: 
date -s //設置當前時間,只有root權限才能設置,其他只能查看 
date -s 20120523 //設置成20120523,這樣會把具體時間設置成空00:00:00 
date -s 01:01:01 //設置具體時間,不會對日期做更改 
date -s "01:01:01 2012-05-23" //這樣可以設置全部時間 
date -s "01:01:01 20120523" //這樣可以設置全部時間 
date -s "2012-05-23 01:01:01" //這樣可以設置全部時間 
date -s "20120523 01:01:01" //這樣可以設置全部時間

有時需要檢查一組命令花費的時間,比如檢查“ntpdate us.pool.ntp.org”和“yum list”等命令執行所花費的時間:
[root@bastion-IDC ~]# cat time.sh
#!/bin/bash 
start=$(date +%s) 
ntpdate us.pool.ntp.org &> /dev/null 
yum list > /dev/null 2>&1
end=$(date +%s) 
difference=$(( end - start )) 
echo $difference seconds

[root@bastion-IDC ~]# sh time.sh
7 seconds

輸出當前日期:
[root@bastion-IDC ~]# date +"%Y-%m-%d" 
2009-12-07

輸出昨天日期: 
[root@bastion-IDC ~]# date -d "1 day ago" +"%Y-%m-%d" 
2012-11-19 

2秒后輸出: 
[root@bastion-IDC ~]# date -d "2 second" +"%Y-%m-%d %H:%M.%S" 
2012-11-20 14:21.31 

傳說中的 1234567890 秒: 
[root@bastion-IDC ~]# date -d "1970-01-01 1234567890 seconds" +"%Y-%m-%d %H:%m:%S" 
2009-02-13 23:02:30 

普通轉格式: 
[root@bastion-IDC ~]# date -d "2009-12-12" +"%Y/%m/%d %H:%M.%S" 
2009/12/12 00:00.00 

apache格式轉換: 
[root@bastion-IDC ~]# date -d "Dec 5, 2009 12:00:37 AM" +"%Y-%m-%d %H:%M.%S" 
2009-12-05 00:00.37 

格式轉換后時間游走: 
[root@bastion-IDC ~]# date -d "Dec 5, 2009 12:00:37 AM 2 year ago" +"%Y-%m-%d %H:%M.%S" 
2007-12-05 00:00.37

[root@bastion-IDC ~]# date "+%Y-%m-%d"  
2013-02-19  
[root@bastion-IDC ~]# date "+%H:%M:%S"  
13:13:59  
[root@bastion-IDC ~]# date "+%Y-%m-%d %H:%M:%S"  
2013-02-19 13:14:19  
[root@bastion-IDC ~]# date "+%Y_%m_%d %H:%M:%S"    
2013_02_19 13:14:58  
[root@bastion-IDC ~]# date -d today   
Tue Feb 19 13:10:38 CST 2013  
[root@bastion-IDC ~]# date -d now  
Tue Feb 19 13:10:43 CST 2013  
[root@bastion-IDC ~]# date -d tomorrow  
Wed Feb 20 13:11:06 CST 2013  
[root@bastion-IDC ~]# date -d yesterday  
Mon Feb 18 13:11:58 CST 2013 
[root@bastion-IDC ~]# date 
Thu Nov 24 15:55:21 CST 2016
[root@bastion-IDC ~]# date +%A
Thursday
[root@bastion-IDC ~]# date +%a
Thu
[root@bastion-IDC ~]# date +%b
Nov
[root@bastion-IDC ~]# date +%B
November
[root@bastion-IDC ~]# date +%y
16
[root@bastion-IDC ~]# date +%w
4
[root@bastion-IDC ~]# date +%W
47
[root@bastion-IDC ~]# date +%j
329

關機 (系統的關機、重啟以及登出 )

shutdown -h now 關閉系統
init 0 關閉系統
init 6 重啟系統
telinit 0 關閉系統
shutdown -h hours:minutes & 按預定時間關閉系統 
shutdown -c 取消按預定時間關閉系統 
shutdown -r now 重啟
poweroff 關機
reboot 重啟
logout 注銷

文件和目錄

cd /home 進入 '/ home' 目錄' 
cd .. 返回上一級目錄 
cd ../.. 返回上兩級目錄 
cd 進入個人的主目錄 
cd ~user1 進入個人的主目錄 
cd - 返回上次所在的目錄 
pwd 顯示工作路徑 
ls 查看目錄中的文件 
ls -F 查看目錄中的文件 
ls -l 顯示文件和目錄的詳細資料 
ls -a 顯示隱藏文件 
ls *[0-9]* 顯示包含數字的文件名和目錄名 
tree 顯示文件和目錄由根目錄開始的樹形結構(1) 
lstree 顯示文件和目錄由根目錄開始的樹形結構(2) 
mkdir dir1 創建一個叫做 'dir1' 的目錄' 
mkdir dir1 dir2 同時創建兩個目錄 
mkdir -p /tmp/dir1/dir2 創建一個目錄樹 
rm -f file1 刪除一個叫做 'file1' 的文件' 
rmdir dir1 刪除一個叫做 'dir1' 的目錄' 
rm -rf dir1 刪除一個叫做 'dir1' 的目錄並同時刪除其內容 
rm -rf dir1 dir2 同時刪除兩個目錄及它們的內容 
mv dir1 new_dir 重命名/移動 一個目錄 
cp file1 file2 復制一個文件 
cp dir/* . 復制一個目錄下的所有文件到當前工作目錄 
cp -a /tmp/dir1 . 復制一個目錄到當前工作目錄 
cp -a dir1 dir2 復制一個目錄 
ln -s file1 lnk1 創建一個指向文件或目錄的軟鏈接 
ln file1 lnk1 創建一個指向文件或目錄的物理鏈接 
touch -t 0712250000 file1 修改一個文件或目錄的時間戳 - (YYMMDDhhmm) 
iconv -l 列出已知的編碼 

如果一個文件由另一個軟鏈接文件而來,則再將這個文件進行硬鏈接,則硬鏈接之后的文件還是軟連接文件.

[root@bz4citestap1014 test]# touch a
[root@bz4citestap1014 test]# ln -s a a1
[root@bz4citestap1014 test]# ll
total 0
-rw-r--r-- 1 root root 0 Jun  5 15:01 a
lrwxrwxrwx 1 root root 1 Jun  5 15:01 a1 -> a
[root@bz4citestap1014 test]# ln a1 a2
[root@bz4citestap1014 test]# ll
total 0
-rw-r--r-- 1 root root 0 Jun  5 15:01 a
lrwxrwxrwx 2 root root 1 Jun  5 15:01 a1 -> a
lrwxrwxrwx 2 root root 1 Jun  5 15:01 a2 -> a

由於源文件a1本身就是一個軟鏈接文件,所以由它硬鏈接之后的文件a2還是軟鏈接文件

[root@bz4citestap1014 test]# rm -rf a2
[root@bz4citestap1014 test]# ll
total 0
-rw-r--r-- 1 root root 0 Jun  5 15:01 a
lrwxrwxrwx 1 root root 1 Jun  5 15:01 a1 -> a
[root@bz4citestap1014 test]# ln a a2
[root@bz4citestap1014 test]# ll
total 0
-rw-r--r-- 2 root root 0 Jun  5 15:01 a
lrwxrwxrwx 1 root root 1 Jun  5 15:01 a1 -> a
-rw-r--r-- 2 root root 0 Jun  5 15:01 a2

由於源文件a是實文件,則它硬鏈接之后的文件也是實文件,兩者內容雙向實時同步。
刪除a文件,a1文件失效,a2文件不會失效。

再看下面例子
[root@bz4citestap1014 test]# echo "123456" > a
[root@bz4citestap1014 test]# ln a a1
[root@bz4citestap1014 test]# ll
total 8
-rw-r--r-- 2 root root 7 Jun  5 15:04 a
-rw-r--r-- 2 root root 7 Jun  5 15:04 a1
[root@bz4citestap1014 test]# cat a 
123456
[root@bz4citestap1014 test]# cat a1
123456

[root@bz4citestap1014 test]# cp a a.bak
[root@bz4citestap1014 test]# echo "abc" >> a
[root@bz4citestap1014 test]# cat a1
123456
abc
[root@bz4citestap1014 test]# cat a.bak
123456

[root@bz4citestap1014 test]# mv a a.bak2
[root@bz4citestap1014 test]# echo "bbbb" >> a.bak2
[root@bz4citestap1014 test]# cat a1
123456
abc
bbbb

就是說:
當源文件cp拷貝到另一個文件時,鏈接文件跟源文件內容保持一致(跟源文件的備份文件不會保持一致)
當源文件mv改為另一個文件時,則鏈接文件跟源文件mv之后的文件內容保持一致!
這個在對日志文件做鏈接的場景中需要考慮這個情況(考慮日志輪轉切割情況下的鏈接文件內容的一致性問題)

文件搜索

find / -name file1 從 '/' 開始進入根文件系統搜索文件和目錄 
find / -user user1 搜索屬於用戶 'user1' 的文件和目錄 
find /home/user1 -name \*.bin 在目錄 '/ home/user1' 中搜索帶有'.bin' 結尾的文件 
find /usr/bin -type f -atime +100 搜索在過去100天內未被使用過的執行文件 
find /usr/bin -type f -mtime -10 搜索在10天內被創建或者修改過的文件 
find / -name \*.rpm -exec chmod 755 '{}' \; 搜索以 '.rpm' 結尾的文件並定義其權限 
find / -xdev -name \*.rpm 搜索以 '.rpm' 結尾的文件,忽略光驅、捷盤等可移動設備 
locate \*.ps 尋找以 '.ps' 結尾的文件 - 先運行 'updatedb' 命令 
whereis halt 顯示一個二進制文件、源碼或man的位置 
which halt 顯示一個二進制文件或可執行文件的完整路徑

find命令在日常運維工作中使用率極高!下面重點總結下find命令的使用

find的使用格式如下:
$ find <指定目錄> <指定條件> <指定動作>
- <指定目錄>: 所要搜索的目錄及其所有子目錄。默認為當前目錄。
- <指定條件>: 所要搜索的文件的特征。
- <指定動作>: 對搜索結果進行特定的處理。
如果什么參數也不加,find默認搜索當前目錄及其子目錄,並且不過濾任何結果(也就是返回所有文件),將它們全都顯示在屏幕上。

find命令用於查找文件和目錄,任何位於參數之前的字符串都將被視為欲查找的目錄。
find 可以指定查找條件如名稱,類型,時間,文件大小,權限和所有者查找,針對多個條件進行與或非的邏輯運算。我們可以控制find的查找的行為,
還可以和其他命令組合使用。
find 
find .
find . -print
三者等效, 查找當前目錄下所有的文件和目錄(遞歸子目錄),以每行一個文件或者目錄的形式列舉出,不包含隱藏文件
find lib opt bin
同上,查找指定的多個目錄(lib/opt/bin)

一、指定查找條件
1) 按名稱查找
find . -name readme.txt
查找當前目錄下(遞歸子目錄)的所有名為readme.txt的文件

find . -name \*.txt
find . -name "*.txt"
查找當前目錄下(遞歸子目錄)的所有名稱以.txt結尾的文件,注意*號的寫法,需要前面加\或者放到雙引號中

find . -iname \*.txt
默認find是區分大小寫的,如果不想區分大小寫,請使用-iname替代-name,如上則"abc.TXT"將被查找到

2) 按類型查找
find . -type d 
查找當前目錄下(遞歸子目錄)的所有目錄

find . -type f
查找當前目錄下(遞歸子目錄)的所有文件

find . -type l
查找當前目錄下(遞歸子目錄)的所有符號鏈接

3) 按時間查找
=====以小時為單位的時間=====
find 命令三個選項用於按照時間查找,單位都是小時:
mtime — 文件內容上次修改時間
atime — 文件被讀取或訪問的時間
ctime — 文件狀態變化時間
這三個選項都需要配置一個n值使用,可以是-n / n / +n:
-n 小於 n
n 正好與 n 相等
+n 大於 n

find . -mtime -1
查找當前目錄下(遞歸子目錄)的所有1小時內修改的文件和目錄

find . -mtime +1
查找當前目錄下(遞歸子目錄)的所有修改時間超過1小時的文件和目錄

find . -mtime 1
查找當前目錄下(遞歸子目錄)的所有恰好在1小時前修改的文件和目錄

=====以分鍾為單位的時間=====
用法和*time類似,mmin、amin和cmin 的不同在於單位時間是分鍾,用於查找在不到1小時的時間內變化了的文件和目錄

find . -mmin -10
查找當前目錄下(遞歸子目錄)的所有10分鍾內修改的文件和目錄

find . -mmin +20
查找當前目錄下(遞歸子目錄)的所有20分鍾外1小時內修改的文件和目錄

=====與特定的文件比較=====
-newer,-anewer和-cnewer選項用於查找與特定的文件比較的已修改或訪問過的文件,類似mtime,atime和ctime
-newer 指內容最近被修改的文件
-anewer 指最近被讀取過的文件
-cnewer 指狀態最近發生變化的文件

find . -newer a.txt
查找當前目錄下(遞歸子目錄)的所有修改時間在a.txt之后(所以文件更新)的文件和目錄

=====按文件大小查找=====
1. -size 選項用於查找滿足指定的大小條件的文件(注意不查找目錄), +表示大於, -表示小於, 沒有+1表示正好等於。
文件大小的單位可以是字節(用c表示), kb(用k表示)。

find . -size -100c
查找當前目錄下(遞歸子目錄)的所有文件大小小於100字節的文件

find . -size +100k
查找當前目錄下(遞歸子目錄)的所有文件大小大於100k的文件

find . -size 0
查找當前目錄下(遞歸子目錄)的所有文件大小為0的文件

2. -empty 查找空文件和空文件夾, 和-size 0不同的在於-size 0 只查找空文件,或者說-empty -type f 等同於-size 0 :

find . -empty
查找當前目錄下(遞歸子目錄)的所有文件大小為0的文件和空文件夾

find . -empty -type f 
查找當前目錄下(遞歸子目錄)的所有文件大小為0的文件

find . -empty -type d
查找當前目錄下(遞歸子目錄)的所有空目錄

5) 按權限和所有者查找

find . -perm 777
查找當前目錄下(遞歸子目錄)的所有權限為777的文件和目錄

find . -perm -u=rwx
查找當前目錄下(遞歸子目錄)的所有user權限為rwx的文件和目錄

find . -perm -ug=x
查找當前目錄下(遞歸子目錄)的所有user和group權限為x的文件和目錄

find . -user sky
查找當前目錄下(遞歸子目錄)的所有user為sky的文件和目錄

find . -group users
查找當前目錄下(遞歸子目錄)的所有group為users的文件和目錄

二、查找條件的邏輯運算
1. 邏輯與
find . -name "*.java" -size -mmin -10
find . -name "*.java" -a -size -mmin -10
查找當前目錄下(遞歸子目錄)的所有名為*.java並且修改時間在10分鍾之內的文件,-a是默認選項

2. 邏輯或
find . -name "*.class" -o -name "*.jar"
查找當前目錄下(遞歸子目錄)的所有名為*.class或者*.jar的文件和目錄

3. 邏輯非
find . ! -user sky
查找當前目錄下(遞歸子目錄)的所有user不是sky的文件和目錄

三、控制查找的行為
find . -maxdepth 3 -name "*.txt"
查找當前目錄下(遞歸子目錄)的所有名為*.txt的文件,目錄深度不超過3層

find . -maxdepth 1 -name "*.txt"
查找當前目錄下(不遞歸子目錄,因為maxdepth為1)的所有名為*.txt的文件

find . -mindepth 3 -name "*.txt"
查找當前目錄下(遞歸子目錄)的所有名為*.txt的文件,目錄深度不低於3層

find . -mindepth 1 -name "*.txt"
查找當前目錄下的子目錄中(遞歸子目錄)的所有名為*.txt的文件,不包含當前目錄

find . -depth -name "*.txt"
查找當前目錄下(遞歸子目錄)的所有名為*.txt的文件,每個目錄都是先在目錄中進行查找,然后才繼續查找其子目錄

四、 find和其他命令的組合
find . -name "*.jar" -exec ls -l {} \;
find . -name "*.jar" -ls
查找當前目錄下(遞歸子目錄)的所有*.jar文件並使用ls -l列出詳細信息

find . -name "*.java" -exec grep -H -m 1 HashMap {} \;
查找當前目錄下(遞歸子目錄)的所有的含有"HashMap"字樣的*.java文件
(grep -H -m 1的意思是打印文件名,而且如果文件中有一次匹配就退出,避免多次匹配時為這一個文件打印多行)

find . -name "*.sh" -exec mv {} backup \;
查找當前目錄下(遞歸子目錄)的所有的*.sh文件並移動到backup目錄中、、、、

========================================
例如經常使用的一個命令場景:
統計代碼行數:
find ./ -name "*.[ch]" -o -name "*.cpp" | xargs wc -l
-o:(or)表示兩個表達式或的關系。
-a:(and)表示和的關系
xargs將文本內容拆成后面命令的參數。

=======================================
以下列出一些find日常使用的命令場景:
1.當前目錄下查找文件
[root@linuxidc.com ~]# find . -name test.txt 
./findtest/test.txt

2.指定目錄下查找
[root@linuxidc.com ~]# find /root/ -name test.txt
/root/findtest/test.txt

3.忽略大小寫查找
[root@linuxidc.com ~]# find /root -iname test.txt
/root/findtest/test.txt
/root/findtest/TEST.txt

4.查找目錄
[root@linuxidc.com ~]# find / -type d -name test
/usr/lib64/python2.7/unittest/test
/usr/lib64/python2.7/test
/usr/src/kernels/3.10.0-229.14.1.el7.x86_64/include/config/test
/usr/src/kernels/3.10.0-229.14.1.el7.x86_64/lib/raid6/test

5.按名稱查找php文件
[root@linuxidc.com zabbix]# find . -type f -name events.php 
./events.php

6.在目錄中查找所有的php文件
[root@linuxidc.com zabbix]# find . -type f -name "*.php"
./graphs.php
./tr_logform.php
./authentication.php
./popup_httpstep.php
./image.php
..........

7.查找文件權限是777的
[root@linuxidc.com ~]# find . -type f -perm 0777 -print
./findtest/test.txt

8.查找文件權限不是777的
[root@linuxidc.com ~]# find . -type f ! -perm 0777 -print

9.查找644權限的SGID文件
[root@linuxidc.com ~]# find / -perm 2644

10.查找權限為551的粘着位文件
[root@linuxidc.com ~]# find / -perm 1551

11.查找所有SUID文件
root@linuxidc.com ~]# find / -perm /u=s

12.查找所有SGID文件
[root@linuxidc.com ~]# find / -perm /g+s

13.查找所有只讀文件
[root@linuxidc.com ~]# find / -perm /u=r

14.查找所有可執行文件
[root@linuxidc.com ~]# find / -perm /a=x

15.查找所有777文件,並改為644
反斜杠用來告訴find何時命令結束
[root@linuxidc.com ~]# find / -type f -perm 0777 -print -exec chmod 644 {} \;

16.查找所有777的目錄,並改為755
[root@linuxidc.com ~]# find / -type d -perm 777 -print -exec chmod 755 {} \;

17.查找並刪除某個文件
[root@linuxidc.com ~]# find . -type f -name "test.txt" -exec rm -f {} \;

18.查找並刪除多個文件
[root@linuxidc.com ~]# find . -type f -name "*.txt" -exec rm -f {} \;

19.查找所有的空文件
[root@linuxidc.com ~]# find /tmp -type f -empty

20.查找所有空目錄
[root@linuxidc.com ~]# find /tmp -type d -empty

21.查找所有隱藏文件
[root@linuxidc.com ~]# find /tmp -type f -name ".*"

22.根據用戶查找某個文件
[root@linuxidc.com ~]# find / -user root -name test.txt

23.根據用戶查找所有的文件
在/home下屬於某個用戶的所有文件
[root@linuxidc.com ~]# find /home -user zabbix
/home/zabbix
/home/zabbix/.bash_history
/home/zabbix/.config
/home/zabbix/.config/abrt
/home/zabbix/mysql-community-release-el7-5.noarch.rpm
/home/zabbix/.lesshst
/home/zabbix/.cache
/home/zabbix/.cache/abrt
/home/zabbix/.cache/abrt/lastnotification
/home/zabbix/.bash_logout
/home/zabbix/.viminfo
/home/zabbix/.mysql_history
/home/zabbix/.bashrc
/home/zabbix/.bash_profile

24./home目錄下查找某個組的所有文件
[root@linuxidc.com ~]# find /home -group developer

25./home目錄下忽略大小寫查找用戶zabbix的所有文件
[root@linuxidc.com ~]# find /home -user zabbix -iname "*.txt"

26.查找50天之內修改過的文件
[root@linuxidc.com ~]# find / -mtime 50

27.查找50天之內被存取過的文件
[root@linuxidc.com ~]# find / -atime 50

28.查找50-100天之內修改過的文件
[root@linuxidc.com ~]# find / -atime +50 -mtime -100

29.查找1個小時之內有變化的文件
[root@linuxidc.com ~]# find / -cmin -60

30.查找1個小時之內修改過的文件
[root@linuxidc.com ~]# find / -mmin -60

31.查找1個小時之內被存取過的文件
[root@linuxidc.com ~]# find / -amin -60

32.查找所有的50M大小的文件
[root@linuxidc.com ~]# find / -size 50M

33.查找50-100M之間的文件
[root@linuxidc.com ~]# find / -size +50M -size -100M

34.查找並刪除100M大小的文件
[root@linuxidc.com ~]# find / -size +100M -exec rm -rf {} \;

35.查找並刪除指定類型,指定大小的文件
[root@linuxidc.com ~]# find / -type f -name *.mp3 -size +10M -exec rm {} \;

掛載一個文件系統

mount /dev/hda2 /mnt/hda2    掛載一個叫做hda2的盤 - 確定目錄 '/ mnt/hda2' 已經存在 
umount /dev/hda2    卸載一個叫做hda2的盤 - 先從掛載點 '/ mnt/hda2' 退出 
fuser -km /mnt/hda2    當設備繁忙時強制卸載 
umount -n /mnt/hda2    運行卸載操作而不寫入 /etc/mtab 文件- 當文件為只讀或當磁盤寫滿時非常有用 
mount /dev/fd0 /mnt/floppy    掛載一個軟盤 
mount /dev/cdrom /mnt/cdrom    掛載一個cdrom或dvdrom 
mount /dev/hdc /mnt/cdrecorder    掛載一個cdrw或dvdrom 
mount /dev/hdb /mnt/cdrecorder     掛載一個cdrw或dvdrom 
mount -o loop file.iso /mnt/cdrom     掛載一個文件或ISO鏡像文件 
mount -t vfat /dev/hda5 /mnt/hda5    掛載一個Windows FAT32文件系統 
mount /dev/sda1 /mnt/usbdisk      掛載一個usb 捷盤或閃存設備 
mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share     掛載一個windows網絡共享

磁盤空間

df -h    顯示已經掛載的分區列表 
ls -lSr |more    以尺寸大小排列文件和目錄 
du -sh dir1     估算目錄 'dir1' 已經使用的磁盤空間' 
du -sk * | sort -rn     以容量大小為依據依次顯示文件和目錄的大小 
rpm -q -a --qf '%10{SIZE}t%{NAME}n' | sort -k1,1n     以大小為依據依次顯示已安裝的rpm包所使用的空間 (fedora, redhat類系統) 
dpkg-query -W -f='${Installed-Size;10}t${Package}n' | sort -k1,1n     以大小為依據顯示已安裝的deb包所使用的空間 (ubuntu, debian類系統)

用戶和群組

groupadd group_name    創建一個新用戶組 
groupdel group_name      刪除一個用戶組 
groupmod -n new_group_name old_group_name     重命名一個用戶組 
useradd -c "Name Surname " -g admin -d /home/user1 -s /bin/bash user1     創建一個屬於 "admin" 用戶組的用戶 
useradd user1     創建一個新用戶 
userdel -r user1     刪除一個用戶 ( '-r' 排除主目錄) 
usermod -c "User FTP" -g system -d /ftp/user1 -s /bin/nologin user1      修改用戶屬性 
passwd      修改口令 
passwd user1    修改一個用戶的口令 (只允許root執行) 
chage -E 2005-12-31 user1     設置用戶口令的失效期限 
pwck     檢查 '/etc/passwd' 的文件格式和語法修正以及存在的用戶 
grpck      檢查 '/etc/passwd' 的文件格式和語法修正以及存在的群組 
newgrp group_name     登陸進一個新的群組以改變新創建文件的預設群組

文件的權限 - 使用 "+" 設置權限,使用 "-" 用於取消

ls -lh 顯示權限 
ls /tmp | pr -T5 -W$COLUMNS 將終端划分成5欄顯示 
chmod ugo+rwx directory1 設置目錄的所有人(u)、群組(g)以及其他人(o)以讀(r )、寫(w)和執行(x)的權限 
chmod go-rwx directory1 刪除群組(g)與其他人(o)對目錄的讀寫執行權限 
chown user1 file1 改變一個文件的所有人屬性 
chown -R user1 directory1 改變一個目錄的所有人屬性並同時改變改目錄下所有文件的屬性 
chgrp group1 file1 改變文件的群組 
chown user1:group1 file1 改變一個文件的所有人和群組屬性 
find / -perm -u+s 羅列一個系統中所有使用了SUID控制的文件 
chmod u+s /bin/file1 設置一個二進制文件的 SUID 位 - 運行該文件的用戶也被賦予和所有者同樣的權限 
chmod u-s /bin/file1 禁用一個二進制文件的 SUID位 
chmod g+s /home/public 設置一個目錄的SGID 位 - 類似SUID ,不過這是針對目錄的 
chmod g-s /home/public 禁用一個目錄的 SGID 位 
chmod o+t /home/public 設置一個文件的 STIKY 位 - 只允許合法所有人刪除文件 
chmod o-t /home/public 禁用一個目錄的 STIKY 位

文件的特殊屬性 - 使用 "+" 設置權限,使用 "-" 用於取消

chattr +a file1 只允許以追加方式讀寫文件 
chattr +c file1 允許這個文件能被內核自動壓縮/解壓 
chattr +d file1 在進行文件系統備份時,dump程序將忽略這個文件 
chattr +i file1 設置成不可變的文件,不能被刪除、修改、重命名或者鏈接 
chattr +s file1 允許一個文件被安全地刪除 
chattr +S file1 一旦應用程序對這個文件執行了寫操作,使系統立刻把修改的結果寫到磁盤 
chattr +u file1 若文件被刪除,系統會允許你在以后恢復這個被刪除的文件 
lsattr 顯示特殊的屬性

打包和壓縮文件

bunzip2 file1.bz2 解壓一個叫做 'file1.bz2'的文件 
bzip2 file1 壓縮一個叫做 'file1' 的文件 
gunzip file1.gz 解壓一個叫做 'file1.gz'的文件 
gzip file1 壓縮一個叫做 'file1'的文件 
gzip -9 file1 最大程度壓縮 
rar a file1.rar test_file 創建一個叫做 'file1.rar' 的包 
rar a file1.rar file1 file2 dir1 同時壓縮 'file1', 'file2' 以及目錄 'dir1' 
rar x file1.rar 解壓rar包 
unrar x file1.rar 解壓rar包 
tar -cvf archive.tar file1 創建一個非壓縮的 tarball 
tar -cvf archive.tar file1 file2 dir1 創建一個包含了 'file1', 'file2' 以及 'dir1'的檔案文件 
tar -tf archive.tar 顯示一個包中的內容 
tar -xvf archive.tar 釋放一個包 
tar -xvf archive.tar -C /tmp 將壓縮包釋放到 /tmp目錄下 
tar -cvfj archive.tar.bz2 dir1 創建一個bzip2格式的壓縮包 
tar -xvfj archive.tar.bz2 解壓一個bzip2格式的壓縮包 
tar -cvfz archive.tar.gz dir1 創建一個gzip格式的壓縮包 
tar -xvfz archive.tar.gz 解壓一個gzip格式的壓縮包 
zip file1.zip file1 創建一個zip格式的壓縮包 
zip -r file1.zip file1 file2 dir1 將幾個文件和目錄同時壓縮成一個zip格式的壓縮包 
unzip file1.zip 解壓一個zip格式壓縮包

RPM 包 - (Fedora, Redhat及類似系統)

rpm -ivh package.rpm 安裝一個rpm包 
rpm -ivh --nodeeps package.rpm 安裝一個rpm包而忽略依賴關系警告 
rpm -U package.rpm 更新一個rpm包但不改變其配置文件 
rpm -F package.rpm 更新一個確定已經安裝的rpm包 
rpm -e package_name.rpm 刪除一個rpm包 
rpm -qa 顯示系統中所有已經安裝的rpm包 
rpm -qa | grep httpd 顯示所有名稱中包含 "httpd" 字樣的rpm包 
rpm -qi package_name 獲取一個已安裝包的特殊信息 
rpm -qg "System Environment/Daemons" 顯示一個組件的rpm包 
rpm -ql package_name 顯示一個已經安裝的rpm包提供的文件列表 
rpm -qc package_name 顯示一個已經安裝的rpm包提供的配置文件列表 
rpm -q package_name --whatrequires 顯示與一個rpm包存在依賴關系的列表 
rpm -q package_name --whatprovides 顯示一個rpm包所占的體積 
rpm -q package_name --scripts 顯示在安裝/刪除期間所執行的腳本l 
rpm -q package_name --changelog 顯示一個rpm包的修改歷史 
rpm -qf /etc/httpd/conf/httpd.conf 確認所給的文件由哪個rpm包所提供 
rpm -qp package.rpm -l 顯示由一個尚未安裝的rpm包提供的文件列表 
rpm --import /media/cdrom/RPM-GPG-KEY 導入公鑰數字證書 
rpm --checksig package.rpm 確認一個rpm包的完整性 
rpm -qa gpg-pubkey 確認已安裝的所有rpm包的完整性 
rpm -V package_name 檢查文件尺寸、 許可、類型、所有者、群組、MD5檢查以及最后修改時間 
rpm -Va 檢查系統中所有已安裝的rpm包- 小心使用 
rpm -Vp package.rpm 確認一個rpm包還未安裝 
rpm2cpio package.rpm | cpio --extract --make-directories *bin* 從一個rpm包運行可執行文件 
rpm -ivh /usr/src/redhat/RPMS/`arch`/package.rpm 從一個rpm源碼安裝一個構建好的包 
rpmbuild --rebuild package_name.src.rpm 從一個rpm源碼構建一個 rpm 包

YUM 軟件包升級器 - (Fedora, RedHat及類似系統)
yum install package_name 下載並安裝一個rpm包
yum localinstall package_name.rpm 將安裝一個rpm包,使用你自己的軟件倉庫為你解決所有依賴關系
yum update package_name.rpm 更新當前系統中所有安裝的rpm包
yum update package_name 更新一個rpm包
yum remove package_name 刪除一個rpm包
yum list 列出當前系統中安裝的所有包
yum search package_name 在rpm倉庫中搜尋軟件包
yum clean packages 清理rpm緩存刪除下載的包
yum clean headers 刪除所有頭文件
yum clean all 刪除所有緩存的包和頭文件

DEB 包 (Debian, Ubuntu 以及類似系統)
dpkg -i package.deb 安裝/更新一個 deb 包
dpkg -r package_name 從系統刪除一個 deb 包
dpkg -l 顯示系統中所有已經安裝的 deb 包
dpkg -l | grep httpd 顯示所有名稱中包含 "httpd" 字樣的deb包
dpkg -s package_name 獲得已經安裝在系統中一個特殊包的信息
dpkg -L package_name 顯示系統中已經安裝的一個deb包所提供的文件列表
dpkg --contents package.deb 顯示尚未安裝的一個包所提供的文件列表
dpkg -S /bin/ping 確認所給的文件由哪個deb包提供

APT 軟件工具 (Debian, Ubuntu 以及類似系統)
apt-get install package_name 安裝/更新一個 deb 包
apt-cdrom install package_name 從光盤安裝/更新一個 deb 包
apt-get update 升級列表中的軟件包
apt-get upgrade 升級所有已安裝的軟件
apt-get remove package_name 從系統刪除一個deb包
apt-get check 確認依賴的軟件倉庫正確
apt-get clean 從下載的軟件包中清理緩存
apt-cache search searched-package 返回包含所要搜索字符串的軟件包名稱

查看文件內容
cat file1 從第一個字節開始正向查看文件的內容
tac file1 從最后一行開始反向查看一個文件的內容
more file1 查看一個長文件的內容
less file1 類似於 'more' 命令,但是它允許在文件中和正向操作一樣的反向操作
head -2 file1 查看一個文件的前兩行
tail -2 file1 查看一個文件的最后兩行
tail -f /var/log/messages 實時查看被添加到一個文件中的內容

文本處理
cat file1 file2 ... | command <> file1_in.txt_or_file1_out.txt general syntax for text manipulation using PIPE, STDIN and STDOUT
cat file1 | command( sed, grep, awk, grep, etc...) > result.txt 合並一個文件的詳細說明文本,並將簡介寫入一個新文件中
cat file1 | command( sed, grep, awk, grep, etc...) >> result.txt 合並一個文件的詳細說明文本,並將簡介寫入一個已有的文件中
grep Aug /var/log/messages 在文件 '/var/log/messages'中查找關鍵詞"Aug"
grep ^Aug /var/log/messages 在文件 '/var/log/messages'中查找以"Aug"開始的詞匯
grep [0-9] /var/log/messages 選擇 '/var/log/messages' 文件中所有包含數字的行
grep Aug -R /var/log/* 在目錄 '/var/log' 及隨后的目錄中搜索字符串"Aug"
sed 's/stringa1/stringa2/g' filename.txt 將filename.txt文件中的 "string1" 替換成 "string2"
sed '/^$/d' filename.txt 從filename.txt文件中刪除所有空白行
sed '/ *#/d; /^$/d' filename.txt 從filename.txt文件中刪除所有注釋和空白行
echo 'esempio' | tr '[:lower:]' '[:upper:]' 合並上下單元格內容
sed -e '1d' result.txt 從文件filename.txt 中排除第一行
sed -n '/stringa1/p' 查看只包含詞匯 "string1"的行
sed -e 's/ *$//g' filename.txt 刪除每一行最后的空白字符
sed -e 's/stringa1//g' filename.txt 從文檔中只刪除詞匯 "string1" 並保留剩余全部
sed -n '1,5p;5q' filename.txt 查看從第一行到第5行內容
sed -n '5p;5q' filename.txt 查看第5行
sed -e 's/00*/0/g' filename.txt 用單個零替換多個零
cat -n file1 標示文件的行數
cat filename.txt | awk 'NR%2==1' 刪除filename.txt文件中的所有偶數行
echo a b c | awk '{print $1}' 查看一行第一欄
echo a b c | awk '{print $1,$3}' 查看一行的第一和第三欄
paste file1 file2 合並兩個文件或兩欄的內容
paste -d '+' file1 file2 合並兩個文件或兩欄的內容,中間用"+"區分
sort file1 file2 排序兩個文件的內容
sort file1 file2 | uniq 取出兩個文件的並集(重復的行只保留一份)
sort file1 file2 | uniq -u 刪除交集,留下其他的行
sort file1 file2 | uniq -d 取出兩個文件的交集(只留下同時存在於兩個文件中的文件)
comm -1 file1 file2 比較兩個文件的內容只刪除 'file1' 所包含的內容
comm -2 file1 file2 比較兩個文件的內容只刪除 'file2' 所包含的內容
comm -3 file1 file2 比較兩個文件的內容只刪除兩個文件共有的部分

字符設置和文件格式轉換
dos2unix filedos.txt fileunix.txt 將一個文本文件的格式從MSDOS轉換成UNIX
unix2dos fileunix.txt filedos.txt 將一個文本文件的格式從UNIX轉換成MSDOS
recode ..HTML < page.txt > page.html 將一個文本文件轉換成html
recode -l | more 顯示所有允許的轉換格式

文件系統分析
badblocks -v /dev/hda1 檢查磁盤hda1上的壞磁塊
fsck /dev/hda1 修復/檢查hda1磁盤上linux文件系統的完整性
fsck.ext2 /dev/hda1 修復/檢查hda1磁盤上ext2文件系統的完整性
e2fsck /dev/hda1 修復/檢查hda1磁盤上ext2文件系統的完整性
e2fsck -j /dev/hda1 修復/檢查hda1磁盤上ext3文件系統的完整性
fsck.ext3 /dev/hda1 修復/檢查hda1磁盤上ext3文件系統的完整性
fsck.vfat /dev/hda1 修復/檢查hda1磁盤上fat文件系統的完整性
fsck.msdos /dev/hda1 修復/檢查hda1磁盤上dos文件系統的完整性
dosfsck /dev/hda1 修復/檢查hda1磁盤上dos文件系統的完整性

初始化一個文件系統
mkfs /dev/hda1 在hda1分區創建一個文件系統
mke2fs /dev/hda1 在hda1分區創建一個linux ext2的文件系統
mke2fs -j /dev/hda1 在hda1分區創建一個linux ext3(日志型)的文件系統
mkfs -t vfat 32 -F /dev/hda1 創建一個 FAT32 文件系統
fdformat -n /dev/fd0 格式化一個軟盤
mkswap /dev/hda3 創建一個swap文件系統

SWAP文件系統
mkswap /dev/hda3 創建一個swap文件系統
swapon /dev/hda3 啟用一個新的swap文件系統
swapon /dev/hda2 /dev/hdb3 啟用兩個swap分區

備份
dump -0aj -f /tmp/home0.bak /home 制作一個 '/home' 目錄的完整備份
dump -1aj -f /tmp/home0.bak /home 制作一個 '/home' 目錄的交互式備份
restore -if /tmp/home0.bak 還原一個交互式備份
rsync -rogpav --delete /home /tmp 同步兩邊的目錄
rsync -rogpav -e ssh --delete /home ip_address:/tmp 通過SSH通道rsync
rsync -az -e ssh --delete ip_addr:/home/public /home/local 通過ssh和壓縮將一個遠程目錄同步到本地目錄
rsync -az -e ssh --delete /home/local ip_addr:/home/public 通過ssh和壓縮將本地目錄同步到遠程目錄
dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr 'dd of=hda.gz' 通過ssh在遠程主機上執行一次備份本地磁盤的操作
dd if=/dev/sda of=/tmp/file1 備份磁盤內容到一個文件
tar -Puf backup.tar /home/user 執行一次對 '/home/user' 目錄的交互式備份操作
( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr 'cd /home/share/ && tar x -p' 通過ssh在遠程目錄中復制一個目錄內容
( tar c /home ) | ssh -C user@ip_addr 'cd /home/backup-home && tar x -p' 通過ssh在遠程目錄中復制一個本地目錄
tar cf - . | (cd /tmp/backup ; tar xf - ) 本地將一個目錄復制到另一個地方,保留原有權限及鏈接
find /home/user1 -name '*.txt' | xargs cp -av --target-directory=/home/backup/ --parents 從一個目錄查找並復制所有以 '.txt' 結尾的文件到另一個目錄
find /var/log -name '*.log' | tar cv --files-from=- | bzip2 > log.tar.bz2 查找所有以 '.log' 結尾的文件並做成一個bzip包
dd if=/dev/hda of=/dev/fd0 bs=512 count=1 做一個將 MBR (Master Boot Record)內容復制到軟盤的動作
dd if=/dev/fd0 of=/dev/hda bs=512 count=1 從已經保存到軟盤的備份中恢復MBR內容

光盤
cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force 清空一個可復寫的光盤內容
mkisofs /dev/cdrom > cd.iso 在磁盤上創建一個光盤的iso鏡像文件
mkisofs /dev/cdrom | gzip > cd_iso.gz 在磁盤上創建一個壓縮了的光盤iso鏡像文件
mkisofs -J -allow-leading-dots -R -V "Label CD" -iso-level 4 -o ./cd.iso data_cd 創建一個目錄的iso鏡像文件
cdrecord -v dev=/dev/cdrom cd.iso 刻錄一個ISO鏡像文件
gzip -dc cd_iso.gz | cdrecord dev=/dev/cdrom - 刻錄一個壓縮了的ISO鏡像文件
mount -o loop cd.iso /mnt/iso 掛載一個ISO鏡像文件
cd-paranoia -B 從一個CD光盤轉錄音軌到 wav 文件中
cd-paranoia -- "-3" 從一個CD光盤轉錄音軌到 wav 文件中(參數-3)
cdrecord --scanbus 掃描總線以識別scsi通道
dd if=/dev/hdc | md5sum 校驗一個設備的md5sum編碼,例如一張 CD


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM