多种方式实现:Linux下查找和删除7天以前的文件、Linux命令删除指定日期的文件、Logrotate的基本使用方法自动删除文件、Linux云服务器更灵活iptables转发tcp/udp端口请求
记一次linux下清理过期日志的过程;
环境说明:删除/var/log/下7天以前的.log文件;
用到的命令:find、rm;
命令示例:find /var/log/ -mtime +7 -name "*.log" -exec rm {} \;
说明:
find :查找命令
/var/log/ :需要查找的文件路径
-mtime +7 :按文件更改时间来查找文件,-7指7天以内,+7指7天以前
-name “*.log” :你要查找的文件名,可用通配符
-exec :将find查到的文件执行command操作,{} 和 ;之间有空格
rm {} ; :需要执行的command操作
扩展:
find ~ -name "*.txt" #在$HOME中查找找.txt文件并显示
find ./ -name "[A-Z]*" #查找找以大写字母开头的文件
find ./ -name "[a-z][a-z][0–9][0–9].txt" #查找找以两个小写字母和两个数字开头的txt文件
find ./ -type f -perm 755 #在当前目录查找找权限为755的文件
find ./ -type d -perm 755 #在当前目录查找找权限为755的目录
find ./ -perm 755 #在当前目录查找找权限为755的文件和目录
find ./ -perm 755 -type f -exec ls -l {} \; #查找找当前目录权限为755权限的文件并执行ls -l 命令
find ./ -type l #查找当前目录下的链接文件
find ./ -size +10 #查找长度超过期作废10块的文件(1块=512字节)
find /etc/ -name "passwd" -exec grep -i "user1" {} \;#查看user1用户是否存在
find ./ -name test* fprint file.txt #在当前目录下查找以test开头的文件,并把结果输出到file.txt中
find ./ -name ab* -o -name cd* #查找以ab或cd开头的文件
find /home -mtime -2 #在/home下查找最近两天内改动过的文件
find /home -atime -1 #查找1天之内被存取过的文件
find /home -mmin +60 #在/home下查找60分钟前改动过的文件
find /home -amin +30 #查找最近30分钟前被存取过的文件
find /home -newer tmp.txt #在/home下查找更新时间比tmp.txt近的文件或目录
find /home -anewer tmp.txt #在/home下查找存取时间比tmp.txt近的文件或目录
find /home -user user1 #列出/home目录内属于用户user1的文件或目录
find /home -uid +501 #列出/home目录内用户的识别码大于501的文件或目录
find /home -group user1 #列出/home内组为user1的文件或目录
find /home -gid 501 #列出/home内组id为501的文件或目录
find /home -nouser #列出/home内不属于本地用户的文件或目录
find /home -nogroup #列出/home内不属于本地组的文件或目录
find /home -name tmp.txt -maxdepth 4 #列出/home内的tmp.txt 查找时深度最多为3层
find /home -name tmp.txt -mindepth 3 #从第2层开始查找
find /home -empty #查找大小为0的文件或空目录
find /home -size +512k #查找大于512k的文件
find /home -size -512k #查找小于512k的文件
find /home -links +2 #查找硬连接数大于2的文件或目录
find /tmp -name tmp.txt -exec cat {} \; #查找tmp下名为tmp.txt的文件并cat它
find /tmp -name tmp.txt -ok rm {} \; #查找tmp下名为tmp.txt的文件并删除它,-ok:删除前提示
find / -amin -10 #查找在系统中最后10分钟访问的文件
find / -atime -2 #查找在系统中最后48小时访问的文件
find / -group user1 #查找在系统中属于user1组的文件
find / -mmin -5 #查找在系统中最后5分钟里修改过的文件
find / -mtime -1 #查找在系统中最后24小时里修改过的文件
find / -nouser #查找在系统中属于作废用户的文件
find / -user user1 #查找在系统中属于user1这个用户的文件
1.需求
按时间删除 hive 产生的日志
2.查看 /var/log/hive目录
cd /var/log/hive
ll
3.使用find命令按时间筛选
find 参数说明
-amin -n: 最后一次访问发生在 n分钟 之内
-amin n: 最后一次访问发生在距离当前时间 n分钟 至 (n+1)分钟
-amin +n: 最后一次访问发生在 (n+1)分钟 之外
-atime -n: 最后一次访问发生在 n天 之内
-atime n: 最后一次访问发生在 n天 至 (n+1)天
-atime +n: 最后一次访问发生在 (n+1)天 之外
-cmin -n: 最后一次文件状态修改发生在 n分钟 之内
-cmin n: 最后一次文件状态修改发生在 n分钟 至 (n+1)分钟
-cmin +n: 最后一次文件状态修改发生在 (n+1)分钟 之外
-ctime -n: 最后一次文件状态修改发生在 n天 之内
-ctime n: 最后一次文件状态修改发生在 n天 至 (n+1) 天
-ctime +n: 最后一次文件状态修改发生在 (n+1)天 之外
-mmin -n: 最后一次文件内容修改发生在 n分钟 之内
-mmin n: 最后一次文件内容修改发生在 n分钟 至 (n+1)分钟
-mmin +n: 最后一次文件内容修改发生在 (n+1)分钟 之外
-mtime -n: 最后一次文件内容修改发生在 n天 之内
-mtime n: 最后一次文件内容修改发生在 n天 至 (n+1)天
-mtime +n: 最后一次文件内容修改发生在 (n+1)天 之外
#查找文件内容修改发生在2天之内的文件
find /var/log/hive/ -name "*" -mtime -2
4.执行删除
#删除5天前的文件
# -exec参数,如果查找有返回,可在exec参数后加上需要操作的命令,查找结果用{}来代替
find /var/log/hive/ -name "*" -mtime +5 -exec rm -rfv {} \;
如何定位旧文件
find ./ -mtime +30 -name "*.gz" | xargs ls -ltrh
上条命令主要功能是查询当前目录下
时间超过30天
的
.gz
结束所有文件名,并将其信息打印出来。关于find -mtime的详细用法,可以百度下。
如:我们需要查找出nginx日志目录下,超过30天的.gz扩展名的所有文件
对比一下/var/log/nginx下所有文件,可以发现上条命令的确把30天以内的文件都过滤了。
删除文件
find ./ -mtime +30 -name "*.gz" | [sudo] xargs rm -f
根据权限情况,选择是否需要sudo
Logrotate的基本使用方法自动删除文件
Linux服务器上我们用Logrotate来分割归档日志文件,结合crond我们可以指定每天在某个时间自动整理日志等文档。本文主要说明了Centos下Logrotate的使用和配置的方法。
Logrotate配置文件在哪儿?
Logrotate的配置文件位于 /etc/logrotate.conf。
Logrotate的子配置文件位于文件夹 /etc/logrotate.d/ 下,某些软件,入nginx,会在rpm命令安装后会把对应的nginx日志分割文件释放在此,用于定时整理日志文件。
如何使用
我们先试用帮助命令看一下,其中老高想强调的是
-d,其翻译为什么都不做,仅仅是测试,这个参数很大程度方便了我们测试配置文件而不用担心当前的配置出差错。
-s,指定状态文件路径,该文件默认路径在 /var/lib/logrotate/logrotate.status,记录了Logrotate命令的运行情况。
$ /usr/sbin/logrotate --help
Usage: logrotate [OPTION...] <configfile>
-d, --debug Don't do anything, just test (implies -v)
-f, --force Force file rotation
-m, --mail=command Command to send mail (instead of `/bin/mail')
-s, --state=statefile Path of state file
-v, --verbose Display messages during rotation
-l, --log=STRING Log file
--version Display version information
Help options:
-?, --help Show this help message
--usage Display brief usage message
如果想测试配置文件
# 测试所有logrotate配置
/usr/sbin/logrotate -d -v /etc/logrotate.conf
# 测试指定的logrotate配置,入nginx
/usr/sbin/logrotate -d -v /etc/logrotate.d/nginx
整理时间错乱的问题
开始使用Logrotate时,老高发现日志的切割时间总是在晚上3点的某个时间,如果你也发现了这个问题,可以按照以下步骤排查:
查看所有用户的计划任务
首先我们确保没有其他用户手动添加日志切割的计划任务,运行下面的命令确保找不到logrotate关键字!
# 查看所有用户的计划任务,使用前提是有权限的用户
for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l; done
查看Logrotate的计划任务配置
再此我们使用cat命令检查/etc/cron.daily/logrotate的存在,并确认文件内容没有被修改。
同时我们可以推测把类似的文件丢在这里可以每日触发脚本,同理还有/etc/cron.hourly等,可以用ls /etc/cron*查看!
cat /etc/cron.daily/logrotate
# 以下是文件内容
#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
查看anacron配置
RANDOM_DELAY 指的是最大的延迟时间,这个时间被加在delay in minutes中,为最后生效的delay分钟数,也就是说每次执行日常任务是总是有一个随机5-50分钟的延时,如果设为0可以避免这个问题,但是可能会加重系统的负担,因为程序可能会在某一个时间全部运行!
START_HOURS_RANGE 指定任务开始的小时数,这也就说明了为什么修改时间总是在3点的问题。
读懂了配置我们就可以自行修改以符合我们对运行时间的需求了!
cat /etc/anacrontab
# 以下是文件内容
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
以下是cron->anacron调用图
+------------------------+
| |
|/etc/cron.hourly/0anacro|
| |
+-----------+------------+
|
|if var/spool/anacron/cron.daily
|does not run today
|
+--------v--------+
| |
|/usr/sbin/anacron|
| |
+--------+--------+
|
|read /etc/anacrontab
|
+-------------v------------+
| |
| trigger logrotate |
| |
+--------------------------+
Logrotate配置范例
下面是/etc/logrotate.d/文件夹里文件的内容,贴出来给大家参考
$ cat /etc/logrotate.d/*
/var/log/httpd/*log {
missingok
notifempty
sharedscripts
delaycompress
postrotate
/bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
endscript
}
# The log file name and location can be set in
# /etc/my.cnf by setting the "log-error" option
# in [mysqld] section as follows:
#
# [mysqld]
# log-error=/var/log/mysqld.log
#
# For the mysqladmin commands below to work, root account
# password is required. Use mysql_config_editor(1) to store
# authentication credentials in the encrypted login path file
# ~/.mylogin.cnf
#
# Example usage:
#
# mysql_config_editor set --login-path=client --user=root --host=localhost --password
#
# When these actions has been done, un-comment the following to
# enable rotation of mysqld's log error.
#
#/var/log/mysqld.log {
# create 640 mysql mysql
# notifempty
# daily
# rotate 5
# missingok
# compress
# postrotate
# # just if mysqld is really running
# if test -x /usr/bin/mysqladmin && \
# /usr/bin/mysqladmin ping &>/dev/null
# then
# /usr/bin/mysqladmin flush-logs
# fi
# endscript
#}
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
/var/log/php-fpm/*log {
missingok
notifempty
sharedscripts
delaycompress
postrotate
/bin/kill -SIGUSR1 `cat /run/php-fpm/php-fpm.pid 2>/dev/null` 2>/dev/null || true
endscript
}
/var/log/redis/*.log {
weekly
rotate 10
copytruncate
delaycompress
compress
notifempty
missingok
}
/var/log/yum.log {
missingok
notifempty
size 30k
yearly
create 0600 root root
}
路由转发是计算机网络中的一种重要概念,特别是在网络设备和系统之间。它涉及到如何处理和传递数据包,以及决定数据包应该发送到哪个网络设备或路由表中的哪条路径,iptables是本文主要应用的软件技术。
本文主要介绍以下几个情况的配置:
本机端口转发到本机其它端口
本机端口转发到其它机器
本文所描述技术可以应用的几种场景:
本地服务器搭建samba共享文件夹,挂载到云服务器
本地服务器搭建gitlab服务器,挂载到云服务器
本地搭建的其它服务器挂载到云服务指定端口
一、路由转发涉及点
路由转发涉及到以下几个方面:
路由表:这是网络中用于确定数据包应该发送到哪个物理网络或下一个路由器的表。路由表通常包含有关到达不同网络的目标地址的信息,例如下一跳路由器、路径权重等。
数据包转发:当一个路由器收到一个数据包时,它会根据其路由表确定如何将该数据包发送到下一个路由器或目标网络。这可以通过直接将数据包发送到下一个路由器或通过另一个路由器(即链路)转发来实现。
数据包过滤:路由器通常还具有过滤机制,用于确定哪些数据包应该被转发到下一个路由器,哪些应该被丢弃或被拒绝。这可能涉及到诸如防火墙规则、病毒防护或访问控制列表等安全功能。
路由转发的过程通常由路由器硬件和软件协同完成,并且受到网络拓扑、路由协议(如静态路由、动态路由等)以及网络流量等因素的影响。
路由转发是计算机网络中网络设备之间传递数据包的关键过程,它涉及到如何确定数据包的下一跳位置以及如何处理和传递数据包以到达最终目的地。
二、转发如何配置
测试网站:3
docker run --rm --name web1 --publish 8080:8080 nigelpoulton/web
修改/etc/sysctl.conf文件,让包转发功能在系统启动时自动生效:
# 启动当前设备的包转发功能,增加下边这句
net.ipv4.ip_forward = 1
使用sudo sysctl -p应用修改
本机端口转发到本机其它端口
将网内其它设备访问本IP的 9000 端口转发到 8080端口,同网段内其它设备可以通过9000端口访问服务。
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 9000 -j REDIRECT --to-port 8080
$ curl 192.168.1.66:9000
# Out put
<html><head><title>Docker Rocks</title><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"/></head><body><div class="container"><div class="jumbotron"><h1>Hello Docker learners!!!</h1><p>Be careful. The last time I updated the packages in this app was April 2020.</p><p> </p></div></div></body></html>
将本机访问本机的 9000 端口转发到 8080端口,本机可以通过 9000端口访问服务。
sudo iptables -t nat -A OUTPUT -p tcp --dport 9000 -j REDIRECT --to-port 8080
curl 192.168.1.66:9000
# Out put
<html><head><title>Docker Rocks</title><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css"/></head><body><div class="container"><div class="jumbotron"><h1>Hello Docker learners!!!</h1><p>Be careful. The last time I updated the packages in this app was April 2020.</p><p> </p></div></div></body></html>
修改后的路由表如下:
$ sudo iptables -t nat -nL --line
Chain PREROUTING (policy ACCEPT)
num target prot opt source destination
1 DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
2 REDIRECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9000 redir ports 8080
Chain INPUT (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
2 REDIRECT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9000 redir ports 8080
Chain POSTROUTING (policy ACCEPT)
num target prot opt source destination
1 MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
2 MASQUERADE tcp -- 172.17.0.2 172.17.0.2 tcp dpt:8080
Chain DOCKER (2 references)
num target prot opt source destination
1 RETURN all -- 0.0.0.0/0 0.0.0.0/0
2 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.2:8080
本机端口转发到其它机器
将网内其它设备访问本IP的 9000 端口转发到另一台机器的 8080端口,同网段内其它设备可以通过9000端口访问服务。
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 9000 -j DNAT --to-destination 192.168.1.66:8080
$ sudo iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.66 --dport 8080 -j SNAT --to-source 192.168.1.85
# 如果配置上述两个后还是上不了网,请检查filter FORWARD表
$ sudo iptables -nvL
# Out put,这里可以看到默认配置是丢弃
Chain FORWARD (policy DROP 813 packets, 42988 bytes)
# 修改对应网卡为接受
$ ip a
# Out put, 这里看到对应网卡为enp1s0
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether ec:d6:8a:fa:c2:91 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.85/24 brd 192.168.1.255 scope global dynamic noprefixroute enp1s0
valid_lft 65632sec preferred_lft 65632sec
$ sudo iptables -A FORWARD -o enp1s0 -j ACCEPT
修改后的路由表如下:
$ sudo iptables -t nat -nL --line
Chain PREROUTING (policy ACCEPT)
num target prot opt source destination
1 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:192.168.1.66:8080
Chain INPUT (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
num target prot opt source destination
1 SNAT tcp -- 0.0.0.0/0 192.168.1.66 tcp dpt:8080 to:192.168.1.85
$ sudo iptables -t filter -nvL --line
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain FORWARD (policy DROP 813 packets, 42988 bytes)
num pkts bytes target prot opt in out source destination
1 52 5506 ACCEPT all -- * enp1s0 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
三、固化iptables
这里只记录一种比较简单的方式,还有其它方式可以自行搜索。
$ sudo apt-get install iptables-persistent
/etc/iptables$ tree -f
# 打印输出,可以看到这里多了一个/etc/iptables的文件夹
.
├── ./rules.v4
└── ./rules.v6
红帽和centos系统可以通过以下命令:
iptables-save
iptables-save > /etc/iptables/iptables.rules
service iptables save
如果需要更新调用下边的命令:
# 保存ipv4路由信息
$ sudo iptables-save -f /etc/iptables/rules.v4
# 保存ipv6路由信息
$ sudo ip6tables-save -f /etc/iptables/rules.v6
如果需要重启恢复初始路由或卸载,使用下边命令:
$ sudo apt-get remove iptables-persistent
$ sudo rm -rf /etc/iptables/
如果是云服务器,对应上述情况建立ip转发即可,例如samba转发tcp 445 139端口,udp 137 138端口,通过iptables -p参数切换udp/tcp。