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

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

嗯,我唯一能想到的是

 echo 'password' | sudo -S command 

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

-S, – stdin

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

所以,要运行具有sudo权限的ls ,你会这样做

 echo 'password' | sudo -S ls 

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

 echo 'password' | sudo -kS ls 

我不知道有什么办法让你进入一个真正的root shell(比如susudo -i )。 这可能足以满足您的需求。

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

 sudo visudo 

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

 username ALL = NOPASSWD : ALL 

注意:将用户名替换为上一行中的真实用户名

echo 'password' | sudo -kS ls echo 'password' | sudo -kS ls解决方案有效,但它有一些安全方面的缺点,其中大部分已经在评论中提到了terdon的答案。 因此,我想提出一个不同的方法:

如果只需要执行一个命令,例如apt-get upgrade ,则可以配置系统,使sudo someCommand不需要密码。

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

 myusername ALL=(ALL) NOPASSWD: /usr/bin/apt-get upgrade 

请注意,如果输入带参数的命令(例如,在此示例中没有upgrade ),则允许用户使用任何参数运行它,因此请小心使用。

你也可以这样做:

 sudo -S <<< "password" command 

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

 sudo visudo 

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

 Defaults:jsmith timestamp_timeout=30 

你可以使用你想要的任何数字; -1表示没有超时(仅在第一次提示时), 0表示即时超时(每次sudo提示)。 默认超时为5分钟。

Vader,从您对原始问题的评论中,您想切换到以超级用户权限运行的交互式shell,对吧?

Sudo有一个特定的参数来请求shell:

 -s [command] The -s (shell) option runs the shell specified by the SHELL environment variable if it is set or the shell as specified in the password database. If a command is specified, it is passed to the shell for execution via the shell's -c option. If no command is specified, an interactive shell is executed. 

这避免了已经提到的安全缺陷,并允许使用以下命令“root”:

 sudo -s 

如果我真的必须运行root shell(在大多数情况下我没有),那么我发现相应地设置shell的HOME环境变量非常有用(反映运行为“root”),这可以做到使用“-H”标志。 所以完整的命令就是

 sudo -s -H 

您可以在sudo的手册页中找到更多详细信息。