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

MLS*_*LSC 1 linux bash logging heredoc spawn

这是我简单的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

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

Gra*_*eme 5

做这种事情并不安全或标准做法(实际上很多人认为这很糟糕),在脚本中输入密码确实不是一个好主意.更标准的方法是简单地期望整个脚本以root权限执行,或者只是让脚本提示输入密码.您还可以通过使用NOPASSWD选项允许特定用户在没有密码的情况下通过sudo运行各种命令/etc/suoders.

但是,既然您已了解风险,则可以使用sudo -kSsudo从stdin以下位置读取密码:

sudo -kSs << EOF
password
whoami
echo "Not a good idea to have a password encoded in plain text"
EOF
Run Code Online (Sandbox Code Playgroud)