《系统管理技巧:免密 sudo 与端口查找》
本文汇总三个小而有用的系统管理技巧:免密 sudo 配置、在指定区间找一个未占用端口、以及 sudo 损坏后的修复。
1 免密 sudo
场景:自动化脚本 / CI 需要 sudo 但不想交互输密码。
# 1) 添加用户
adduser <username>
# 2) 配置 /etc/sudoers(强烈建议用 visudo,不要直接 vi)
sudo visudo
# 在 root 行下方追加:
# <username> ALL=(ALL) NOPASSWD: ALL
/etc/sudoers 内容示例:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
<username> ALL=(ALL) NOPASSWD: ALL
注解:
<username> ALL=(ALL) NOPASSWD: ALL表示该用户在所有主机上以任意身份执行任意命令且免密。若不想全部免密,可只放行特定命令,例如:<username> ALL=(ALL) NOPASSWD: /bin/systemctl restart myapp。
注意:
- 不要手改权限,用
visudo编辑,避免语法错误导致无法 sudo。 chmod +w /etc/sudoers后直接 vi 编辑再恢复权限是常见做法,但更推荐sudoedit /etc/sudoers(会校验语法)。
2 查找指定范围内未占用的端口
适合服务动态分配端口,脚本如下(依赖 shuf):
#!/bin/bash
is_listening() {
TCPnum=$(netstat -an | grep ":$1 " | awk '$1 == "tcp" && $NF == "LISTEN"' | wc -l)
UDPnum=$(netstat -an | grep ":$1 " | awk '$1 == "udp" && $NF == "0.0.0.0:*"' | wc -l)
(( num = TCPnum + UDPnum ))
[ "$num" -eq 0 ] && echo 0 || echo 1
}
random_range() { shuf -i $1-$2 -n1; }
PORT=0
while [ "$PORT" -eq 0 ]; do
temp=$(random_range 8000 9000)
[ "$(is_listening "$temp")" = 0 ] && PORT=$temp
done
echo "port=$PORT"
注意:
is_listening通过 netstat 统计,若同时判断 TCP/UDP,需要 grep 匹配端口附近的冒号,避免 80 与 808 混淆。
3 sudo 损坏修复
报错 sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set,说明 sudo 的所有者/权限被改坏:
chown root /usr/bin/sudo
chgrp root /usr/bin/sudo
chmod u+s /usr/bin/sudo
正常权限样式(s 为 setuid):
ls -lh /usr/bin/sudo
-rwsr-xr-x 1 root root 152K ... /usr/bin/sudo
4 删除文件名以 - 开头的文件
rm -f -- -fileName
cat -- -fileName
-- 告诉命令停止解析选项,后面全是文件名。
阅读 —
·
全站 —