如何避免被 sudo 提示输入密码?

Vad*_*der 92 command-line sudo su

我知道我可以通过su命令成为 root(超级用户),但我必须在输入命令后对其进行授权。有没有一种方法可以成为 root 并在一行中授权(使用密码)

ter*_*don 93

嗯,我唯一能想到的就是

echo 'password' | sudo -S command
Run Code Online (Sandbox Code Playgroud)

-S标志使sudo从标准输入读取密码。如中所述man sudo

-S, --stdin

将提示写入标准错误并从标准输入读取密码,而不是使用终端设备。密码后必须跟一个换行符。

所以,要lssudo特权运行,你会这样做

echo 'password' | sudo -S ls
Run Code Online (Sandbox Code Playgroud)

请注意,如果您的sudo访问令牌处于活动状态,如果您不需要输入密码,因为您最近已经这样做了,这将产生错误。为了解决这个问题,您可以使用-k重置访问令牌:

echo 'password' | sudo -kS ls
Run Code Online (Sandbox Code Playgroud)

我不知道有什么方法可以让您进入实际的 root shell(如susudo -i)。不过,这可能足以满足您的需要。

  • 还应该注意的是,这种方法应该被认为是非常不安全的,因为您的密码写在您的历史记录中,并且其他用户也可以通过进程列表看到。不过,我不确定这对单用户桌面系统有多大影响。 (34认同)
  • 如果您不想将某些内容保存到 bash 历史记录中,请在其前面加上一个空格。这(默认情况下)将停止保存它。 (14认同)
  • 对于阅读此答案的任何人:**请不要这样做**。您不会自动输入密码 - 您_避免_在特定情况下需要密码。就像[另一个答案](http://askubuntu.com/a/470466/329506)说的那样。 (11认同)

Din*_*Din 92

在终端中运行visudo命令来编辑sudoers文件:

sudo visudo
Run Code Online (Sandbox Code Playgroud)

并将以下行添加到sudoers 列表中

username ALL = NOPASSWD : ALL
Run Code Online (Sandbox Code Playgroud)

注:更换用户名与你的真实用户名上面一行。

  • 这似乎是一个巨大的安全风险。我当然不能推荐这种做法。 (11认同)
  • @ElderGeek 为什么?除了冒着让某人坐在你的电脑前做一些 sudo 邪恶的风险之外,添加 `username ALL = NOPASSWD : ALL` 是否还有其他安全隐患? (10认同)
  • 每次忘记将这条线放在 sudoers 中的最后一句都让我很痛苦。把它放在最后。 (9认同)
  • 我认为 jiminikiz 方法在这里是一种更安全、更经过深思熟虑的方法。http://askubuntu.com/questions/192050/how-to-run-sudo-command-with-no-password?noredirect=1&lq=1 (2认同)

小智 30

echo 'password' | sudo -kS ls解决方案有效,但它有一些安全缺陷,其中大部分已在对 terdon 的回答的评论中提到。因此,我想建议一种不同的方法:

如果只需要一个命令,你经常需要执行,例如apt-get upgrade,你可以配置你的系统,使得sudo someCommand要求输入密码。

为此,请运行visudo并输入类似于以下内容的内容:

myusername ALL=(ALL) NOPASSWD: /usr/bin/apt-get upgrade
Run Code Online (Sandbox Code Playgroud)

请注意,如果您输入一个没有参数的命令(例如,upgrade在本例中没有),用户将被允许使用任何参数运行它,因此请谨慎使用。

  • 为了获得额外的安全性:使用此方法授予只读 shell 脚本的权限。这样你就可以只在你需要的上下文中运行你需要的命令。 (3认同)
  • 这似乎是这里最好的答案!谢谢 (2认同)

小智 17

你也可以这样做:

sudo -S <<< "password" command
Run Code Online (Sandbox Code Playgroud)

  • `&lt;&lt;&lt;` 是什么意思? (3认同)

Shi*_*hah 10

您可以增加超时时间,而不是完全删除密码,这样您每天只需输入几次;在终端中,运行:

sudo visudo
Run Code Online (Sandbox Code Playgroud)

在文件末尾,添加以下行以将超时设置为 30 分钟(替换jsmith为您的用户名)。

Defaults:jsmith timestamp_timeout=30
Run Code Online (Sandbox Code Playgroud)

您可以使用任何您想要的号码;-1表示无超时(仅第一次提示),0表示即时超时(每次提示sudo)。默认超时为 5 分钟。