首页 > 解决方案 > 使用 python ssh 完全进入服务器

问题描述

我一直在尝试将 ssh'ing 自动化到我的服务器中,但是找不到完全自动化该过程的方法。具体来说,绕过这个输入一直很困难:root@example 的密码:

我的代码:

import subprocess
import time

server_ip = 'server'
pwd = b'password'


p = subprocess.Popen(['ssh', 'root@{}'.format(server_ip)],
                    stdin=subprocess.PIPE,  stdout=subprocess.PIPE)

if p == "root@example's password: ":
    p.communicate(input= "{}".format(pwd))
else:
    time.sleep(2)
    if p == "root@example's password: ":
        p.communicate(input= "{}".format(pwd))
    else:
        pass

它返回什么:

Pseudo-terminal will not be allocated because stdin is not a terminal.
root@example's password: 
user@computer ~ % Permission denied, please try again.
root@example's password: 
Permission denied, please try again.
root@example's password: 
root@example: Permission denied (publickey,password).
I know my code is very scuffed but it is the furthest I've got to getting in and submitting the password entry request.

任何帮助表示赞赏!

标签: pythonsshsubprocess

解决方案


if p == "root@example's password: ":永远不可能是真的;p是一个subprocess.Popen对象,而不是一个字符串。

您可以通过从对象的标准输出中读取来获取字符串,但当然,ssh会在 上打印提示消息tty,因此您无法轻松地从 Python 中捕获它。

另请注意,如果没有encoding关键字参数 or text=True,您将无法发送或接收字符串;您收到的输出将是一个b'...'无法与常规字符串进行比较的字节字符串。

...但是,即使您设法解决了这些问题,将其从那里带到一个完全工作的交互式 SSH 会话仍然还有很长的路要走。我绝对建议您尝试使用pexpectParamiko,而不是自己动手,特别是如果您是 Python 新手。

切线,else: pass是完全没有必要的;else:如果您没有任何有用的东西可放入其中,则没有理由首先添加块。并且 As"{}".format(pwd)是一种非常麻烦的方式来编写可以更容易表示为 的内容pwd,或者str(pwd)如果它还不是字符串。


推荐阅读