2013-02-12 25 views
6

Kann jemand Umgebungsvariablen für exec_command Aufrufe registriert, wenn SSHClient verwenden?Einstellung Sitzungsvariable für paramiko Sitzung

Ich verwende ein Basisskript, das die SSHClient-Klasse instanziiert, eine Verbindung mit einem anderen Computer herstellt, die connect-Methode verwendet, und Befehle mit der exec_command-Methode sendet. Jedoch scheint keine der Umgebungsvariablen registriert zu sein, wenn ich versuche, Befehle auszugeben. Ich kann grundlegende Dinge wie 'ls' tun und sehe das stdout, aber wenn man versucht, installierte Programme auszuführen, macht es die Tatsache, dass die Umgebungsvariablen fehlen, unmöglich, sie auszuführen. Die Verwendung von ssh in der Befehlszeile, um das gleiche zu tun, funktioniert, da die Umgebungsvariablen für den Benutzer gesetzt sind.

#!/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() 

Hinweis: Ich kann mein Verzeichnis in Paramiko nicht ändern. Ich habe den Befehl cd im Folgebefehl in einem einzigen ssh.exec_command('cd /dddd/ddd;ls') angefügt. Ich habe ls als ein Beispiel gegeben, aber mein tatsächlicher Folgebefehl ist anders.

+0

Haben Sie versucht, sie über ['os.environ'] (http://docs.python.org/2/library/os.html#os.environ) hinzuzufügen? – mgilson

+0

Ich möchte auch die 'TZ' env Variable setzen: | Wie können wir die 'TZ' env-Variable mit 'os.environ' einstellen, wenn sie nicht in' paramiko' unterstützt wird? Vielen Dank. –

Antwort

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() 

was alles gut für mich funktioniert. Wenn Sie spezielle Umgebungsvariablen haben, müssen Sie diese möglicherweise an der Remote-Eingabeaufforderung setzen. Vielleicht hilft es, wenn Sie die Variablen in eine myENV Datei schreiben und dann rufen

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

Hast du so etwas versucht?

+1

funktioniert nicht für mich. Wie man hier http://stackoverflow.com/questions/19938993/python-using-env-variables-of-remote-host-with-ssh sieht, besteht der Trick darin, es in einen client.exec_command ('source $ PROFILE ; CommandToExcute ') – Mrlenny

1

Sie können tun: client.exec_command(..., get_pty=True).

Dies wird Paramiko eine Pseudo-Terminal zuweisen, ähnlich wie ssh.

1

Seit dem Release 2.1.0 2016.12.09, können Sie eine Umgebungsvariable Wörterbuch zum hinzufügen 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() 

Ausgang:

ET_HOME 
... 
MILES_APART 

Aber warum wähle ich LC_TELEPHONE und LC_MEASUREMENT?Da die beiden der wenigen Umgebungen sind, dass der SSH-config Ziel-Host ermöglicht es mir auf:

grep AcceptEnv /etc/ssh/sshd_config 

Ausgang:

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 

Mit anderen Worten, funktioniert das nicht:

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

Ausgabe:

... 

Da die Dokumentation warnt, werden die Umgebungsvariablen leise abgelehnt 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

Wenn Sie die Zielservers sshd Config nicht steuern kann, um die Umgebungsvariablen in eine Datei setzen und Sourcing es funktioniert:

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

Ausgang :

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

Ich kann das Umgebungsargument in exec_command nicht finden, es wird in der Dokumentation angezeigt, aber ich sehe es nicht im exec_command in client.py – Cas

Verwandte Themen