当前位置: 首页 > 面试题库 >

Python + SSH密码认证(没有外部库或公共/专用密钥)?

叶嘉颖
2023-03-14
问题内容

因此,我知道您可以Pexpect用来解决问题,但除了Python3随附的库之外,我不想依赖其他库来解决问题。

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

到目前为止,在SO社区的大量帮助下,我已经“靠我自己”了。我有点卡住检查分叉的子伪终端是否完成了它应该执行的操作。意思是我可以告诉SSH是否已完成执行,因为只要该run()功能运行,它就会一直存在。

(只要在run()操作中,我pid_exists将一直返回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还是还有另一种方法?


问题答案:

叹了口气..再有一个Google可以免除所有人的麻烦。

os.waitpid(pid, 0)

如何给子进程一个密码并同时获取标准输出



 类似资料:
  • 2)生成CA证书请求 3)生成自签有效期-10年 4)使用KeyStoreExplorer这样的程序将密钥对(私钥和自签名证书)导入到新的JKS中

  • 我试图使用提供的ssh密钥在远程服务器上运行我的Anable剧本。 我已将以下配置添加到我的清单文件: 我在我的剧本中引用了以下内容: 我使用以下命令运行脚本: 我得到的错误如下: 致命:[server1]:无法访问= 我的在我的库存文件中是错误的还是我称之为错误的?帮助会很好

  • 在之前的案例中,我们的密码都是以明文形式存储在数据库中,明文存储给系统安全带来了极大的风险。本节将演示在摘要认证中,实现对密码进行加密存储。 在 digest-authentication项目的基础上,我们构建了一个digest-password-encode项目。 build.gradle 修改 build.gradle 文件,让我们的digest-password-encode项目成为一个新的

  • 我使用PostgreSQL 9.2并有命令: 此命令具有无需密码连接数据库的能力。我想输入密码。 我的是:

  • 问题内容: 我有一个看起来像这样: 到目前为止,我所有的验证都在模式中进行,我想知道如何通过密码验证来实现这一点。用户在两个字段中输入密码,并且模型应检查它们彼此是否相同。 这种验证是否属于架构?我是这种验证的新手。 我应该如何验证密码? 问题答案: 我最终发现,您可以结合使用 虚拟路径 和 函数来实现此目的(如本要点所示),以达到与密码匹配相同的目的: https //gist.github.c

  • 我希望能够对客户机进行身份验证/授权,以产生/消费某些主题的消息。它们将是我们vpn的一部分(包括aws)。根据我对可用文档的理解,唯一的选择是颁发客户端证书并基于客户端DNS设置ACL?不幸的是,我不能使用我的私人CA(我在linux笔记本电脑上创建的)来创建客户端证书。于是出现了以下问题: null 请开导我:) 提前谢谢marcel