簡體   English   中英

在shell腳本中運行sudo -s

[英]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 teesudo 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM