在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