现在必须对 telnet 或 ssh 进行硬编码,如何自动知道使用的是 ssh 还是 telnet,然后决定使用 ssh 还是 telnet
#!/usr/bin/python
import getpass
import pexpect
import sys
import os
答案1
import socket
import subprocess
ClientSocket = socket.socket()
try:
ClientSocket.connect(("remote_host", 22))
port = 22
except socket.error:
ClientSocket.connect(("remote_host", 23))
port = 23
finally:
command = "sshpass -ppassword ssh -t -t username@remote_host -p {0}".format(port).split()
subprocess.call(command)
ClientSocket.close()
这里我们首先尝试端口 22(SSH)远程主机是否打开,如果打开则跳转到该finally
段,如果引发异常则检查端口 23(远程登录)打开后,转到finally
。在finally
我们使用sshpass
程序的部分(如果没有安装,则需要通过 手动安装sudo apt-get install sshpass
)直接在命令中提供密码,您也可以使用波拉米科这里的 python 模块。
安全问题:您不应以纯文本形式提供您的密码。
答案2
这堆栈溢出问题可能会解决您的问题,只需根据您的需要调整代码即可。例如:
import socket
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
if sck.connect_ex(('some_host_name_or_ip', 23)) == 0:
## Telnet is open do telnet related stuff here
sck.close()
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
if sck.connect_ex(('some_host_name_or_ip', 22)) == 0:
# SSH is open do ssh related stuff here
sck.close()