有时候我们在linux系统下,我这里的系统是fedora ,通过服务的方法启动脚本会失败,就算放开了脚本的所有权限,我这里的权限是777,但是通过设置setenforce 0,又可以执行。那我不想setenforce 0,怎么办呢?方法如下,只对此脚本放宽权限。
在 Fedora 系统上,为脚本 /home/ccc/download-ftp/ftp_download.sh
快速配置 SELinux 权限(无需完全关闭 SELinux),可直接执行以下简化步骤:
1. 修改脚本的 SELinux 上下文类型
运行以下命令,将脚本的上下文设置为 bin_t
(允许执行):
sudo chcon -t bin_t /home/ccc/download-ftp/ftp_download.sh
作用:直接赋予脚本类似系统二进制文件的执行权限,绕开默认限制。
2. 永久生效配置(避免重启失效)
sudo semanage fcontext -a -t bin_t "/home/ccc/download-ftp/ftp_download.sh" # 添加永久规则
sudo restorecon -v /home/ccc/download-ftp/ftp_download.sh # 立即应用新规则
3. 如果仍失败,生成白名单策略(自动处理)
# 步骤1: 尝试启动服务触发 SELinux 拦截
sudo systemctl start ftp-download.service
# 步骤2: 自动生成并安装放行策略
sudo ausearch -m avc -ts recent | audit2allow -M my_ftp_policy # 生成策略文件
sudo semodule -i my_ftp_policy.pp # 加载策略
4. 重启服务验证
sudo systemctl restart ftp-download.service
关键命令说明
命令 | 作用 | 是否需重复执行 |
---|---|---|
chcon | 临时修改文件上下文 | 重启后失效 |
semanage fcontext + restorecon | 永久修改文件上下文 | 仅需一次 |
audit2allow | 自动生成放行规则 | 仅需一次 |
附:若未安装工具
先安装 SELinux 管理工具:
sudo dnf install policycoreutils-python-utils setools-console -y
ftp-download.service中的内容
路径:/etc/systemd/system/ftp-download.service
[Unit]
Description=Auto Download FTP Files
[Service]
ExecStart=/home/ccc/download-ftp/ftp_download.sh
#User=root
#Group=root
[Install]
WantedBy=multi-user.target
ftp-download.timer中的内容
路径:/etc/systemd/system/ftp-download.timer
[Unit]
Description=Run FTP Download Daily at 3 AM
[Timer]
OnCalendar=*-*-* 03:00:00
[Install]
WantedBy=timers.target
然后在命令行中执行
systemctl daemon-reload
实现的功能为每天早上3点定时执行脚本ftp_download.sh
脚本ftp_download.sh内容为
#!/bin/bash
# 记录下载开始时间戳(秒级)
START_TIME=$(date +%s)
CURRENT_USER=$(id -un)
CURRENT_GROUP=$(id -gn)
echo "user:${CURRENT_USER} group:${CURRENT_GROUP} [$(date '+%Y-%m-%d %H:%M:%S')] 开始下载" >> /ccc/ftp_download.log
DOWNLOAD_DIR="/ccc/server-ftp-files/"
FTP_URLS_FILE="home/ccc/download-ftp/ftp-urls-all.txt"
mkdir -p "$DOWNLOAD_DIR"
wget -c -r -N -np -nH -l 5 -P "$DOWNLOAD_DIR" --ftp-user="user" --ftp-password="cpas123" -i "${FTP_URLS_FILE}"
# 记录下载结束时间戳(秒级)
END_TIME=$(date +%s)
TOTAL_TIME=$((END_TIME - START_TIME))
# 输出总耗时到日志(精确到秒)
echo "user:${CURRENT_USER} group:${CURRENT_GROUP} [$(date '+%Y-%m-%d %H:%M:%S')] 下载完成,总耗时:${TOTAL_TIME}秒" >> /ccc/ftp_download.log
确保脚本chmod 755 /home/ccc /home/ccc/download-ftp有可执行权限
chmod 755 /home/ccc /home/ccc/download-ftp
ftp-urls-all.txt文件中的内容为:
ftp://192.168.1.229:6121/质量保证部
ftp://192.168.1.229:6121/仓管部
这样配置好了以后就可以每天早上3点定时下载远端ftp上的文件夹整个目录到本机上实现备份