首页 > 解决方案 > 推荐在 Python 中与 SSH 会话交互的方法

问题描述

我正在开发一个小 python 程序来加速通过 SSH 管理各种 Raspberry Pi 服务器。这一切都完成了,但只有一件事。与 SSH 会话交互并不是我想要的方式。

我可以与命令交互,但某些命令(特别是 apt full-upgrade)在运行时会询问或可能会询问问题,但它们不起作用。因此,当它到达询问您是否要继续 [Y/n] 的点时,它会倒下。我相信这是因为 apt 无法从标准输入中读取所以中止。

我知道我可以使用 -y 标志运行 apt 命令并绕过问题,但理想情况下我希望能够捕获请求并询问用户输入。我一直在使用 Paramiko 管理我的 SSH 会话,我正在做的是捕获标准输出并将其传递给 find 函数以查找 [Y/n] 之类的内容,如果找到,则将用户重定向到输入提示有效,但因为当 apt 询问它中止的问题时没有标准输入,当我将用户输入发送回 SSH 会话时,我收到一个套接字关闭错误。

我一直在寻找解决这个问题的替代品或方法,但除了看到提到的织物作为 paramiko 的替代品之外,我看不到很多其他选择。有谁知道我可以尝试 paramiko 的任何替代方案。我不认为面料对我有用,因为它基于 paramiko,所以我想我会在那里遇到同样的错误。如果我可以尝试 Paramiko 的其他部分(我一直坚持使用 exec_command),我将不胜感激。我已经尝试过可以工作到一定程度的通道,但我认为保持 SSH 会话打开不是问题,我认为我需要以某种方式保持标准输入对远程机器上的 apt 命令开放/可访问,这样它就不会中止命令.

目前,我必须解决的最佳想法是运行命令,让它可能中止在标准输出中查找相关短语,然后在让用户有机会设置输入并将全部内容传递给之后再次运行命令标准输入?

编辑:

我的程序分步:

  1. 登录到远程主机
  2. 发出命令
  3. 在命令上使用 .find 来检查“sudo”的使用
  4. 如果 sudo 存在,则另外将用户密码与命令一起发送到标准输入
  5. 阅读标准输出以检查在运行命令时要求用户输入时出现的关键字/短语,例如“[Y/n]”
  6. 如果找到关键字,则询问用户他们的输入,然后可以将其发送回标准输入以继续执行命令。

第 5 步和第 6 步是失败并返回套接字关闭错误的地方。在网上看,我认为问题不在于 paramiko 本身,而在于远程主机上运行的命令。就我而言,sudo apt full-upgrade。

当我运行该命令时,它会运行到“你想继续”点自动中止,我相信问题在于当时标准输入中没有任何内容(这就是我要求用户的内容)Apt 自动中止

这是我运行命令的代码部分:

            admin = issue_cmd.find('sudo')

        connect.connect(ip_addr, port, uname, passwd)
        stdin, stdout, stderr = connect.exec_command(issue_cmd, get_pty=True)

        if admin != -1:
            print('Sudo detected. Attempting to elevate privileges...')
            stdin.write(passwd + '\n')
            stdin.flush()
        else:
            continue

        output = stdout.read()
        search = str(output).find('[Y/n]')

        if search != -1:
            resp = input(': ')
            print(resp)
            stdin.write(resp + '\n')
            stdin.flush()
        else:
             pass

        print(stdout.read().decode('utf-8').strip("\n"))
        print(stderr.read().decode('utf-8').strip("\n"))

        connect.close()

这是我看到的错误消息:

OSError: Socket is closed

标签: pythonpython-3.xsshparamiko

解决方案


推荐阅读