Tôi đang viết một GUI sử dụng các lệnh SSH. Tôi đã cố gắng sử dụng mô-đun subprocess để gọi ssh và thiết lập biến môi trường SSH_ASKPASS để ứng dụng của tôi có thể bật lên một cửa sổ yêu cầu mật khẩu SSH. Tuy nhiên tôi không thể làm cho ssh đọc mật khẩu bằng cách sử dụng lệnh SSH_ASKPASS đã cho: nó luôn nhắc nó trong cửa sổ đầu cuối, bất kể tôi đặt các biến môi trường DISPLAY, SSH_ASKPASS, TERM như thế nào hoặc cách đầu vào/đầu ra tiêu chuẩn. Làm thế nào tôi có thể chắc chắn rằng ssh được tách ra khỏi TTY hiện tại và sử dụng chương trình đã cho để đọc mật khẩu?Làm thế nào để gọi ssh bằng mô-đun subprocess để nó sử dụng biến SSH_ASKPASS
mã kiểm tra của tôi là:
#!/usr/bin/env python
import os
import subprocess
env = dict(os.environ)
env['DISPLAY'] = ':9999' # Fake value (trying in OS X and Windows)
del env['TERM']
env['SSH_ASKPASS'] = '/opt/local/libexec/git-core/git-gui--askpass'
p = subprocess.Popen(['ssh', '-T', '-v', '[email protected]'],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
env=env
)
p.communicate()
SSH sẽ luôn nhắc bạn trong tiến trình con gọi nó, vì vậy những gì bạn cần làm là cho 'Popen()' gửi mật khẩu bằng cách sử dụng 'p.stdin.write() 'hoặc đơn giản hóa toàn bộ điều damn và sử dụng một cái gì đó cho tương tác SSH đã được viết cho bạn như Paramiko. – jathanism
Cảm ơn câu trả lời. Tôi đã thử gửi mật khẩu bằng cách sử dụng p.stdin.write() và p.communicate(), buth ssh vẫn sử dụng TTY thực để đọc mật khẩu ... Và một vấn đề khác là nó không dễ phát hiện khi SSH yêu cầu mật khẩu (nó có thể làm điều đó với các chuỗi khác nhau, có thể xuất hiện sau trong phiên SSH, v.v.) – gyim
Thấy rằng bạn sẵn sàng 'viết' mật khẩu cho quy trình SSH, tôi đã cập nhật câu trả lời của mình với tùy chọn để sử dụng 'pexcpet', mà sẽ làm việc cho điều đó. – abyx