![如何在 bash 脚本中重用 sudo 执行一系列命令](https://linux22.com/image/127473/%E5%A6%82%E4%BD%95%E5%9C%A8%20bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E9%87%8D%E7%94%A8%20sudo%20%E6%89%A7%E8%A1%8C%E4%B8%80%E7%B3%BB%E5%88%97%E5%91%BD%E4%BB%A4.png)
我有一个脚本可以打开多个正在运行的终端窗口,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/*
tty
ppid
tty
sudo
时间戳类型-
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 或更高版本支持此设置。
如果它是设置为tty
或ppid
,这就解释了为什么每次都会要求您输入密码。您正在运行的每个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 身份运行特定程序?有关此的更多详细信息。