文章插图
来源 | 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 命令,来执行命令的,可以直接使用管道,或者将标准输出重定向到文件的方法取得执行命令返回的结果 。
文章插图
使用 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 上使用
为此,我就翻阅了一个很火的 Github 项目:awesome-python-cn (
推荐阅读
- python+C、C++混合编程的应用
- 让腾讯大佬告诉你,写python到底用什么IDE合适
- 你能用到的pyhon库都在这里了,值得收藏
- 12道常见Python面试题,你能答对几个?
- 6个好用的网络监视工具,值得收藏
- 鼠标为什么在鼠标垫上才好用?
- 蒸茶壶使用方法,紫砂壶使用方法
- 蒋蓉紫砂壶,浅论生态茶园旅游资源的开发与应用
- 多合一小程序:小程序如何解决“用完即走,再也不来”
- 使用场景模糊 搭配PS图层混合模式 快速打造夜景照片光斑效果