怎么在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> 代码是一个可以让你通过函数的调用来完成Linxu/OSX系统命令的一个库,非常好用,关于它有机会也写篇介绍。
,美元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远程登陆服务器