Linux运维笔记-日常操作命令总结(1)

2021/4/10 7:32:39

本文主要是介绍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



这篇关于Linux运维笔记-日常操作命令总结(1)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程