如何避免被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(比如su
或sudo -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的手册页中找到更多详细信息。