2013-07-15 8 views
5

मुझे कोई समस्या नहीं आ रही है क्योंकि मैं किसी अन्य मशीन पर ssh करता हूं, मेरे paramiko ssh सत्र में उसी सिस्टम पाथ को नहीं देखा जाता है जब मैं मैन्युअल रूप से मशीन पर ssh करता हूं।पायथन paramiko ssh सत्र सिस्टम पथ

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

उत्पादन शो/usr/bin: यहाँ मेरी अजगर कोड है/bin लेकिन जब मैं मैन्युअल रूप से मशीन के लिए SSH, वहाँ सिस्टम पथ पर कई अन्य रास्ते हैं। कृपया मदद करें।

उत्तर

5

मुझे नहीं लगता कि जब आप exec_command() का उपयोग करते हैं तो किसी भी bashrc या प्रोफ़ाइल स्क्रिप्ट को सोर्स किया जा रहा है। हो सकता है कि कोशिश निम्नलिखित:

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

तो समस्या यह है कि आप एक कमांड अपने पथ में सामान्य रूप से है कि चलाने के लिए कोशिश कर रहे हैं, लेकिन है नहीं है जब आप exec_command() का उपयोग, तो आप शायद बंद आदेश बुला बेहतर कर रहे हैं अपने पूर्ण पथ से (चलाएं "जो [कमांड]" जब आप अन्य मशीन में लॉग इन होते हैं तो आम तौर पर यह पता लगाने के लिए कि क्या है)।

3

आप अपना आदेश चलाने से पहले bash_profile लोड करना बेहतर है। अन्यथा आपको 'कमांड नहीं मिला' अपवाद मिल सकता है।

उदाहरण के लिए, मैं ने MySQL तालिका

तब मैं . ~/.profile; .~/.bash_profile; टाइप करके उस डंपिंग आदेश से पहले मैन्युअल bash_profile लोड करने के लिए है डंपिंग के उद्देश्य में आदेश command = 'mysqldump -uu -pp -h1.1.1.1 -P999 table > table.sql' लिखें।

उदाहरण

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) 
संबंधित मुद्दे