我正在使用 tkinter 构建桌面应用程序。另外,使用 Paramiko 进行 ssh 连接。该应用程序有一个调用该功能的“连接”按钮
def checkAuth():
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, 22, username=userName, password=password)
这是 tkinter 应用程序中该函数的调用。
"Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\****\AppData\Local\Programs\Python\Python38-32\lib\tkinter\__init__.py", line 1883, in __call__
return self.func(*args)
File "C:/Users/****/PycharmProjects/tracer/tracer.py", line 18, in checkAuth
ssh.connect(host, 22, username=userName, password=password)
File "C:\Users\****\PycharmProjects\tracer\venv\lib\site-packages\paramiko\client.py", line 368, in connect
raise NoValidConnectionsError(errors)
paramiko.ssh_exception.NoValidConnectionsError: [Errno None] Unable to connect to port 22 on 172.16.127.6 or fe80::d99d:ff15:3fc1:482e
connectButton = Button(connect, text="Connect", width=6, command=checkAuth)
但是得到“paramiko.ssh_exception.NoValidConnectionsError: [Errno None] Unable to connect to port 22 on 172.16.127.6”作为输出。”
我可以将此函数作为独立脚本运行,并且连接良好。我可以通过 cmd 和 putty ssh 到主机,没有问题。似乎只有在使用 tkinter 应用程序中的功能时我才会遇到这个问题。
非常感谢所有帮助。
这是我如何通过 ssh 连接到远程计算机的示例:
import tkinter as tk
import os
import paramiko
def setup_ssh_client(host):
print("establishing ssh connection....")
client = paramiko.client.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
home = os.path.expanduser("~")
ret = os.path.exists(os.path.join(home, "somekey.pem"))
if not ret:
print("Unable to locate pem key, upload aborted....")
return None
private_key = paramiko.RSAKey.from_private_key_file(os.path.join(home, "somekey.pem"))
try:
client.connect(hostname=host, username="bob", pkey=private_key)
except Exception as e:
print(e)
print("connected")
stdin, stdout, stderr = client.exec_command('ls')
for line in stdout:
print('... ' + line.strip('\n'))
return client
window = tk.Tk()
connectButton = tk.Button(window, text="Connect", width=6, command=setup_ssh_client)
connectButton.pack()
window.mainloop()
我用 tkinter 尝试过,单击按钮时连接正常。我没有看到与你正在做的事情有太大不同,也许添加 client.load_system_host_keys() 并看看它是否有帮助。只需使用您的用户名和密码而不是私钥进行身份验证,而不是我在示例中所做的事情。