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

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

我有一个脚本可以打开多个正在运行的终端窗口,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 

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

答案1

位于或设置为 或timestamp_type?根据的手册页,是默认值:/etc/sudoers/etc/sudoers.d/*ttyppidttysudo

时间戳类型-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 系统上的默认设置是/运行/sudo/ts) 不存在或不是 rwX timestampowner(默认)。

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


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

yourusernamehere ALL= NOPASSWD: /usr/sbin/iftop

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

相关内容