怎么在Python中使用ssh远程登陆服务器

  介绍

怎么在Python中使用ssh远程登陆服务器?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

在壳环境中

,美元sshpass  -p  $ {passwd}, ssh  -p  ${港口},-l  $ {user}, -o  StrictHostKeyChecking=no  xx.xx.xx.xx “ls  -l"

然后你会发现,你的输出有很多你并不需要,但是又不去不掉的一些信息(也许有方法,请留言交流),类似这样

主持人:xx.xx.xx。港口,xx: xx
警告:永久添加& # 39;[xx.xx.xx.xx]: xx # 39;(RSA)已知的主机列表。
登录失败:[Errno 1]这个服务器不是rmp平台注册,请确认是否cdn服务器。总4

-rw-r - r - 239根根2018年3月30日admin-openrc

对于直接使用壳命令,来执行命令的,可以直接使用管道,或者将标准输出重定向到文件的方法取得执行命令返回的结果

<强> 1。使用子流程

若是使用Python来做这件事,通常我们会第一时间,想到使用os.popen,操作系统。系统命令,子流程等一些命令执行库来间接获取。

但是据我所知,这些库获取的输出不仅只有标准输出,还包含标准错误(也就是上面那些多余的信息)

所以每次都要对输出进行的数据清洗,然后整理格式化,才能得到我们想要的数据。

用子流程举个例子,就像这样子

import 子流程   时间=ssh_cmd “sshpass  -p  $ {passwd}, ssh  -p  22, -l  root  -o  StrictHostKeyChecking=no  xx.xx.xx.xx  & # 39; ls  - l # 39;“   状态,output =, subprocess.getstatusoutput (ssh_cmd)      #,数据清理,格式化的就不展示了

通过以上的文字+代码的展示,可以感觉到ssh登陆的几大痛点

<李>

痛点一:需要额外安装sshpass(如果不免密的话)

<李>

痛点二:干扰信息太多,数据清理,格式化相当麻烦

<李>

痛点三:代码实现不够优雅(有点土),可读性太差

<李>

痛点四:ssh连接不能复用,一次连接仅能执行一次

<李>

痛点五:代码无法全平台,仅能在Linux和OSX上使用

为了解决这几个问题,我搜索了全网关于Python ssh的文章,没有看到有完整介绍这方面的技巧的。

为此,我就翻阅了一个很火的Github项目:awesome-python-cn (https://github.com/BingmingWong/awesome-python-cn)。

期望在这里,找到有一些关于远程连接的一些好用的库。

还真的被我找到了两个

<李>

sh.ssh

<李>

Paramiko

<强> 2。使用sh.ssh

首先来介绍第一个,<代码> sh。ssh

<代码> sh> ,美元python3  -m  pip  install  sh

今天只介绍它其中的一个函数:<代码> ssh

通常两台机器互访,为了方便,可设置免密登陆,这样就不需要输入密码。

这段代码可以实现免密登陆,并执行我们的命令ls - l <代码>

得到sh  import  ssh   输出=ssh (“root@xx.xx.xx.xx",,“-p  22,,,“ls  -l")   打印(输出)

但有可能,我们并不想设置互信免密,为了使这段代码更通用,我假定我们没有设置免密,只能使用密码进行登陆。

问题就来了,要输入密码,必须得使用交互式的方法来输入呀,在Python中要如何实现呢?

原来ssh方法接收一个<代码>找到>

这就好办了呀。

我只要识别到有<代码>密码:>

完整代码如下:

import 系统   得到sh  import  ssh      aggregated =,““   def  ssh_interact (char, stdin):   global 聚合   ,sys.stdout.write (char.encode ())   ,sys.stdout.flush ()   aggregated  +=, char   ,if  aggregated.endswith(“密码:,“):   stdin.put才能(“you_password \ n")      输出=ssh (“root@xx.xx.xx.xx",,“-p  22,,,“ls  -l", _tty_in=True,, _out_bufsize=0,,没找到=ssh_interact)   打印(输出)

怎么在Python中使用ssh远程登陆服务器