如上所述,在Mac上使用paramiko 2.7.1,python 3.8.1-在OSX终端中以管理员用户身份使用Catalina 10.15.5:
上周尝试并尝试连接,然后一时兴起尝试使用IP而不是系统名称进行连接。瞧!现在,它会连接并运行一个shell命令。之前只会超时-大概是尝试登录系统。
有问题的系统在我的本地网络上,并且是运行sshd的RPi盒。由于它是本地的,因此名称为“ pisystem.local”。我可以使用Mac ssh并连接到它,我可以按名称ping它,它返回正确的地址,但是尝试使用paramiko连接到'pisystem.local'只是超时。现在,通过VPN连接到我的办公室连接,我可以通过名称连接到另一个也是“ .local”的系统-testsystem.windowsdomain.local-很好。
我无法连接的名称在我的本地路由器DNS中,这是本地网络中DNS解析的“第一线”-即使连接了VPN。 (我也尝试过没有VPN的连接,那里也没有乐趣)。 paramiko显然只是不喜欢解析内部“ .local”名称的方式。
还有其他一些参数可以设置以允许连接到这种类型的DNS连接吗?这是我的“小蛋糕”代码的示例:
import paramiko
import getpass
user = input('Username: ')
pw = getpass.getpass()
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.WarningPolicy())
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#client.connect('pisystem.local', username=user, password=pw, port=22) # does NOT work
client.connect('<internal ipv4 address>', username=user, password=pw, port=22) # WORKS
stdin, stdout, stderr = client.exec_command("ls -l")
lines = stdout.readlines()
print(lines)
好-我找到了一种“解决方法”,但仍然不明白为什么paramiko会解析一个地址,而不解析另一个地址。通过更改以下连接字符串:
client.connect('<internal ipv4 address>', username=user, password=pw, port=22)>
收件人:
client.connect(socket.gethostbyname("pisystem.local"), username=user, password=pw, port=22)
它将立即连接并执行随后传递的任何命令
当paramiko不起作用时,为什么此“修复”有效?