
我需要運行 ssh sudo 命令。
命令如下:
ssh -i keyfile [email protected] 'sh -v /opt/dir/script'
該腳本包含以下內容:
sudo -E node some.js
我使用 -E 參數的原因是該命令正在由 userA 運行和正在啟動的進程需要載入定義
/user/userA/.bashrc
上面的命令不會載入定義的變數
/user/userA/.bashrc
它實際上正在運行,就好像 -E 沒有做任何事情一樣。即所有變數顯示為未定義。
如果我以 userA 身份互動式登入遠端電腦並執行相同的命令,即
sudo -E node some.js
變數已正確加載,我看到了預期的行為。
誰能看見我需要做些什麼不同的事?
答案1
您期望 shell 為 source ~/.bashrc
,所以我假設 shell 是 Bash 。
第 1 點:SSH 伺服器將 shell 程式碼傳遞給非互動式 shell。非互動式 Bash才不是讀~/.bashrc
。
第 2 個扭曲:Bash 嘗試確定它何時在其標準輸入連接到網路連接的情況下運行,就像由 SSH 伺服器執行時一樣。如果 bash 確定它正在以這種方式運行,那麼它做讀取並執行命令~/.bashrc
。
第三個變更:在許多發行版(包括 Ubuntu)中,預設(骨架)~/.bashrc
以程式碼開始,如果 shell 是非互動式的,則傳回該程式碼。實際上文件的其餘部分是沒有來源。
我想在你的情況下相關的環境變數是在這段程式碼之後定義的。程式碼可能如下所示:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
一個簡單的解決方案是移動作業,以便它們前這段程式碼。如果您想移動執行更多操作的命令(例如執行echo
某些操作、執行某些操作),請務必小心,因為您可能會中斷遠端檔案傳輸。讀為什麼要bashrc
檢查目前shell是否是互動的?如果它只是關於變數那麼你應該是安全的。
環境一般應定義在~/.profile
而不是 in ~/.bashrc
,但如果您將作業移至 ,~/.profile
那麼您會遇到以下情況:~/.profile
使用 SSH 時未載入。那麼讓他們進來也不是沒有道理的~/.bashrc
。
或者,您可以將它們放在單獨的文件中,例如,並從或或其他地方~/.special_env
獲取文件。優點是您可以按需獲取文件,無論出現什麼怪癖和曲折:~/.bashrc
~/.profile
ssh -i keyfile [email protected] '. ~/.special_env; sh -v /opt/dir/script'