如何从 Bash 以 root 身份登录并执行操作

MLS*_*LSC 4 shell bash su sudo here-document

这是我的简单 bash:

cat test.sh

#!/bin/bash 
echo "hello"
su - root -c /path/to/script.sh <<EOF
password                              
EOF
whoami
echo "good bye"
Run Code Online (Sandbox Code Playgroud)

但我收到此错误:

./test.sh
hello
su: must be run from a terminal
<current-user>
good bye
Run Code Online (Sandbox Code Playgroud)

(或者)

cat test2.sh
#!/bin/bash 
echo "hello"
sudo su <<EOF
password                              
EOF
whoami
echo "good bye"
Run Code Online (Sandbox Code Playgroud)

又一个错误

(或者)

cat test3.sh
#!/bin/bash 
echo "hello"
su root <<EOF
password                              
EOF
whoami
echo "good bye"
Run Code Online (Sandbox Code Playgroud)

又是错误...

当我尝试:

#!/bin/bash
echo "hello"
sudo -s <<EOF
<password>
echo Now I am root
id                                                                      
echo "yes!"
EOF
whoami
echo "good bye"
Run Code Online (Sandbox Code Playgroud)

然后输出是:

./script.sh
hello
[sudo] password for <user>:
Run Code Online (Sandbox Code Playgroud)

我还将我的脚本更改为:

#!/usr/bin/expect -f
spawn sudo -s <<EOF
expect "assword for user:"
send -- "password\r"
expect eof
Run Code Online (Sandbox Code Playgroud)

和输出是:

spawn sudo -s <<EOF
[sudo] password for user:
/bin/bash: <<EOF: command not found
Run Code Online (Sandbox Code Playgroud)

同时which sh输出/bin/sh

如何解决这三个脚本中的错误?

Ram*_*esh 5

您可以通过管道输入密码并将其发送到脚本内的命令中。

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

但是在命令行中发送密码并不是一个好主意。如果您需要有关如何从脚本以 root 身份登录的更多信息,可以查看此处提供的答案。

但是,如果是出于实验目的,我们可以使用 expect 从命令行输入密码。脚本需要修改如下。

#!/usr/bin/expect -f 
spawn sudo -s <<EOF 
expect "assword for username:" 
send -- "user-password\r" 
expect eof
Run Code Online (Sandbox Code Playgroud)

需要最后一行,因为我们需要在输入密码后按 Enter。正如 Tian 所建议的,在 shell 脚本中发送 root 密码不是一个好主意。