多种方式实现:Linux下查找和删除7天以前的文件、Linux命令删除指定日期的文件、Logrotate的基本使用方法自动删除文件、Linux云服务器更灵活iptables转发tcp/udp端口请求

多种方式实现: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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码讲故事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值