python - 使用 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.
任何帮助表示赞赏!
解决方案
if p == "root@example's password: ":
永远不可能是真的;p
是一个subprocess.Popen
对象,而不是一个字符串。
您可以通过从对象的标准输出中读取来获取字符串,但当然,ssh
会在 上打印提示消息tty
,因此您无法轻松地从 Python 中捕获它。
另请注意,如果没有encoding
关键字参数 or text=True
,您将无法发送或接收字符串;您收到的输出将是一个b'...'
无法与常规字符串进行比较的字节字符串。
...但是,即使您设法解决了这些问题,将其从那里带到一个完全工作的交互式 SSH 会话仍然还有很长的路要走。我绝对建议您尝试使用pexpect
Paramiko,而不是自己动手,特别是如果您是 Python 新手。
切线,else: pass
是完全没有必要的;else:
如果您没有任何有用的东西可放入其中,则没有理由首先添加块。并且 As"{}".format(pwd)
是一种非常麻烦的方式来编写可以更容易表示为 的内容pwd
,或者str(pwd)
如果它还不是字符串。
推荐阅读
- reactjs - 如何使用 Google 作为提供者来阻止 React Native Maps 的 Draggable Marker 在 iOS 上禁用 MapView 之外的触摸?
- mongodb - 通过 MongoDB Kafka 连接器使用多个集合
- javascript - 未捕获的语法错误:使用 express 时无法在模块外部使用 import 语句
- java - Mapstruct 接口实现不是在同一个包上创建的
- python - 同时在 discord.py 中运行两个命令
- sql - 从包含大量数据的联接中选择表
- python - 按下按钮时如何播放音频
- reactjs - React + SSR:处理需要先获取数据的组件的正确方法
- c++ - 允许使用 fPIC 在共享库中内联
- python - 如何使用新行功能格式化带有变量的字符串