使用Python怎么远程登陆服务器?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
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) #,数据清理,格式化的就不展示了 & lt;代码…在
通过以上的文字+代码的展示,可以感觉到ssh登陆的几大痛点
- <李>
痛点一:需要额外安装sshpass(如果不免密的话)
李> <李>痛点二:干扰信息太多,数据清理,格式化相当麻烦
李> <李>痛点三:代码实现不够优雅(有点土),可读性太差
李> <李>痛点四:ssh连接不能复用,一次连接仅能执行一次
李> <李>痛点五:代码无法全平台,仅能在Linux和OSX上使用
李> 2。使用sh.ssh
首先来介绍第一个,sh。ssh
上海是一个可以让你通过函数的调用来完成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) 打印(输出)
这是根据官方文档(http://amoffat.github.io/sh/tutorials/interacting_with_processes.html?突出=ssh)给的一些信息,写的一个演示。
尝试运行后,发现程序会一直在运行中,永远不会返回,不会退出,回调函数也永远不会进入。
通过调试查看源代码,仍然查不到问题所在,于是去Github上搜了下,原来在2017年就已经存在这个问题了,到现在2020年了还没有修复,看来使用sh.ssh的人并不多,于是我又“追”问了下,期望能得到回复。
以上这个问题,只有在需要输入密码才会出现,如果设置了机器互信是没有问题的。
为了感受sh.ssh的使用效果,我设置了机器互信免密,然后使用如下这段代码。
得到sh import ssh my_server=ssh.bake (“root@xx.xx.xx.xx",,“-p 22“) #,相当于执行登陆一次执行一次命令,执行完就退出登陆 print (my_server.ls ()) #,可在,sleep 期间,手动登陆服务器,使用,top ,查看当前有多少终端在连接 time . sleep (5) #,再次执行这条命令时,登陆终端数将,+ 1,执行完后,又将,1 print (my_server.ifconfig ())使用Python怎么远程登陆服务器