You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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
    
  • 运行脚本:
    ./port_monitor.sh
    
    运行时只会弹一次sudo密码输入框,之后所有终端都会自动启动iftop监控对应端口,而且终端本身还是你的普通用户身份,完全符合你的需求。

额外优化:延长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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:45:34