2013-02-12 13 views
6

Qualcuno sa come registrare le variabili di ambiente per le chiamate exec_command quando si utilizza SSHClient?impostazione della variabile di sessione per la sessione paramiko

Sto utilizzando uno script di base che crea un'istanza della classe SSHClient, si connette a un altro computer tramite il metodo connect, quindi invia comandi utilizzando il metodo exec_command. Tuttavia, nessuna delle variabili di ambiente sembra essere registrata quando tento di emettere comandi. Posso fare cose basilari come 'ls' e vedere lo stdout, ma quando provo ad eseguire programmi installati, il fatto che manchino le variabili d'ambiente rende impossibile eseguirli. Usare ssh nella riga di comando per fare la stessa cosa funziona, come sono impostate le variabili di ambiente per l'utente.

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

Nota: non riesco a modificare la directory in paramiko. Ho aggiunto il comando cd nel comando followup in un singolo ssh.exec_command('cd /dddd/ddd;ls'). Ho dato come esempio ls ma il mio comando followup è diverso.

+0

Avete provato ad aggiungerli tramite ['os.environ'] (http://docs.python.org/2/library/os.html#os.environ)? – mgilson

+0

Sto cercando di impostare anche la variabile env 'TZ': | Come possiamo impostare la variabile env 'TZ' usando 'os.environ', se non è supportato in' paramiko' ?? Grazie. –

risposta

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

che tutto funziona bene per me. Se si dispone di variabili di ambiente speciali, è possibile che sia necessario impostare sul prompt dei comandi remoto. Forse è utile se si scrivono le variabili in un file myenv e quindi chiamare

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

Forse si è tentato qualcosa di simile?

+1

non funziona per me. Come si può vedere qui http://stackoverflow.com/questions/19938993/python-using-env-variables-of-remote-host-with-ssh il trucco è scriverlo in un client.exec_command ('source $ PROFILE ; CommandToExcecute ') – Mrlenny

1

Si può fare: client.exec_command(..., get_pty=True).

Questo renderà paramiko allocare uno pseudo terminale, simile a ssh.

1

Dalla versione 2.1.0 2016/12/09, è possibile aggiungere un ambiente dizionario variabile al 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() 

uscita:

ET_HOME 
... 
MILES_APART 

Ma perché ho scelto LC_TELEPHONE e LC_MEASUREMENT?Perché questi sono due dei pochi ambienti che ssh configurazione dell'host di destinazione mi permette di impostare:

grep AcceptEnv /etc/ssh/sshd_config 

uscita:

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 

In altre parole, questo non funziona:

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

uscita:

... 

Come la documentazione avverte, le variabili d'ambiente sono in silenzio respinti 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

Se non è possibile controllare sshd config del server di destinazione, mettendo le variabili di ambiente in un file e di sourcing funziona:

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

uscita :

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

Non riesco a trovare l'argomento ambiente in exec_command, viene mostrato nella documentazione ma non lo vedo nel comando exec_command in client.py – Cas

Problemi correlati