Python - 使用内置模块通过密码SSH连接远程计算机
在你给这个内容点踩之前,我想说我在Stack Overflow上看了很多关于这个话题的问题,但一直没找到答案。不过,这个问题的回答者“Neil”给出的答案是我找到的最接近我需求的。
我想找到一种方法,通过ssh登录到另一个主机,并提供密码,而不需要导入任何非标准的Python模块。然后我还需要通过这个ssh连接发送多个命令。我需要这样做是因为我需要在很多无法联网的封闭系统上自动化一些操作,无法在这些系统上安装新的模块。
在提到的问题中的答案是:
如果你想避免使用额外的模块,可以使用subprocess模块来运行
ssh [主机] [命令]并捕获输出。
可以尝试这样的代码:
process = subprocess.Popen("ssh example.com ls", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) output, stderr = process.communicate() status = process.poll() print output 如果要处理用户名和密码,可以使用subprocess与ssh进程进行交互,或者你可以在服务器上安装一个公钥,以避免输入密码的提示。
这个听起来不错,但我对这个内容理解得不够深,无法进一步操作。有人能帮我迈出第一步吗?
(1) log in to ssh
(2) provide the password when its prompted
(3) issue an ls command and display the result
如果我能解决密码输入的问题,我就能完成其余的自动化工作。
附言:我试过使用expect,但系统上没有TCL,所以请不要告诉我使用那个!如果你知道其他可以帮助Python的工具,我很乐意尝试,只要它在Fedora Enterprise Linux系统上默认安装就行。
1 个回答
这段代码使用 Popen.communicate() 来执行一个命令。根据 Python 库参考手册第 17 章的描述,communicate() 会为标准输入、标准输出和标准错误打开管道,启动一个子进程,并等待这个进程结束。顺便提一下,startupinfo 是在 Windows 系统中用来在图形界面应用程序下运行子进程的一种方式,这样就不会弹出一个黑色的控制台窗口;如果是在控制台脚本或者 Linux 系统下运行,就不需要这个。
def runcmd(self, prog, args, inputs):
cmd = " ".join((prog, args))
si = subprocess.STARTUPINFO()
si.dwFlags = subprocess.STARTF_USESHOWWINDOW
process = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE, startupinfo=si)
return(process.communicate(input=inputs))
可以这样调用:
p = self.runcmd("c:\Program Files\ApplicationDir\application.exe", "arguments", "inputs")
result = str(p[0],"ascii").strip()
print(result)
返回的结果是一个包含两个部分的元组(stdout, stderr),需要将字节字符串转换成普通字符串。而作为“输入”传递的密码应该是一个字节字符串。