#科技一把手#用Python远程登陆服务器的最佳实践

文章图片
在使用Python写一些脚本的时候 , 在某些情况下 , 我们需要频繁登陆远程服务去执行一次命令 , 并返回一些结果 。
在shell环境中 , 我们是这样子做的 。
$sshpass-p${passwd}ssh-p${port}-l${user}-oStrictHostKeyChecking=noxx.xx.xx.xx''ls-l''
然后你会发现 , 你的输出有很多你并不需要 , 但是又不去不掉的一些信息(也许有方法 , 请留言交流) , 类似这样 。
host:xx.xx.xx.xx,port:xxWarning:Permanentlyadded'[xx.xx.xx.xx]:xx'(RSA)tothelistofknownhosts.Loginfailure:[Errno1]Thisserverisnotregisteredtormpplatform,pleaseconfirmwhethercdnserver.total4-rw-r--r--1rootroot239Mar302018admin-openrc
对于直接使用shell命令 , 来执行命令的 , 可以直接使用管道 , 或者将标准输出重定向到文件的方法取得执行命令返回的结果 。

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

文章图片
使用sh.ssh
首先来介绍第一个 , sh.sshsh是一个可以让你通过函数的调用来完成Linxu/OSX系统命令的一个库 , 非常好用 , 关于它有机会也写篇介绍 。
$python3-mpipinstallsh
今天只介绍它其中的一个函数:ssh
通常两台机器互访 , 为了方便 , 可设置免密登陆 , 这样就不需要输入密码 。
这段代码可以实现免密登陆 , 并执行我们的命令ls-l
fromshimportsshoutput=ssh(''root@xx.xx.xx.xx'',''-p22'',''ls-l'')print(output)
但有可能 , 我们并不想设置互信免密 , 为了使这段代码更通用 , 我假定我们没有设置免密 , 只能使用密码进行登陆 。
问题就来了 , 要输入密码 , 必须得使用交互式的方法来输入呀 , 在Python中要如何实现呢?
原来ssh方法接收一个_out参数 , 这个参数可以为一个字符串 , 表示文件路径 , 也可以是一个文件对象(或者类文件对象) , 还可以是一个回调函数 , 意思是当有标准输出时 , 就会调用将输出内容传给这个函数 。
这就好办了呀 。
我只要识别到有password:字样 , 就往标准输入写入我的密码就好了呀 。
推荐阅读
- 「定焦爱科技」3拯救低电量焦虑症,超大电池搭配超快闪充,续航出色的iQOO
- #科技小李#小屏爱好者嗨起来,4.7寸新iPhone确认四月发布,价格是大亮点!,原创
- 中国网科技@撤出液晶面板生产,三星将关闭两座工厂
- #即科技#107国赞同票作废!,想“加入”联合国?中国使用一票否决
- 【腾讯科技】全球应用市场第一季度大爆发:花费达234亿美元创纪录 时长增20%
- 即科技■决定权掌握在中国手,?联合国五常将变六常?此国获美俄一致力挺
- [笔记本电脑]乙辰科技正式发布首款WiFi6新品:北斗II号分布式无线路由器
- 『极速聊科技』目前仅剩10余人,暴风集团:员工持续大量流失
- 【科技生活快报】普京:已与欧佩克和美国就石油价格下跌问题进行讨论
- 「科技小数据」消费信贷的客户呈现出年轻化的趋势,新消费崛起
