使用Python怎么远程登陆服务器

  介绍

使用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的人并不多,于是我又“追”问了下,期望能得到回复。

使用Python怎么远程登陆服务器

以上这个问题,只有在需要输入密码才会出现,如果设置了机器互信是没有问题的。

为了感受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怎么远程登陆服务器