2013-02-12 285 views
6

有誰知道如何使環境變量註冊爲 exec_command調用時使用SSHClient?設置會話變量爲paramiko會話

我正在使用基本腳本實例化SSHClient類,使用connect方法連接到另一臺計算機,然後使用exec_command方法發出命令。但是,當我嘗試發出命令時,似乎沒有任何環境變量被註冊。我可以做'ls'等基本的東西並看到stdout,但是當試圖運行已安裝的程序時,環境變量缺失的事實使得它們無法運行。在命令行中使用ssh執行相同的操作,因爲用戶的環境變量已設置。

#!/usr/bin/python 
import paramiko 

ssh.connect('mymachine',username='myname',password='pass')  
stdin,stdout,stderr=ssh.exec_command('cd /myfolder/path') 
stdin,stdout,stderr=ssh.exec_command('ls') 

.... 

.... 

ssh.close() 

注意:我無法在paramiko中更改我的目錄。我在單個ssh.exec_command('cd /dddd/ddd;ls')後續命令中追加了cd命令。我以ls爲例,但我的實際跟進命令不同。

+0

您是否試過通過['os.environ'](http://docs.python.org/2/library/os.html#os.environ)添加它們? – mgilson 2013-02-12 13:59:04

+0

我正在設置'TZ'env變量以及:我們如何使用'os.environ'設置'TZ'env變量,如果'paramiko'中不支持?謝謝。 – 2014-01-04 20:39:41

回答

1
#!/usr/bin/python 
import paramiko 

client = paramiko.SSHClient() 
client.load_system_host_keys() 
client.set_missing_host_key_policy(paramiko.WarningPolicy) 
client.connect(myhostname, theport, myuser, thepass) 
stdin,stdout,stderr = client.exec_command('cd /tmp;pwd;ls -al') 
#returns your output 
print stdout.read() 

這對我來說都很好。如果你有特殊的環境變量,你可能需要在遠程命令提示符下設置它們。也許,如果你寫的 變量輸入myENV文件,然後調用

stdin,stdout,stderr = client.exec_command('source ./myEnv')

你有沒有嘗試過類似的東西,它可以幫助?

+1

不適用於我。從這裏可以看出http://stackoverflow.com/questions/19938993/python-using-env-variables-of-remote-host-with-ssh竅門是把它寫在一個client.exec_command('source $ PROFILE ; CommandToExcecute') – Mrlenny 2015-08-25 13:43:04

1

您可以:client.exec_command(..., get_pty=True)

這將使paramiko分配一個僞終端,類似於ssh

1

自發布2.1.0 2016年12月9日,你可以可變字典添加一個環境到exec_command

import paramiko 
paramiko.util.log_to_file("paramiko.log") 
ssh = paramiko.SSHClient() 
k = paramiko.RSAKey.from_private_key_file("<private_key_file>") 
ssh.connect(<hostname>,username=<username>,pkey=k) 
env_dict={"LC_TELEPHONE":"ET_HOME","LC_MEASUREMENT":"MILES_APART"} 
stdin , stdout, stderr = ssh.exec_command('echo $LC_TELEPHONE; echo "..."; echo $LC_MEASUREMENT',environment=env_dict) 
print stdout.read() 

輸出:

ET_HOME 
... 
MILES_APART 

但是爲什麼我選擇LC_TELEPHONE和LC_MEASUREMENT?因爲這是兩個爲數不多的環境目標主機的SSH配置可以讓我設置:

grep AcceptEnv /etc/ssh/sshd_config 

輸出:

AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES 
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT 
AcceptEnv LC_IDENTIFICATION LC_ALL 

換句話說,這不起作用:

env_dict={"HELLO":"WORLD","GOODBYE":"CRUEL_WORLD"} 
stdin , stdout, stderr = ssh.exec_command("echo $HELLO; echo '...'; echo $GOODBYE") 
print stdout.read() 

輸出:

... 

隨着文檔警告說,環境變量默默拒絕 http://docs.paramiko.org/en/2.1/api/client.html http://docs.paramiko.org/en/2.1/api/channel.html#paramiko.channel.Channel.set_environment_variable

如果你無法控制目標服務器的sshd的配置,把環境變量到一個文件和採購工作原理:

stdin , stdout, stderr = ssh.exec_command("cat .set_env;source .set_env; echo $HELLO; echo '...'; echo $GOODBYE") 
print stdout.read() 

輸出:

# begin .set_env 
HELLO="WORLD" 
GOODBYE="CRUEL_WORLD" 
# end .set_env 
WORLD 
... 
CRUEL_WORLD 
+0

我無法在exec_command中找到環境參數,它顯示在文檔中,但我沒有在client.py的exec_command中看到它 – Cas 2018-02-06 02:07:30