在一个备份脚步中执行了删除7天前的旧备份文件的命令,备份文件存放在/home/backups/files/下,命令如下:
find /home/backups/files/ -mtime +6 -exec rm -rf {} \;
开始时候运行正常,一段时间后发现没有备份了,查看下来,发现/home/backups/files/文件都不存在了。原来是因为find写法有问题,find /home/backups/files/ -mtime +6 出来的结果会包含/home/backups/files/目录(当files目录的创建时间超过7天),是自己想当然的以为在目录后面加了“/”就只查找该目录下的文件,测试下来,find /home/backups/files/ -mtime +6和find /home/backups/files -mtime +6的结果一致。知道问题所在了,解决问题就好办了,只需要在后面加个星号(*)通配符就行了,如下:
find /home/backups/files/* -mtime +6 -exec rm -rf {} \;
执行linux命令或脚本时,如果不想打印出错误信息,可以使用
command 2>/dev/null
注意:2>/dev/null中间不要有空格
同样,如果不想看到标准的输出,则可以这样
command 1>/dev/null
要是不想看到任何输出,则:
command >/dev/null 2>&1
linux有3个默认的I/O
- 0 是标准输入,一般是键盘
- 1 是标准输出,一般是屏幕了
- 2 是标准错误,有时候屏幕上可以看到,但是重定向的文件中看不到的就是它了
现在知道上述的1、2的含义了,所以第一条命令就是把命令的错误信息重定向到一个空设备中,即丢弃此信息,第二条就是把标准输出重定向到空设备中,最后一条是把标准输出(默认)重定向到空设备,同时把错误信息定向到标准输出中,当然可以这么写
command 1>/dev/null 2>&1
netstat -tunlp
netstat -nat | grep "10.150.185.178:80" | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -20
netstat -nat | awk '{print $6}' | sort | uniq -c | sort -rn
或
netstat -na | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
另外分析access.log获得访问前10位的ip地址可以用如下命令:
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
用客户端工具,例如securecrt连接linux服务器,有的会出现过一段时间没有任何操作,客户端与服务器就断开了连接。造成这个的原因,主要是因为客户端与服务器之间存在路由器,防火墙以及为了本身的安全性,在超过特定的时间后就会把空闲连接断开。或者是服务器端设置了断开空闲连接。那么解决的方法有两种,一是从服务器着手,一是在客户端工具上下手。
修改/etc/ssh/sshd_config配置文件 ClientAliveInterval 300(默认为0),参数的是意思是每5分钟,服务器向客户端发一个消息,用于保持连接,使用service sshd reload 让其修改后生效。如果发现还是有问题,可以试着把300设置小一点,例如60。
securecrt的设置方法:会话选项 –> 终端 –> 反空闲–>选中发送协议 NO-OP(p) 每 60 秒
putty的设置方法:putty -> Connection -> Seconds between keepalives ( 0 to turn off ), 默认为0, 改为300
出现rsync: failed to set times on “xxxx”: Operation not permitted的原因大致是对文件夹(或文件)xxxx没有操作权限。如果执行同步的用户是root,是不会有这样的问题,但是rsync也可以不使用root用户来进行同步,不使用root用户的情况下,即使使用了-o,-g,同步到目的文件夹的文件用户和组都变成了同步使用的用户,但是用-p后文件权限可以保留。当目的文件夹(或文件)xxxx事后做过修改使owner不是rsync使用的用户,即使xxxx的权限是777,也会出现上述错误。
在linux下提供的crontab可以很轻松的帮我们完成一些需要定时处理的任务。在某些系统下,明明通过terminal可以执行的动作,加入到crontab后却没有执行,检查配置也没有任何问题。最终发现是由于cron的运行环境(包括path等)可能不是和登陆的当前用户一致造成的,所以在配置crontab时,建议命令用完整路径。
linux下通过rm命令来删除文件,但是如果要删除文件名乱码的文件,就不能直接使用rm命令了,因为压根就无法输出文件名来。不过借助find命令可以实现对其删除。在linux下对于每个文件都一个对应的不变的inode号,使用 ls -li 可以查看到文件的inode号,同时find可以根据inode号来查找,另外find命令中可以执行其他的命令。删除的步骤如下:
- 通过ls -li 获取要删除乱码文件名文件的inode号,比如得到的是 123456
- 执行删除
find ./ -inum 123456 -exec rm -rf {} \;
注意:“{}”后要空一格再加上“\;”。
在某些版本的linux下,通过find查找当前目录下所有后缀名jpg的文件,命令为
find ./ -iname *.jpg
会出现“find: 路径必须在表达式之前”的错误提示。解决的方法有两种
- 使用转义符把*转义,即 \*.jpg
- 用引号引起来 ,即 “*.jpg”
注意:如果需要把find 的结果提交给while,例如:
`echo find ./ -iname "\*.jpg"` | while read f
do
#do something
done
则既需要转义符,也需要引号
linux中每次执行的命令都会纪录,一般默认最近纪录1000条。可以通过history来查看先前输入的命令,有时候重复执行某条命令多次,这样对查找先前执行的命令造成不方便,可以在/et/bashrc中进行如下设置。
去除连续重复的命令
export HISTCONTROL=ignoreboth
消除整个命令历史中的重复命令
export HISTCONTROL=erasedups
如果需要记录更多命令历史记录,例如2000条
export HISTSIZE=2000
使用 /sbin/iptables -F 要小心,搞不好,你就马上同服务器断开连接了,以下是来自 http://wiki.ubuntu.org.cn/IptablesHowTo 上的说明
可以通过/sbin/iptables -F清除所有规则来暂时停止防火墙: (警告:这只适合在没有配置防火墙的环境中,如果已经配置过默认规则为deny的环境,此步骤将使系统的所有网络访问中断)
如果想清空的话,先执行
/sbin/iptables -P INPUT ACCEPT
然后执行
/sbin/iptables -F
通过iptables -L 看到如下信息
Chain INPUT (policy DROP 0 packets, 0 bytes) (注意 是DROP)
执行/sbin/iptables -F就肯定立马断开连接
当执行了/sbin/iptables -P INPUT ACCEPT,再次通过iptables -L看信息的话就是
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
所以现在是可以安全使用/sbin/iptables -F了