如何在Bash脚本中复用sudo权限,避免多终端运行iftop重复输密码
解决单次sudo密码验证,多终端无密码运行iftop的问题
我来帮你搞定这个痛点——既要只输入一次sudo密码,又不让新打开的终端变成sudo权限,其实核心是利用sudo的凭据缓存机制,再调整一下跨终端的会话共享设置,具体步骤如下:
1. 先调整sudoers配置(关键:让所有终端共享sudo凭据)
默认情况下,sudo的tty_tickets选项是开启的,这意味着每个终端窗口(也就是不同的tty设备)会维护独立的sudo凭据,所以新打开的终端没法复用你之前输入的密码。我们需要给你的用户单独关闭这个选项:
- 一定要用
visudo编辑sudoers文件(避免语法错误导致sudo失效):sudo visudo - 在文件末尾加上这一行(把
your_username换成你实际的用户名):
这个设置只会对你的账号生效,不会影响系统里的其他用户。Defaults:your_username !tty_tickets - 保存退出就行(用vim的话按
Esc,输入:wq回车)。
2. 编写优化后的监控脚本
脚本的思路很简单:先让用户输入一次密码获取sudo凭据,然后逐个打开终端运行iftop——这时候因为凭据已经缓存且跨终端共享,所以每个终端的sudo命令不会再要密码,而且终端本身还是普通用户身份。
下面是适配GNOME终端的示例脚本(如果你用Konsole、Terminator等,替换对应的终端启动命令就行):
#!/bin/bash # 先触发sudo验证,让用户输入一次密码,同时刷新凭据超时时间 sudo -v # 这里改成你要监控的端口列表 MONITOR_PORTS=(80 443 22 3306 8080) # 循环打开终端,每个终端监控一个端口 for PORT in "${MONITOR_PORTS[@]}"; do # GNOME终端用--command指定要运行的命令 gnome-terminal --command="sudo iftop -f 'port $PORT'" # 如果你用Konsole,换成:konsole -e "sudo iftop -f 'port $PORT'" # 用Terminator的话换成:terminator -e "sudo iftop -f 'port $PORT'" # 加个短延迟,避免窗口扎堆打开 sleep 0.5 done
3. 脚本使用方法
- 先给脚本加执行权限:
chmod +x port_monitor.sh - 运行脚本:
运行时只会弹一次sudo密码输入框,之后所有终端都会自动启动iftop监控对应端口,而且终端本身还是你的普通用户身份,完全符合你的需求。./port_monitor.sh
额外优化:延长sudo凭据有效期
如果你的监控时间超过15分钟(sudo默认的凭据超时时间),可以在脚本里加个后台循环,定期刷新sudo凭据,避免中途再次要求输入密码:
# 在sudo -v之后添加这段代码 while true; do sudo -v sleep 60 # 每60秒刷新一次 done & # 记录这个循环的PID,脚本结束时自动杀死它 SUDO_REFRESH_PID=$! trap "kill $SUDO_REFRESH_PID" EXIT
这样就能保证监控期间sudo凭据一直有效,不用再输密码。
内容的提问来源于stack exchange,提问作者The Coordinator
相关产品推荐
相关产品推荐

