Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Python子进程的SSH密码_Python_Ssh - Fatal编程技术网

通过Python子进程的SSH密码

通过Python子进程的SSH密码,python,ssh,Python,Ssh,我正在编写一个GUI程序,以生成和监视一组用户的SSH隧道,这些用户因过于害怕而无法使用命令行 不幸的是,所涉及的服务器非常严格。通过RSA SecurID令牌进行双因素身份验证是官方认可的唯一打开SSH连接的方法。不允许使用无密码RSA公钥/私钥身份验证 因此,我的程序需要从文本输入框中读取密码并将其发送到子SSH进程。不幸的是,ssh竭尽全力确保密码只来自真正的键盘 我强烈建议不要使用第三方模块。我知道paramiko和pexpect(它们都是针对类似问题提出的可能解决方案),但试图向我的用

我正在编写一个GUI程序,以生成和监视一组用户的SSH隧道,这些用户因过于害怕而无法使用命令行

不幸的是,所涉及的服务器非常严格。通过RSA SecurID令牌进行双因素身份验证是官方认可的唯一打开SSH连接的方法。不允许使用无密码RSA公钥/私钥身份验证

因此,我的程序需要从文本输入框中读取密码并将其发送到子SSH进程。不幸的是,
ssh
竭尽全力确保密码只来自真正的键盘

我强烈建议不要使用第三方模块。我知道paramiko和pexpect(它们都是针对类似问题提出的可能解决方案),但试图向我的用户解释如何从源代码安装Python模块实在是太令人头痛了

那么:如何仅使用标准的python
子进程
模块向ssh子进程发送密码?有没有办法让子流程误以为我在使用TTY?可以使用SSH_ASKPASS读取我的程序吗


还允许使用其他标准库模块(例如,带有
os
模块的低级命令)。

最后,我能够使用pty模块通过伪终端控制ssh。我在
pexpect
中编写了一个解决方案,然后通过查看pexpect的源代码并得到一些帮助,我能够想出该怎么做。下面是相关代码的摘录(作为对象方法的一部分执行;因此引用了
self


大多数情况下,您可以将模块的源目录从tarball中拉出来,并将其与您自己的脚本一起打包,这样就不需要安装它了。我同意pexpect是完成此任务的工具。您还可以考虑使用PySuthEnter,它将依赖关系(和解释器)捆绑成可执行的形式。我认为您可以通过<代码> SSH-T 和<代码> SSHASASPASS/<代码>获得成功,它似乎是为这样的目的而发明的。您需要使用PtY作为子进程运行它。您可以使用os.openpty()和其他函数“自行滚动”。@mleporty:no,但您可以提供一个与父进程通信的外部二进制文件。糟糕的是,无论我如何尝试,到目前为止我都无法让SSH使用SSH_ASKPASS。
command = [
        '/usr/bin/ssh',
        '{0}@{1}'.format(username, hostname),
        '-L', '{0}:localhost:{1}'.format(local_port, foreign_port),
        '-o', 'NumberOfPasswordPrompts=1',
        'sleep {0}'.format(SLEEP_TIME),
]

# PID = 0 for child, and the PID of the child for the parent    
self.pid, child_fd = pty.fork()

if not self.pid: # Child process
    # Replace child process with our SSH process
    os.execv(command[0], command)

while True:
    output = os.read(child_fd, 1024).strip()
    lower = output.lower()
    # Write the password
    if lower.endswith('password:'):
        os.write(child_fd, self.password_var.get() + '\n')
        break
    elif 'are you sure you want to continue connecting' in lower:
        # Adding key to known_hosts
        os.write(child_fd, 'yes\n')
    elif 'company privacy warning' in lower:
        pass # This is an understood message
    else:
        tkMessageBox.showerror("SSH Connection Failed",
            "Encountered unrecognized message when spawning "
            "the SSH tunnel: '{0}'".format(output))
        self.disconnect()