【问题标题】:using python to ssh fully into server使用 python ssh 完全进入服务器
【发布时间】:2021-11-12 08:04:54
【问题描述】:

我一直在尝试使 ssh 自动进入我的服务器,但是找不到完全自动化该过程的方法。具体来说,绕过这个输入一直很困难: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.

感谢任何帮助!

【问题讨论】:

  • 您可以使用paramiko 通过 ssh 连接使用 python 远程执行命令。会有帮助吗?
  • 也值得一试fabfile.org

标签: python ssh subprocess


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 2015-07-16
    • 2019-04-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多