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)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-18git仓库有更新,jenkins 自动触发拉代码怎么配置的?-icode9专业技术文章分享
- 2024-12-18Jenkins webhook 方式怎么配置指定的分支?-icode9专业技术文章分享
- 2024-12-13Linux C++项目实战入门教程
- 2024-12-13Linux C++编程项目实战入门教程
- 2024-12-11Linux部署Scrapy教程:新手入门指南
- 2024-12-11怎么将在本地创建的 Maven 仓库迁移到 Linux 服务器上?-icode9专业技术文章分享
- 2024-12-10Linux常用命令
- 2024-12-06谁看谁服! Linux 创始人对于进程和线程的理解是…
- 2024-12-04操作系统教程:新手入门及初级技巧详解
- 2024-12-04操作系统入门:新手必学指南