用Python远程登陆服务器的最佳实践


用Python远程登陆服务器的最佳实践

文章插图
来源 | Python编程时光(ID: Cool-Python)
在使用 Python 写一些脚本的时候,在某些情况下,我们需要频繁登陆远程服务去执行一次命令,并返回一些结果 。
在 shell 环境中,我们是这样子做的 。
$ sshpass -p ${passwd} ssh -p ${port} -l ${user} -o StrictHostKeyChecking=no xx.xx.xx.xx "ls -l"然后你会发现,你的输出有很多你并不需要,但是又不去不掉的一些信息(也许有方法,请留言交流),类似这样 。
host: xx.xx.xx.xx, port: xxWarning: Permanently added '[xx.xx.xx.xx]:xx' (RSA) to the list of known hosts.Login failure: [Errno 1] This server is not registered to rmp platform, please confirm whether cdn server.total 4-rw-r--r-- 1 root root 239 Mar 30 2018 admin-openrc对于直接使用 shell 命令,来执行命令的,可以直接使用管道,或者将标准输出重定向到文件的方法取得执行命令返回的结果 。
用Python远程登陆服务器的最佳实践

文章插图
 
使用 subprocess若是使用 Python 来做这件事,通常我们会第一时间,想到使用 os.popen,os.system,commands,subprocess 等一些命令执行库来间接获取。
但是据我所知,这些库获取的 output 不仅只有标准输出,还包含标准错误(也就是上面那些多余的信息)
所以每次都要对 output 进行的数据清洗,然后整理格式化,才能得到我们想要的数据 。
用 subprocess 举个例子,就像这样子
import subprocessssh_cmd = "sshpass -p ${passwd} ssh -p 22 -l root -o StrictHostKeyChecking=no xx.xx.xx.xx 'ls -l'"status, output = subprocess.getstatusoutput(ssh_cmd)# 数据清理,格式化的就不展示了<code...>通过以上的文字 + 代码的展示,可以感觉到 ssh 登陆的几大痛点
  • 痛点一:需要额外安装 sshpass(如果不免密的话)
  • 痛点二:干扰信息太多,数据清理、格式化相当麻烦
  • 痛点三:代码实现不够优雅(有点土),可读性太差
  • 痛点四:ssh 连接不能复用,一次连接仅能执行一次
  • 痛点五:代码无法全平台,仅能在 linux 和 OSX 上使用
为了解决这几个问题,我搜索了全网关于 Python ssh 的文章,没有看到有完整介绍这方面的技巧的 。
为此,我就翻阅了一个很火的 Github 项目:awesome-python-cn (


    推荐阅读