2013-02-12 44 views
6

Có ai biết cách tạo biến môi trường đã đăng ký cho exec_command cuộc gọi khi sử dụng SSHClient không?đặt biến phiên cho phiên paramiko

Tôi đang sử dụng tập lệnh cơ bản để khởi tạo lớp SSHClient, kết nối với máy tính khác bằng phương thức kết nối, sau đó gửi lệnh bằng phương thức exec_command. Tuy nhiên, không có biến môi trường nào dường như được đăng ký khi tôi cố gắng ra lệnh. Tôi có thể làm những việc cơ bản như 'ls' và xem stdout, nhưng khi cố gắng chạy các chương trình đã cài đặt, thực tế là các biến môi trường bị thiếu làm cho nó không thể chạy chúng. Sử dụng ssh trong dòng lệnh để thực hiện điều tương tự, vì các biến môi trường cho người dùng được thiết lập.

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

Lưu ý: Tôi không thể thay đổi thư mục của mình bằng paramiko. Tôi đã thêm lệnh cd vào lệnh theo dõi trong một đơn ssh.exec_command('cd /dddd/ddd;ls'). Tôi đã đưa ra ls làm ví dụ nhưng lệnh theo dõi thực sự của tôi là khác nhau.

+0

Bạn đã thử thêm chúng qua ['os.environ'] (http://docs.python.org/2/library/os.html#os.environ) chưa? – mgilson

+0

Tôi đang tìm cách đặt biến 'enz' env: | Làm thế nào để chúng tôi đi về thiết lập biến 'enz' env bằng cách sử dụng 'os.environ', nếu nó không được hỗ trợ trong' paramiko' ?? Cảm ơn. –

Trả lời

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

tất cả đều phù hợp với tôi. Nếu bạn có các biến môi trường đặc biệt, bạn có thể phải đặt chúng trên lời nhắc lệnh từ xa. Có lẽ nó sẽ giúp nếu bạn viết các biến vào một tập tin myENV và sau đó gọi

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

Bạn có cố gắng một cái gì đó như thế?

+1

không hoạt động đối với tôi. Có thể thấy ở đây http://stackoverflow.com/questions/19938993/python-using-env-variables-of-remote-host-with-ssh mẹo là viết nó trong một client.exec_command ('$ PROFILE nguồn' ; CommandToExcecute ') – Mrlenny

1

Bạn có thể làm: client.exec_command(..., get_pty=True).

Điều này sẽ làm cho paramiko phân bổ thiết bị đầu cuối giả, tương tự như ssh.

1

Kể từ khi phát hành 2.1.0 2016/12/09, bạn có thể thêm một môi trường từ điển biến đến 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() 

đầu ra:

ET_HOME 
... 
MILES_APART 

Nhưng tại sao tôi lại chọn LC_TELEPHONE và LC_MEASUREMENT?Bởi vì những người là hai trong số ít những môi trường mà cấu hình ssh host mục tiêu cho phép tôi để thiết lập:

grep AcceptEnv /etc/ssh/sshd_config 

đầu ra:

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 

Nói cách khác, điều này không làm việc:

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

đầu ra:

... 

Như các tài liệu cảnh báo, các biến môi trường đang âm thầm từ chối 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

Nếu bạn không thể kiểm soát cấu hình sshd máy chủ mục tiêu, đặt các biến môi trường vào một tập tin và tìm nguồn cung ứng hoạt động:

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

đầu ra :

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

Tôi không thể tìm đối số môi trường trong exec_command, nó hiển thị trong tài liệu nhưng tôi không thấy nó trong exec_command trong client.py – Cas

Các vấn đề liên quan