当前位置: 首页>>技术教程>>正文


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

, , , ,

问题描述

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

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

sudo <command> &

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

因此,除非我之前运行sudo -i,否则我无法以这种格式运行命令,这种格式变得相当烦人。所以我想知道是否有办法绕过这个并仍然以这种方式运行程序和命令?

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

最佳解决方法

而不是在后台运行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

另一种方法是使用shell来运行命令:

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 &

次佳解决方法

如果您愿意将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 &

第三种解决方法

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

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

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

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

一种更简单的方法是永远不要使用&,而是在启动后用Ctrl Zbg手动将作业发送到后台。

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/6873.html,未经允许,请勿转载。