Python - 带有密码的ssh,不使用非内置模块的外部计算机

时间:2011-10-13 18:40:50

标签: python ssh

在你投票之前,请允许我说我已经在SO上阅读了很多关于这个问题的问题并且没有找到答案。在“Neil”的回答中,这个与我需要的最接近。

What is the simplest way to SSH using Python?

我想找到一种方法,使用ssh登录另一台主机,提供密码,而无需导入非标准的python模块。然后我需要能够使用ssh连接发送多个命令。我需要这样做,因为我需要在很多封闭系统上自动化一些我无法获得新模块的东西(非互联网可访问)。

引用问题的答案是:

  

如果要避免任何额外的模块,可以使用子进程   要运行的模块

     

ssh [host] [command]并捕获输出。

     

尝试类似:

     

process = subprocess.Popen(“ssh example.com ls”,shell = True,       stdout = subprocess.PIPE,stderr = subprocess.STDOUT)输出,stderr = process.communicate()status = process.poll()打印输出要处理   使用用户名和密码,您可以使用子进程进行交互   ssh进程,或者你可以在服务器上安装一个公钥   避免密码提示。

这听起来不错,但我不能完全理解这一点,以便更进一步。有人可以帮助我迈出一步吗?

(1) log in to ssh
(2) provide the password when its prompted
(3) issue an ls command and display the result

如果我可以通过密码输入,我可以完成其余的自动化。

PS:我试过使用expect,但TCL不在系统上,所以请不要告诉我使用它!如果你知道别的东西我可以打电话来帮助python我很乐意尝试它,只要它可能默认构建到Fedora Enterprise Linux系统中。

1 个答案:

答案 0 :(得分:2)

此代码使用Popen.communicate()来运行命令。如Python Library Reference的第17章所述,communic()打开stdin,stdout和stderr的管道,启动子进程,并等待进程终止。其他读者的FYI:startupinfo是在GUI应用程序下运行子进程的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)

结果是一个2元组(stdout,stderr),它应该从字节串转换为字符串。作为“输入”传递的密码应该是一个字节字符串。