我有一个脚本,该脚本打开几个正在运行的终端窗口iftop
以观察各种端口活动。
每个打开的终端都要求我输入sudo密码...考虑到总共有5个终端,这有点麻烦。
所以我的问题是,我如何一次输入sudo password并让所有窗口都使用该权限运行,而不是在每个窗口中都输入它?
#!/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
。
是timestamp_type
在/etc/sudoers
或/etc/sudoers.d/*
设置为tty
或ppid
?tty
是根据sudo
的手册页的默认设置:
timestamp_type -
sudoers
使用每个用户的时间戳文件凭据缓存。该timestamp_type
选项可用于指定所使用的时间戳记记录的类型。它具有以下可能的值:
global
单个时间戳记录用于所有用户的登录会话,而与终端或父进程ID无关。一条附加记录用于sudo
在管道中多次使用时序列化密码提示,但这不会影响身份验证。
ppid
单个时间戳记录用于具有相同父进程ID(通常是shell)的所有进程。从同一外壳(或其他公共父进程)运行的命令在timestamp_timeout
几分钟之内将不需要密码(默认为15)。通过具有不同父进程ID的sudo运行的命令(例如来自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系统上的默认值为/ run / sudo / ts)不存在或者不是timestampowner
(默认root)rwX,它们可能会导致此问题。
sudo
将记录通过syslog一个描述性错误消息和如果这些设置导致错误的电子邮件管理员(root)。
另一种选择是进行编辑,/etc/sudoers
以便您的用户iftop
无需输入密码即可运行。例如
yourusernamehere ALL= NOPASSWD: /usr/sbin/iftop
请参阅如何在没有密码提示的情况下以root用户身份运行特定程序?有关此的更多详细信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句