使用sudo命令时,将密码作为参数传入

107

我想使用我的密码作为参数运行sudo,以便我可以在脚本中使用它。我尝试过

sudo -S mypassword execute_command

但是没有任何成功。有什么建议吗?


3
你应该检查脚本是否由“root”用户运行。直接输出密码是不好的,因为它会出现在历史记录中... - kbdjockey
5
正确地配置 sudo,使其不要为某些程序/用户/组询问密码,以避免这种肮脏的黑客攻击,这样会更好。 - rush
5个回答

243
-S开关使sudo从标准输入(STDIN)读取密码。这意味着您可以执行:
echo mypassword | sudo -S command

将密码传递给sudo

然而,其他人提出的建议不涉及将密码作为命令的一部分传递,例如检查用户是否是root,这些建议出于安全原因可能更好。


把它放在一个专用文件夹里,同时给予它和文件夹执行权限,这样怎么样:sudo chmod -R 0100 myScriptFolder?这样不就解决了安全问题(前提是没有人以root身份使用你的计算机)吗? - Brōtsyorfuzthrāx
或者在特定情况下,来自本地网络外部的黑客是否可以看到执行的脚本文本? - Brōtsyorfuzthrāx
这个在我的OSX上非常好用!非常感谢分享解决方案! - Wulf
我在 Dockerfile 中尝试了这个,但是它没有起作用。有什么建议吗? - timebandit
我使用NodeJS(TypeScript)编写了以下代码@timebandit:const child = spawn("sudo", ["-S","-k","echo","Hello"]) child.stderr.on('data', function (data) { console.log('stdErr:', data.toString()); child.stdin.write(password + '\n'); });child.stdout.on('data', (data)=>{ console.log('Received:', data.toString()) }) - Jason Nichols
适用于Ubuntu 2004。如果您想要与sshpass一起使用,您需要对其进行转义。例如: sshpass -p mypassword ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ubuntu@127.0.0.5 'echo mypassword | sudo -S -k whoami' - bronze man

70

您可以设置脚本的 s 位,这样它就不需要 sudo 并作为 root 运行(您也不需要在脚本中编写 root 密码):

sudo chmod +s myscript

+1。这种方法比其他方法更好(而且更安全)。 - Burkhard
1
粘着位是不好的实践,对吧? - kbdjockey
@kbdjockey - +s 是 setuid 位。+t 是 sticky 位。 - Robᵩ
请参考与此回答相关的问题和答案:http://superuser.com/questions/440363/can-i-make-a-script-always-execute-as-root - Brōtsyorfuzthrāx
5
请注意,大多数操作系统会忽略此标记针对解释脚本文件。但是该标记对于二进制文件效果很好。 - Magnar

30
echo -e "YOURPASSWORD\n" | sudo -S yourcommand

当我在命令中使用一个参数时,它就不能正常工作。例如:echo -e "YOURPASSWORD\n" | sudo -S "run -x"。它会提示 sudo: run -x: command not found。你有什么办法解决这个问题吗? - Bee
2
@Bhathiya,不要使用“引号”,例如:echo -e "YOURPASSWORD\n" | sudo -S ls -l /root - matteomattei

4

一种选择是使用sudo命令的-A选项。这将运行一个要求输入密码的程序。不过,你可以编写一个脚本,直接输出密码,以便程序继续执行。


-5
# Make sure only root can run our script
if [ "$(id -u)" != "0" ]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

8
这并没有回答提问者的问题。 - codeforester

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接