如何在 bash 脚本中为一系列命令重用 sudo

The*_*tor 5 sudo shell-script

我有脚本可以打开几个终端窗口运行iftop以观察各种端口活动。

打开的每个终端都要求我输入 sudo 密码……考虑到总共有 5 个终端,这有点痛苦。

所以我的问题是,如何输入 sudo 密码一次并让所有窗口都使用该权限运行,而不是在每个窗口中输入?

#!/bin/bash

TITLE="${USER}@${HOSTNAME}"' iftop (h=help, L=lin/log scales, t=line display mode, T=line totals, p=port display)'
gnome-terminal --title "$TITLE" -e 'sh -c "sudo iftop -P -f \"port 22\""' --hide-menubar --zoom=0.85

TITLE="${USER}@${HOSTNAME}"' iftop (h=help, L=lin/log scales, t=line display mode, T=line totals, p=port display)'
gnome-terminal --title "$TITLE" -e 'sh -c "sudo iftop -P -f \"port 33 or port 44\""' --hide-menubar --zoom=0.85

TITLE="${USER}@${HOSTNAME}"' iftop (h=help, L=lin/log scales, t=line display mode, T=line totals, p=port display)'
gnome-terminal --title "$TITLE" -e 'sh -c "sudo iftop -P -f \"(port 55) or (port 66)\""' --hide-menubar --zoom=0.85 
Run Code Online (Sandbox Code Playgroud)

我确实尝试运行整个脚本sudo,这导致打开的所有终端也都是 sudo 终端。我需要的是一个运行的普通终端sudo iftop

cas*_*cas 6

timestamp_type/etc/sudoers/etc/sudoers.d/*设置为ttyppidtty根据sudo的手册页是默认值:

timestamp_type -sudoers使用每个用户的时间戳文件进行凭据缓存。该timestamp_type选项可用于指定使用的时间戳记录的类型。它有以下可能的值:

global单个时间戳记录用于所有用户的登录会话,而不管终端或父进程 ID。附加记录用于sudo在管道中多次使用时序列化密码提示 ,但这不会影响身份验证。

ppid单个时间戳记录用于具有相同父进程 ID(通常是 shell)的所有进程。从同一个 shell(或其他常见的父进程)运行的命令在timestamp_timeout几分钟内不需要密码(默认为15)。通过 sudo 使用不同父进程 ID 运行的命令(例如来自 shell 脚本)将单独进行身份验证。

tty每个终端使用一个时间戳记录,这意味着用户的登录会话是单独验证的。如果不存在终端,则行为与 ppid 相同。从同一终端运行的命令在timestamp_timeout几分钟内不需要密码(默认为 15)。

默认值为tty

此设置仅受 1.8.21 或更高版本支持。

如果它设置为ttyppid,那么这可以解释为什么你被要求每次都输入密码。sudo您正在运行的每个命令都在单独的 中执行gnome-terminal,因此是单独的 tty不同的父 PID。

看起来global是唯一允许你想要的设置。


如果这没有帮助,您的timestamp_timeout设置是什么?是否设置为0?默认值应为 15 分钟。

还要检查其他timestamp*设置 ( timestampdir, timestampowner)。如果timestampdir(我的 debian sid 系统上的默认设置是/run/sudo/ts)不存在或不是 rwX timestampowner(默认root),它们可能会导致此问题。

sudo将记录通过syslog一个描述性错误消息如果这些设置导致错误的电子邮件管理员(root)。


另一种选择是进行编辑,/etc/sudoers以便您的用户iftop无需输入密码即可运行。例如

yourusernamehere ALL= NOPASSWD: /usr/sbin/iftop
Run Code Online (Sandbox Code Playgroud)

请参阅如何在没有密码提示的情况下以 root 身份运行特定程序?有关这方面的更多详细信息。