2013-02-12 40 views
6

के लिए सेटिंग सत्र चर 0 एसएसएच क्लाइंट का उपयोग करते समय exec_command कॉल के लिए पंजीकृत पर्यावरण चर बनाने के लिए कोई भी जानता है?पैरामीको सत्र

मैं एक मूल स्क्रिप्ट का उपयोग कर रहा हूं जो एसएसएच क्लाइंट क्लास को तुरंत चालू करता है, कनेक्ट विधि का उपयोग कर किसी अन्य कंप्यूटर से कनेक्ट होता है, फिर exec_command विधि का उपयोग करके आदेश भेजता है। हालांकि, जब मैं कमांड जारी करने का प्रयास करता हूं तो पर्यावरण चर में से कोई भी पंजीकृत नहीं होता है। मैं 'एलएस' जैसी बुनियादी चीजें कर सकता हूं और 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.en वातावरण) के माध्यम से जोड़ने का प्रयास किया है? – mgilson

+0

मैं 'TZ' env वैरिएबल को भी सेट करना चाहता हूं: | 'Os.en वातावरण' का उपयोग करके 'TZ' env चर सेट करने के बारे में हम कैसे जाते हैं, अगर यह 'paramiko' में समर्थित नहीं है ?? धन्यवाद। –

उत्तर

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 चाल इसे एक क्लाइंट में लिखना है .exec_command ('स्रोत $ PROFILE ; CommandToExcecute ') – Mrlenny

1

आप कर सकते हैं: client.exec_command(..., get_pty=True)

यह पैरामीको को छद्म टर्मिनल आवंटित करेगा, ssh के समान।

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 चुना

1

रिलीज 2.1.0 2016/12/09 के बाद से, आप एक वातावरण चर शब्दकोश exec_command को जोड़ सकते हैं और एलसी_मेजमेंट?

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() 
क्योंकि उन कुछ वातावरण में से दो हैं लक्ष्य मेजबान के ssh config मुझे स्थापित करने के लिए अनुमति देता है

उत्पादन:

... 

प्रलेखन ने चेतावनी दी है के रूप में, वातावरण चर चुपचाप 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 config नियंत्रित नहीं कर सकते, तो अस्वीकार किए जाते हैं, एक फ़ाइल में वातावरण चर डालने और सोर्सिंग यह काम करता है:

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 में पर्यावरण तर्क नहीं मिल रहा है, यह प्रलेखन में दिखाता है लेकिन मैं इसे exec_command में client.py में नहीं देखता – Cas