如何執行 sudo 命令並載入目前登入使用者的環境變數?

如何執行 sudo 命令並載入目前登入使用者的環境變數?

我需要運行 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'

相關內容