Linux

通過 ssh 執行腳本時環境變數不可用

  • March 25, 2021

假設我有兩個主機:A 和 B,使用者 a 和 b。B 是安裝了 Cygwin 的 Windows 機器,如果這很重要的話。

B 配置為通過 SSH 從 A 訪問而無需密碼(它包含 A 的公共 RCA 密鑰),因此我可以通過以下方式從 A 對其執行命令:

ssh b@B [command]

但是當我嘗試執行需要訪問環境變數的命令時,該命令失敗:

[15:54:08] - a@A - ~
$ ssh b@B 'echo $ANT_HOME'

返回空字元串。

相同的命令,如果直接連接(不是通過 SSH)正確執行:

b@B ~
$ echo $ANT_HOME
/cygdrive/c/PROGRA~1/apache-ant-1.9.0

後者是可能的,因為相關變數是在“bash_profile”中導出的:

export JAVA_HOME="/cygdrive/c/PROGRA~1/Java/jdk1.7.0_45"
export ANT_HOME="/cygdrive/c/PROGRA~1/apache-ant-1.9.0"

但由於某種原因,這不適用於 SSH 案例。


一些可能有用的附加資訊。

主機 B 有 Windows XP + Cygwin。CYGWIN sshd 在 SYSTEM 帳戶下執行。JAVA_HOME 和 ANT_HOME 在 Windows 的“系統”環境變數部分中定義。

當我跑“ $ ssh b@B env" command, it does not print ANT_HOME or JAVA_HOME, but if I include them in sshd_config file, it does. But even then simple command ssh b@B ’echo $ ANT_HOME’ 不像我預期的那樣工作。

請給我一個提示,通過 SSH 執行命令需要做什麼。

從我的伺服器的手冊頁:

  1. 讀取文件 ~/.ssh/environment(如果存在),並允許使用者更改其環境。請參閱 sshd_config(5) 中的 PermitUserEnvironment 選項。

您需要聲明環境變數並允許它們在遠端伺服器位置/etc/ssh/sshd_config,方法是啟用屬性 PermitUserEnvironment asPermitUserEnvironment yes並在 ~/.ssh/environment 中設置您的環境變數。

當您將命令作為 ssh 的參數執行時,該命令由 sshd 直接執行;外殼不涉及。

您可以使用以下內容驗證這一點:

ssh b@B pstree

拉入您的 .bash_profile 的是 shell(在本例中為 bash),並且僅當 shell 被作為登錄 shell 呼叫或使用 –login 選項呼叫 shell 時才會這樣做(參見 bash 手冊頁; 尋找 INVOCATION)。直接執行命令時獲得的環境由登錄時的 sshd 和 PAM 等設置。

因此,如果你想要你的 .bash_profile,你需要在 shell 下執行它,你需要將 shell 作為互動式或登錄 shell 執行,如下所示:

ssh b@B "bash -l -c 'env'"

那應該讓你輸出你想要的。唯一需要注意的是引用很快就會變得棘手。請注意,至少在 Linux 上,

ssh b@B bash -l -c 'env'

不會給你一個登錄外殼(我不知道為什麼)。

引用自:https://serverfault.com/questions/586382