2008-12-17 50 views
31

Tôi đang cố gắng chạy lệnh tương tác thông qua paramiko. Việc thực hiện cmd cố gắng để nhắc mật khẩu nhưng tôi không biết cách cung cấp mật khẩu thông qua lệnh exec_command của paramiko và thực thi bị treo. Có cách nào để gửi các giá trị cho thiết bị đầu cuối nếu một thực thi cmd dự kiến ​​đầu vào tương tác?Chạy các lệnh tương tác trong Paramiko

ssh = paramiko.SSHClient() 
ssh.connect(server, username=username, password=password) 
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("psql -U factory -d factory -f /tmp/data.sql") 

Có ai biết cách này có thể giải quyết không? Cảm ơn bạn.

+1

Câu hỏi đặt ra là cũ nhưng đối với những người vẫn đến đây thông qua tìm kiếm google tôi muốn cung cấp cho họ this.The chìa khóa là để có được kênh ** của riêng bạn ** [Thực hiện các lệnh tương tác bằng Python thông qua Paramiko Phần 1] (https://www.youtube.com/watch?v=Jc2l- n_GYPI) [Thực hiện các lệnh tương tác bằng Python thông qua Paramiko Phần 2] (https://www.youtube.com/watch?v=lLKdxIu3-A4) Trong hai video này, giải thích cách chạy các lệnh tương tác thông qua paramiko, đặc biệt là video thứ hai là tuyệt vời và có lẽ những gì bạn cần. –

Trả lời

26

Các tàu phân phối paramiko đầy đủ với rất nhiều tốt demos.

Trong thư mục con trình diễn, demo.pyinteractive.py có các ví dụ TTY tương tác đầy đủ có thể sẽ quá mức cần thiết cho trường hợp của bạn.

Trong ví dụ của bạn ở trên ssh_stdin hoạt động như đối tượng tệp chuẩn Python, vì vậy ssh_stdin.write sẽ hoạt động miễn là kênh vẫn mở.

Tôi chưa bao giờ cần ghi vào stdin, nhưng các tài liệu đề xuất rằng kênh sẽ bị đóng ngay sau khi thoát lệnh, vì vậy sử dụng phương thức stdin.write tiêu chuẩn để gửi mật khẩu có thể sẽ không hoạt động. Có các lệnh paramiko mức thấp hơn trên chính bản thân kênh cho phép bạn kiểm soát nhiều hơn - xem phương thức SSHClient.exec_command được triển khai cho tất cả các chi tiết đẫm máu như thế nào.

+1

Và, đối với những người bạn ở đây chỉ muốn xem đầu ra của lệnh có thể là gì, một số mã có thể là: '(stdin, stdout, stderr) = Client.exec_command ('ls -la') in ("\ nstdout là: \ n" + stdout.read() + "\ nstderr là: \ n" + stderr.read()) ' –

+1

' SSHClient.exec_command'Link đã chết – Ludisposed

+1

Cố định liên kết bị hỏng. – scy

3

Tôi không quen thuộc với paramiko, nhưng điều này có thể làm việc:

ssh_stdin.write('input value') 
ssh_stdin.flush() 

Để biết thông tin trên stdin:

http://docs.python.org/library/sys.html?highlight=stdin#sys.stdin

+2

LƯU Ý: Luôn đảm bảo xóa() bất kỳ bộ đệm nào bạn đang viết cho ví dụ này hiển thị chính xác; quên (hoặc không biết) để làm điều này là một nguyên nhân phổ biến cho sự thất vọng. – aculich

5

Bạn cần Pexpect để tận dụng tối đa cả hai thế giới (trình bao bọc mong đợi và ssh).

6

Tôi đã gặp sự cố tương tự khi cố gắng tạo phiên ssh tương tác bằng cách sử dụng ssh, một ngã ba của Paramiko.

tôi đào xung quanh và tìm thấy bài viết này:

http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-different/

Tiếp tục ví dụ của bạn, bạn có thể làm

ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("psql -U factory -d factory -f /tmp/data.sql") 
ssh_stdin.write('password\n') 
ssh_stdin.flush() 
output = ssh_stdout.read() 

Bài báo đi sâu hơn, mô tả một lớp vỏ hoàn toàn tương tác xung quanh exec_command. Tôi thấy điều này dễ sử dụng hơn nhiều so với các ví dụ trong nguồn.

+1

Liên kết bị hỏng: ( –

3
ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect(server_IP,22,username, password) 


stdin, stdout, stderr = ssh.exec_command('/Users/lteue/Downloads/uecontrol-CXC_173_6456-R32A01/uecontrol.sh -host localhost ') 
alldata = "" 
while not stdout.channel.exit_status_ready(): 
    solo_line = ""   
    # Print stdout data when available 
    if stdout.channel.recv_ready(): 
     # Retrieve the first 1024 bytes 
     solo_line = stdout.channel.recv(1024) 
     alldata += solo_line 
    if(cmp(solo_line,'uec> ') ==0): #Change Conditionals to your code here 
    if num_of_input == 0 : 
     data_buffer = ""  
     for cmd in commandList : 
     #print cmd 
     stdin.channel.send(cmd)  # send input commmand 1 
     num_of_input += 1 
    if num_of_input == 1 : 
     stdin.channel.send('q \n')  # send input commmand 2 , in my code is exit the interactive session, the connect will close. 
     num_of_input += 1 
print alldata 
ssh.close()    

Tại sao stdout.read() sẽ treo nếu sử dụng dierectly mà không kiểm tra stdout. channel.recv_ready(): trong khi stdout.channel.exit_status_ready():

Đối với trường hợp của tôi, sau khi chạy lệnh trên máy chủ từ xa, phiên đang đợi người dùng nhập, sau đặt 'q', nó sẽ đóng kết nối. Nhưng trước khi nhập 'q', giá trị thứ tự.read() sẽ đợi EOF, dường như methord này không hoạt động nếu bộ đệm lớn hơn.

  • tôi đã cố gắng stdout.read (1) trong thời gian, nó hoạt động
    tôi đã cố gắng stdout.readline() trong thời gian, nó cũng làm việc.
    stdin, stdout, stderr = ssh.exec_command ('/ Users/lteue/Downloads/uecontrol')
    stdout.read() sẽ treo
+0

Điều này cần được đặt ra một câu hỏi riêng nếu bạn cần câu trả lời (vì đây là câu hỏi cũ) hoặc ít nhất phải là nhận xét về câu hỏi hoặc một trong các câu trả lời. bởi bản thân. – Sharmila

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