Python + SSH密码验证(没有外部库或公钥/私钥)?

时间:2013-12-09 13:52:18

标签: python ssh pty

所以我知道您可以使用Pexpect来解决问题,但我不想依赖其他库来解决除Python3提供的问题之外的问题。

我也知道生成公钥并允许它们在远程主机上是理想的,但这就是我打算使用这个脚本(在正确的位置设置密钥等)。

这是我在SO社区的帮助下获得的“我自己”。 如果分叉的子伪终端完成了它应该执行的操作,我会陷入困境。这意味着我可以判断SSH是否已完成执行,因为只要run()函数正在运行,它就会继续运行。

(我的pid_exists将在run()操作中返回True。如果我快速退出run(),SSH会话将没有足够的时间做它应该做什么)

#!/usr/bin/python

import pty, sys
from subprocess import Popen, PIPE, STDOUT
from time import sleep
from os.path import expanduser, abspath
from os import walk, setsid, fork, waitpid, execv, read, write, kill

def pid_exists(pid):
    """Check whether pid exists in the current process table."""
    if pid < 0:
        return False
    try:
        kill(pid, 0)
    except (OSError, e):
        return e.errno == errno.EPERMRM
    else:
        return True

class ssh():
    def __init__(self, host, execute='echo "done" > /root/testing.txt', user='root', password=b'SuperPassword'):
        self.exec = execute
        self.host = host
        self.user = user
        self.password = password
        self.run()

    def run(self):
        command = [
                '/usr/bin/ssh',
                self.user+'@'+self.host,
                '-o', 'NumberOfPasswordPrompts=1',
                self.exec,
        ]

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

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

        while True:
            output = read(child_fd, 1024).strip()
            print(output)
            lower = output.lower()
            # Write the password
            if b'password:' in lower:
                write(child_fd, self.password + b'\n')
                break
            elif 'are you sure you want to continue connecting' in lower:
                # Adding key to known_hosts
                write(child_fd, b'yes\n')
            elif 'company privacy warning' in lower:
                pass # This is an understood message
            else:
                print('Error:',output)

        sleep(5)
        print(pid_exists(pid))

ssh('10.10.10.1')

我找不到很多(或任何)有关如何获取Python打开并伪造给我的伪伪终端的执行过程的信息。 我可以或者应该参与这里所解释的子流程:https://stackoverflow.com/a/12235442/929999还是有另一种方式?

1 个答案:

答案 0 :(得分:2)

叹息 ..还有一个谷歌可以让所有人免受麻烦。

os.waitpid(pid, 0)

how to give subprocess a password and get stdout at the same time