《系统管理技巧:免密 sudo 与端口查找》

《系统管理技巧:免密 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

-- 告诉命令停止解析选项,后面全是文件名。

阅读 — · 全站 —
🎸 我的歌单 0 首