2013-04-24 81 views
3

我試圖在Python中檢索遠程Linux服務器的環境變量。或者,如果我可以在我正在執行的命令中使用變量名稱,那也會很好。我所做的電話應該工作,據我所知,但我回來了垃圾。我已經建立了公鑰認證,所以不需要密碼。如何從Python遠程系統中檢索環境變量?

努力1:

devdir = subprocess.check_output(["ssh", connectstring, "echo $DEVDIR"]) 

努力2:

ret = subprocess.check_output(["ssh", connectstring, 
    "$DEVDIR/{0}".format(testpath)]) 

connectstring是用戶@ ip和工作正常。 $DEVDIR是我想要使用的遠程變量幷包含一個路徑。 testpath是我試圖執行的腳本的路徑,根源於$DEVDIR

Effort 1返回「\ n」,Effort 2無法遠程解析$ DEVDIR。


努力3:

import paramiko 
... 
ssh = paramiko.SSHClient() 
ssh.connect(ip, user) # succeeds 
stdin, stdout, stderr = ssh.exec_command("echo $DEVDIR") 

結果:stdout.readlines()= 「\ n」 個

+0

你確定'$ DEVDIR'設置正確嗎?如果它手動登錄,但在執行遠程命令時失敗,我懷疑它只在登錄會話中設置... – glglgl 2013-04-24 16:42:55

+0

@glglgl,也就是它 - $ DEVDIR由.bashrc設置。我會嘗試導出.profile中的變量。 – TravisThomas 2013-04-24 16:46:20

+0

我嘗試導出.profile沒有運氣。我也嘗試執行'ssh.exec_command(「source〜/ .bashrc」)'',接着執行'ssh.exec_command(「echo $ DEVDIR」)'命令並得到相同的結果。 – TravisThomas 2013-04-24 16:51:04

回答

2

如果環境變量設置爲.bashrc,則可以使用-l選項強制遠程命令在登錄shell下運行。以下...

devdir = subprocess.check_output(["ssh", connectstring, "sh -l -c 'echo $DEVDIR'"]) 

...適合我。

-1

嘗試這種情況:

devdir = subprocess.check_output(["ssh -i", connectstring, "echo $DEVDIR", FALSE]) 

這是一個黑客位的,但它應該有所幫助。

+0

不起作用。添加'-i'給出錯誤'OSError:[Errno 2]沒有這樣的文件或目錄,並且添加False(不是'FALSE')給出錯誤TypeError:execv()arg 2只能包含字符串' – TravisThomas 2013-04-24 16:23:29

+0

如果添加參數'-i',它應該作爲單獨的參數完成,而不是添加到命令名中。然後'-i'缺少標識文件名。什麼'FALSE'分別。在這種情況下,「假」應該是有益的,這超出了我的理解。 – glglgl 2013-04-24 16:33:19

1

執行命令va SSH不會產生登錄會話。所以一些變量可能不會被設置。

可以通過用另一個如$HOSTNAME$HOST$SSH_CONNECTION或通過執行env命令代替變量進行檢查。

解決方案可能是將變量賦值放入在非登錄會話中執行的文件中。然而,.bashrc應該沒問題;也許裏面存在缺陷。

+0

你是對的:'ssh.exec_command(「env」)'顯示了一個非常短的環境變量列表,表明.bashrc沒有被加載。 – TravisThomas 2013-04-24 16:56:45

+0

我不認爲這會起作用。在'ssh'手冊中,「如果指定了命令,它將在遠程主機上執行,而不是在登錄shell中執行」,這聽起來好像你甚至沒有shell。 – Aya 2013-04-24 17:14:15

+0

@Aya「改爲」是指「登錄外殼」的「登錄」部分。你得到一個shell,它可以通過線路傳輸完整的命令行。試試'ssh localhost ps $$',看看'$$'如何被轉換成真實的進程ID。因此,通過聯繫主機上的shell可以正常工作。 – glglgl 2013-04-24 17:24:10

相關問題