[英]Run sudo -s inside shell script
我正在嘗試制作一個Shell腳本來安裝和配置稱為logentries的日志集中程序。 他們在其網站上有說明將一些行復制並粘貼到您的命令行中,以完成此過程。 我嘗試將這些確切的bash命令復制並粘貼到Shell腳本中,因此我可以只運行一個腳本,而不用復制並粘貼所有指令。
這是我腳本的內容:
sudo -s
echo "sudod"
tee /etc/yum.repos.d/logentries.repo <<EOF
[logentries]
name=Logentries repo
enabled=1
metadata_expire=1d
baseurl=http://rep.logentries.com/amazonlatest/\$basearch
gpgkey=http://rep.logentries.com/RPM-GPG-KEY-logentries
EOF
yum update
yum install logentries
我在第2行上插入了echo語句,以測試腳本是否達到了這一點,但是當我運行腳本時,甚至沒有輸出該腳本。 我想這意味着我不能像在命令行中那樣僅在腳本內使用sudo -s
。
有誰知道我如何使這些命令行指令在Shell腳本中執行?
我通常檢查EUID,如果不為零,則類似:
if [ $EUID -ne 0 ]; then
exec sudo $0
done
(如果腳本尚未以root身份運行,則基本上將其強制運行。“ exec”位可確保控件不會返回到非root腳本。)
Shell腳本中的每個命令都是獨立運行的。 該腳本是父進程,它將命令作為子進程調用。 因此, sudo -s
創建一個新的進程來打開root shell。 但是,此過程以后無法執行命令。
如果您確實從root shell exit
,則還可以看到正在打印回顯輸出。 發生這種情況的原因是,退出時,根外殼程序的進程將終止。
您可以編寫所有命令,但shell腳本中的sudo -s
除外。 通過chmod +x install_logentries.sh
使它可執行。 並通過sudo install_logentries.sh
執行它
另一種選擇是使用<<將命令作為子進程嵌入命令(如下所示):
#!/bin/bash
sudo -s << SCRIPT
tee /etc/yum.repos.d/logentries.repo <<EOF
[logentries]
name=Logentries repo
enabled=1
metadata_expire=1d
baseurl=http://rep.logentries.com/amazonlatest/\$basearch
gpgkey=http://rep.logentries.com/RPM-GPG-KEY-logentries
EOF
yum update
yum install logentries
SCRIPT
刪除sudo行並將其作為sudo ./script
調用即可為您提供所需的內容。
或者,可以在腳本中使用sudo,方法是為各個命令加上前綴( sudo tee
, sudo yum
)。
嘗試添加“ shebang”行(第一行)來調用bash
,如以下示例所示:(執行which bash
來查找bash
所在的位置,因為它可能不是/bin/bash
)
#!/bin/bash
sudo -s
echo "sudod"
tee /etc/yum.repos.d/logentries.repo <<EOF
[logentries]
name=Logentries repo
enabled=1
metadata_expire=1d
baseurl=http://rep.logentries.com/amazonlatest/\$basearch
gpgkey=http://rep.logentries.com/RPM-GPG-KEY-logentries
EOF
yum update
yum install logentries
注意:在執行sudo -s
輸入密碼時,可能會提示您。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.