2013-07-15 12 views
5

Sono di fronte a un problema che mentre ssh su un'altra macchina, la mia sessione paramiko ssh non vede lo stesso PATH di sistema come quando eseguo manualmente ssh sulla macchina. Ecco il mio codice python:python paramiko ssh session non ottiene il percorso di sistema

cmd = "echo $PATH" 
try: 
    ssh.connect(ip, username=username, password=password) 
except Exception as ex: 
    raise Exception("Failed to connect to %s with credentials username='%s' password='%s' %s" \ 
      % (ip, username, password, ex.message)) 

ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(cmd) 
output = ssh_stdout.read() 

Lo spettacolo di uscita/usr/bin:/bin ma quando ho ssh manualmente alla macchina, ci sono diversi altri percorsi nel percorso di sistema. Per favore aiuto.

risposta

5

Non penso che nessun script di base o di profilo sia stato originato quando si utilizza exec_command(). Forse provare il seguente:

stdin, stdout, stderr = ssh.exec_command("bash -lc 'echo $PATH'") 
my_path = stdout.read().rstrip() 

Se il problema è che si sta tentando di eseguire un comando che è normalmente in PATH, ma non quando si utilizza exec_command(), si è probabilmente meglio chiamare il comando dal suo percorso assoluto (esegui "quale [comando]" quando sei loggato nell'altra macchina normalmente per scoprire di cosa si tratta).

3

È meglio caricare bash_profile prima di eseguire il comando. Altrimenti potresti ottenere un'eccezione 'comando non trovato'.

Ad esempio, scrivere il comando command = 'mysqldump -uu -pp -h1.1.1.1 -P999 table > table.sql' nello scopo del dumping una tabella Mysql

allora devo caricare il bash_profile manualmente prima che il dumping comando digitando . ~/.profile; .~/.bash_profile;.

Esempio

my_command = 'mysqldump -uu -pp -h1.1.1.1 -P999 table > table.sql;' 

pre_command = """ 
. ~/.profile; 
. ~/.bash_profile; 
""" 

command = pre_command + my_command 

stdin, stdout, stderr = ssh.exec_command(command)