Tôi đang gỡ lỗi một số mã, điều này sẽ dẫn đến việc tôi liên tục đăng nhập/thoát khỏi một số máy chủ sftp bên ngoài. Có ai biết nếu paramiko tự động đóng một phiên ssh/sftp trên máy chủ bên ngoài nếu một ngoại lệ phi paramiko được nêu ra trong mã? Tôi không thể tìm thấy nó trong các tài liệu và như các kết nối phải được thực hiện khá sớm trong mỗi lần lặp tôi không muốn kết thúc với 20 kết nối mở.Có paramiko đóng kết nối ssh trên một ngoại lệ không paramiko
9
A
Trả lời
15
Không, paramiko sẽ không tự động đóng phiên ssh/sftp. Nó không quan trọng nếu ngoại lệ được tạo ra bởi mã paramiko hay cách khác; không có gì trong mã paramiko bắt bất kỳ trường hợp ngoại lệ nào và tự động đóng chúng, vì vậy bạn phải tự làm điều đó.
Bạn có thể đảm bảo rằng nó được đóng lại bằng cách gói nó trong một thử/khối finally như vậy:
client = None
try:
client = SSHClient()
client.load_system_host_keys()
client.connect('ssh.example.com')
stdin, stdout, stderr = client.exec_command('ls -l')
finally:
if client:
client.close()
3
SSHClient() có thể được sử dụng như một nhà quản lý bối cảnh, vì vậy bạn có thể làm
with SSHClient() as ssh:
ssh.connect(...)
ssh.exec_command(...)
và không đóng thủ công.
Các vấn đề liên quan
- 1. SSH - Python với vấn đề paramiko
- 2. paramiko "Unknown Server"
- 3. Tạo nhiều kết nối SSH tại một thời gian sử dụng paramiko
- 4. paramiko chuyển tiếp
- 5. paramiko AuthenticationException vấn đề
- 6. Chuyển tiếp cổng với paramiko
- 7. Tắt đăng nhập paramiko
- 8. paramiko sftp gặp lỗi
- 9. basic paramiko exec_command giúp
- 10. Lệnh ssh chạy dài trong mô-đun paramiko python (và cách kết thúc chúng)
- 11. paramiko Không tương thích ssh peer (không có thuật toán kex được chấp nhận)
- 12. lấy PID từ paramiko
- 13. Timeout trong paramiko (python)
- 14. đặt biến phiên cho phiên paramiko
- 15. Làm thế nào để chuyển một tập tin vào máy chủ ssh trong một kết nối ssh được thực hiện bởi paramiko?
- 16. Có lỗi ngoại lệ "Ngoại lệ trong chủ đề Thread-1 (có thể xuất hiện khi tắt thông dịch viên)" sử dụng Paramiko
- 17. Paramiko có hỗ trợ telnet và ftp không an toàn thay vì chỉ SSH và SFTP không?
- 18. Paramiko: Các khối ống luôn được đọc trên
- 19. 'Đặt' trong SFTP bằng PAramiko
- 20. Thay thế tốt cho paramiko trong python 3 là gì? Hoặc là có một cổng paramiko cho python 3?
- 21. Chạy các lệnh tương tác trong Paramiko
- 22. mô-đun đa xử lý với paramiko
- 23. Làm thế nào để kết nối với máy chủ từ xa với paramiko mà không cần mật khẩu?
- 24. scp sử dụng công việc không hoạt động của paramiko - ssh hoạt động tốt
- 25. paramiko tăng "SFTPError: gói rác nhận được"
- 26. paramiko SSH exec_command (shell script) trả về trước khi hoàn thành
- 27. DataAdapter.Fill() có đóng kết nối khi ngoại lệ được ném không?
- 28. Làm cách nào để lấy mã trả về SSH bằng cách sử dụng Paramiko?
- 29. Tải xuống thư mục đệ quy với Paramiko?
- 30. Kiểm tra xem đường dẫn có tồn tại trên máy chủ từ xa hay không bằng cách sử dụng paramiko
Cảm ơn bạn, vấn đề là tôi đã gỡ lỗi vài nghìn dòng mã (và vẫn đang thêm vào nó). Các ngoại lệ đã không được nâng lên bởi paramiko nhưng nói bởi 'subprocess' hoặc' os' vv khi một cái gì đó đã đi sai ở nơi khác. Tôi đoán rằng tôi có thể đặt một 'client.close()' trong mọi ngoại lệ nhưng điều đó không phải là rất đẹp. – Ben
Nếu bạn đặt các cuộc gọi đến 'subprocess' hoặc' os' bên trong khối 'try' thì khối' finally' sẽ luôn được gọi là không có vấn đề gì tạo ra ngoại lệ. Nếu bạn muốn nó đẹp hơn một chút thì bạn có thể muốn bọc máy khách trong một 'Trình quản lý ngữ cảnh' và sử dụng câu lệnh' with'. http://docs.python.org/reference/datamodel.html#context-managers – aculich
Thưa ông là điểm +1! Không trả lời câu hỏi và có ít điểm đặt mọi thứ riêng lẻ trong một khối 'try ... finally' nếu tất cả cuối cùng đều giống nhau. Nhưng, không có gì sai khi đưa cuộc gọi đến lớp bên trong nên tôi luôn luôn đóng nó một cách rõ ràng. – Ben