如何在后台运行需要输入密码的sudo命令?


29

我最近禁用了sudo身份验证缓存功能,因此它现在每次都会提示我输入密码。

尽管这对安全性有好处,但它引起了一个我无法解决的小问题,但我无法运行以下命令:

sudo <command> &

过去,我会在此sudo之前运行命令,它会缓存我的密码,并允许我sudo在接下来的几分钟内运行命令而无需任何提示,因此,它将允许我运行该命令。
但是,当我现在运行它时,由于事先没有缓存,并且它立即启动一个新线程,sudo甚至没有提示我输入密码,因此我无法以这种方式运行它。

因此,除非我先运行sudo -i它,否则无法以这种格式运行命令,这会变得很烦人。
所以我想知道是否有任何方法可以解决这个问题,并且仍然以这种方式运行程序和命令?

我正在运行带有GNOME 3.18的Ubuntu GNOME 15.10,特别是我想以这种方式运行的程序etherape是否有所不同,但是我真的希望该解决方案适用于所有程序和命令。


3
@kossince &并非真正可搜索,我将其更改为… sudo command in the background
muru

@muru如果可以让流行的搜索引擎搜索特殊字符。:P
kos

1
@kos,你会惊讶的。:D
大师

Answers:


56

sudo告诉不要在后台运行,而要在后台sudo运行。来自man sudo

-b, --background
     Run the given command in the background.  Note that it is not
     possible to use shell job control to manipulate background
     processes started by sudo.  Most interactive commands will
     fail to work properly in background mode.

例如:

sudo -b sleep 10

另一种方法是仅使用外壳程序运行命令:

sudo sh -c 'sleep 10 &'

另一种选择是指定用于获取密码的图形程序,并始终发送sudo到后台:

-A, --askpass
     Normally, if sudo requires a password, it will read it from
     the user's terminal.  If the -A (askpass) option is
     specified, a (possibly graphical) helper program is executed
     to read the user's password and output the password to the
     standard output.  If the SUDO_ASKPASS environment variable is
     set, it specifies the path to the helper program.  Otherwise,
     if sudo.conf(5) contains a line specifying the askpass
     program, that value will be used.  For example:

         # Path to askpass helper program
         Path askpass /usr/X11R6/bin/ssh-askpass

     If no askpass program is available, sudo will exit with an
     error.

Askpass程序通常用于SSH。通过所提供的一个例子是ssh-askpass-gnome包,这是默认安装,至少在Ubuntu 15.10。

SUDO_ASKPASS=/usr/bin/ssh-askpass sudo -A sleep 10 &

11

如果您愿意将timestamp_timeout至少设置为0.02(1.2秒,我会说与之一样安全0/etc/sudoers(根据您的情况而定),但使用默认设置或timestamp_timeout设置为除0以下以外的任何设置,可能会执行以下操作) ,您可以在中设置一个类似这样的别名~/.bashrc,它不需要您记住在运行命令之前要做的事情,并且可以让您保持对过程的控制。

alias sudo='sudo -v; [ $? ] && sudo'

这里的窍门是分号,它将使Bash sudo -v首先进行单独解析,从而对用户进行身份验证,并将潜在的后台部分限制为该[ $? ] && sudo命令,该命令将检查命令是否sudo -v成功,然后sudo再次运行(可能将其后台运行)(如果有的话)。

$ alias sudo='sudo -v; [ $? ] && sudo'
$ sudo -H gedit &
[sudo] password for user:
[1] 19966
$ jobs
[1]+  Running                 [ $? ] && sudo -H gedit &

sudo -v即使禁用了缓存,是否还会扩展凭据缓存?而且,IIRC <用于扩展别名,该空格应在命令的末尾而不是开头。
muru

@muru右我忘了他已经timestamp_timeout设置0。是的,我完全搞混了别名扩展,实际上别名不应该扩展。谢谢。
科斯

会不会alias sudo='sudo -v && sudo'一样好?
G-Man说'Resstate Monica''Mar

@ G-Man不行,这是因为;make Bash sudo -v首先且分别进行解析;使用&&Bash既可以解析为单个命令,又可以立即解析为后台。
kos

8

你不能 会&立即将命令发送到后台。即,在后台创建一个子shell,并在其中执行命令。当该命令发出提示时(如的情况)sudo,提示将显示在后台,而您再也看不到它。

唯一的解决方法是将命令带回前台,提供密码,然后将其发送回后台。例如:

$ sudo command &
$ fg
sudo command
[sudo] password for terdon: 

现在,输入您的密码,点击Enter然后点击CtrlZ以将其发送回后台并bg告诉其继续运行。

一种更简单的方法是从不使用&,而是在启动作业时CtrlZbg启动作业后手动将其发送到后台。

最后,您可能需要考虑将sudo的密码超时设置为1或2秒。这样仍然可以为您提供足够的安全性(除非您试图防止Flash出现),并允许您按预期运行类似的命令。


Flash一直在偷我的巧克力蛋糕,所以... ; P

2
在这个感染固件的Adobe漏洞和恶意软件的时代,必须警惕Flash。
Damian Yerrick '16


另外,实际上可以将超时设置为秒吗?man sudoerstimestamp_timeout的值应指定分钟,并带有可能的小数部分(顺便说一句sudo,如果我尝试指定一个,则会出错,不确定原因)。
kos

2
@kos听起来像是的。2.5在这里工作正常(Arch,sudo版本1.8.15)。
terdon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.