Shell脚本在Linux系统管理中非常有用,但如果编写不当,可能会引入严重的安全漏洞。以下是编写安全Shell脚本的关键要点:
#!/bin/bash
# 检查输入是否为数字
if ! [[ "$1" =~ ^[0-9]+$ ]]; then
echo "错误:请输入数字" >&2
exit 1
fi
# 检查文件是否存在且可读
if [ ! -f "$2" -o ! -r "$2" ]; then
echo "错误:文件不存在或不可读" >&2
exit 1
fi
# 不安全的写法
rm $file
# 安全的写法
rm "$file"
#!/bin/bash
# 启用以下安全选项
set -euo pipefail
# -e: 命令失败时立即退出
# -u: 使用未定义变量时报错
# -o pipefail: 管道中任一命令失败则整个管道失败
# 检查是否为root用户
if [ "$(id -u)" -eq 0 ]; then
echo "警告:不建议以root身份运行此脚本" >&2
exit 1
fi
# 不安全的写法 - 容易受到命令注入攻击
filename="; rm -rf /"
ls $filename
# 安全的写法
filename="; rm -rf /"
ls -- "$filename"
# 不安全的方式
tempfile="/tmp/tempfile"
# 安全的方式
tempfile=$(mktemp /tmp/scriptname.XXXXXX)
trap 'rm -f "$tempfile"' EXIT # 脚本退出时自动删除
# 从安全位置读取密码
password=$(cat /etc/secure/passwordfile)
# 或使用环境变量
export DB_PASSWORD="secret"
log() {
local message="$1"
echo "$(date '+%Y-%m-%d %H:%M:%S') - $message" >> /var/log/myscript.log
# 确保日志文件权限正确
chmod 600 /var/log/myscript.log
}
安装和使用ShellCheck工具检查脚本:
# 安装
sudo apt install shellcheck # Debian/Ubuntu
sudo yum install shellcheck # RHEL/CentOS
# 使用
shellcheck myscript.sh
通过遵循这些最佳实践,可以显著提高Shell脚本的安全性,减少潜在漏洞的风险。