Bash

如何從 Bash 以 root 身份登錄並做一些事情

  • May 15, 2015

這是我的簡單 bash:

cat test.sh

#!/bin/bash 
echo "hello"
su - root -c /path/to/script.sh <<EOF
password                              
EOF
whoami
echo "good bye"

但我得到這個錯誤:

./test.sh
hello
su: must be run from a terminal
<current-user>
good bye

(或者)

cat test2.sh
#!/bin/bash 
echo "hello"
sudo su <<EOF
password                              
EOF
whoami
echo "good bye"

又是一個錯誤

(或者)

cat test3.sh
#!/bin/bash 
echo "hello"
su root <<EOF
password                              
EOF
whoami
echo "good bye"

又報錯了……

當我嘗試時:

#!/bin/bash
echo "hello"
sudo -s <<EOF
<password>
echo Now I am root
id                                                                      
echo "yes!"
EOF
whoami
echo "good bye"

然後輸出是:

./script.sh
hello
[sudo] password for <user>:

我還將腳本更改為:

#!/usr/bin/expect -f
spawn sudo -s <<EOF
expect "assword for user:"
send -- "password\r"
expect eof

輸出是:

spawn sudo -s <<EOF
[sudo] password for user:
/bin/bash: <<EOF: command not found

which sh輸出也是/bin/sh

如何解決這三個腳本中的錯誤?

您可以通過管道輸入密碼並將其發送到腳本內的命令中。

echo "password" | sudo -S 

但是在命令行中發送密碼並不是一個好主意。如果您需要有關如何從腳本以 root 身份登錄的更多資訊,可以查看此處提供的答案。

但是,如果是出於實驗目的,我們可以使用 expect 從命令行輸入密碼。腳本需要修改如下。

#!/usr/bin/expect -f 
spawn sudo -s <<EOF 
expect "assword for username:" 
send -- "user-password\r" 
expect eof

需要最後一行,因為我們需要在輸入密碼後按 Enter。正如 Tian 所建議的,在 shell 腳本中發送 root 密碼不是一個好主意。

引用自:https://unix.stackexchange.com/questions/115758