我在 localhost 上設定了一個 http 服務器,有幾個站點。我想連接到每個站點根檔案夾,就像我過去通過 ssh 在遠程服務器上一樣。因此,我嘗試創建一個 bash 腳本,旨在以用戶“http”身份登錄,將站點根檔案夾作為引數并將 $HOME 更改為站點根檔案夾:
#!/bin/bash
echo "Connecting to $1 as http...";
read -p "Contrase?a: " -s pass;
su - http << EOSU >/dev/null 2>&1
$pass
export HOME="/srv/http/$1";
echo $HOME;
source .bash_profile;
exec $SHELL;
EOFSU
它不起作用,主要是因為:
echo $HOME不斷給出啟動腳本的用戶的主檔案夾。- 當腳本結束時,它結束(很明顯),但我希望它保持打開狀態,所以我可以為用戶“http”建立一個終端會話并繼續輸入命令。
換句話說,我正在尋找一個可以為我節省 3 個命令的腳本:
# su - http
# cd <site_root_folder>
# export HOME=<site_root_folder>
uj5u.com熱心網友回復:
如果您需要撰寫一些命令的腳本,然后更改為互動式會話,那么pyexpect將是您的最佳解決方案。
這個例子可能會給你一些想法。
uj5u.com熱心網友回復:
您的主要問題是$HOME在用戶運行腳本時被評估,這意味著它將獲得他對$HOME的評估,而不是作為給定用戶評估它。
您可以以給定用戶的身份評估$HOME (使用eval命令),但我不推薦它,使用這種評估通常是不好的做法,尤其是在談論安全性時。
我可以建議您使用標準 linux 工具(如passwd)獲取特定的用戶主目錄
您看到的行為示例:
# expected output is /home/eliott
$ sudo -u eliott echo $HOME
/root
使用passwd解決它:
$ sudo -u eliott echo $(getent passwd eliott | cut -d: -f6)
/home/eliott
uj5u.com熱心網友回復:
這是一種使用動態生成的 bash 初始化檔案的方法:
#!/bin/bash
su http -- --init-file <(cat <<EOF
export HOME=$(printf '%q' "/srv/http/$1")
cd "\$HOME"
. .bash_profile
EOF
)
筆記:
使用 bash 初始化檔案,您必須使用
su http而不是su - http為了在您的背景關系中擴展
$1,您需要使用printf '%q' "$1"由于您不想
$HOME被當前shell擴展,您需要將其撰寫為\$HOMEhere-document
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/449199.html
標籤:重击
上一篇:在包含數字的行之前插入字符
