python中windows链接linux执行命令并获取执行状态的问题小结

目录
  • 前言
  • 环境
    • 工具
  • 内容汇总
    • 创建SSHClient
    • 设置链接主机后的策略
    • 链接远程主机
    • 发送命令
    • 获取linux的输出内容
    • 问题总结
    • 解决方式
  • 演示
  • 推送

前言

最新需要做一个小工具,让协作部门能够获取到服务器上的一些资源讯息,因为工具是pyqt写的所以牵扯到用python链接linux的问题,这里记录一下一些碰到的问题

环境

工具

  • pycharm
  • qt designer

  • python3.7
  • pyqt5.15.4
  • paramiko2.12.0

上网搜了很多,发现paramiko实现远程SSH链接非常的方便,作为python的第三方库安装也很方便

pip install paramiko

内容汇总

创建SSHClient

ssh = paramiko.SSHClient()

首先通过paramiko创建SSHClient类,SSHClient类封装了链接SSH和发送命令等方法

设置链接主机后的策略

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

设置在连接到没有已知主机密钥的服务器时使用的策略,有三种情况,一般直接用Auto,会将远程主机的秘钥添加到known_hosts文件中

链接远程主机

ssh.connect(ip, port, username, password)
  • ip:远程主机地址
  • port:端口默认22
  • username:访问主机的用户名
  • password:访问主机的用户密码

通过connect链接

发送命令

cmd = "python /work/tools/build_project.py"
stdin, stdout, stderr = ssh.exec_command(cmd)
  • stdin:输入内容(用来交互)
  • stdout:执行命令linux控制台的输出内容
  • stderr:执行失败后的信息

我们通过exec_command方法在链接成功后向主机发送命令,有三个返回参数

获取linux的输出内容

stdin, stdout, stderr = ssh.exec_command(cmd)
successResult = stdout.read()
errorResult = stdout.read()

可以通过read的方法获取到linux控制台的输出信息

问题总结

在实际运用的时候,碰到了不少问题,如下:

  • 顺序执行多条命令的时候,后边的命令不生效
  • 非瞬时命令执行是,read在第一时间拿不到输出入职

这两个问题在实际运行的时候会造成很大的问题,比如下面的情况:

cd /work
git pull
cd tools
python test.py

同时执行多条命令的时候,因为git pull是一个非瞬时完成的命令,所有后边的命令都没有生效,并且read也拿不到控制台的信息,想了想可以通过延时调用的方式去初始,time.sleep(1),这个样子,但是很不优雅,因为时间是不固定的,这样做也很不保险

解决方式

搜索查找了一下,找到了相关问题的解决方式,在exec_command返回参数stdout内有一个channel类,channel可以内可以接收远端主机的状态,就是exit_status_ready(),当远端主机执行结束后,exit_status_ready()就是true,如此就方便处理了

stdin, stdout, stderr = ssh.exec_command(s_cmd, get_pty=True)
result = ""
while not stdout.channel.exit_status_ready():
    result = result + stdout.readline()
    if stdout.channel.exit_status_ready():
        break

如上述代码所示,在发送命令后,在while循环去判断远端注意执行状态,当执行状态结束时,返还所有接收到的信息

演示

下述为完整代码演示, 为了方便执行多条命令,这里直接调用shell脚本

#!/bin/bash
project_path="/works"
cd $project_path

# 清理
git clean -f
git checkout *
# 拉代码
git pull
cd tools

python build_android.py
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.x.xxx', 22, "root", 123456)

s_cmd = "sh /work/tools/ssh/build_android.sh"

stdin, stdout, stderr = ssh.exec_command(s_cmd, get_pty=True)
result = ""
while not stdout.channel.exit_status_ready():
    result = result + stdout.readline()
    if stdout.channel.exit_status_ready():
        break

print(result)

如上述代码所示,两个脚本的配合,就可以实现多命令的远程调用和回执,另外建议ssh的操作都放到子线程里去处理,这样就不会卡着主线程了

推送

Github

https://github.com/KingSun5

到此这篇关于python中windows链接linux执行命令并获取执行状态的文章就介绍到这了,更多相关python执行linux命令内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python执行Linux系统命令的4种方法

    (1) os.system 仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 复制代码 代码如下: system(command) -> exit_status Execute the command (a string) in a subshell. 如果再命令行下执行,结果直接打印出来 复制代码 代码如下: >>> os.system('ls') 04101419778.CHM   bash      document    media      py-django

  • python脚本内运行linux命令的方法

    本文实例讲述了python脚本内运行linux命令的方法.分享给大家供大家参考.具体实现方法如下: #/usr/bin/env python import subprocess class RunCmd(object): def cmd_run(self, cmd): self.cmd = cmd subprocess.call(self.cmd, shell=True) #Sample usage a = RunCmd() a.cmd_run('ls -l') 希望本文所述对大家的Python

  • Python2.x利用commands模块执行Linux shell命令

    用Python写运维脚本时,经常需要执行linux shell的命令,Python中的commands模块专门用于调用Linux shell命令,并返回状态和结果,下面是commands模块的3个主要函数: 1. commands.getoutput('shell command') 执行shell命令,返回结果(string类型) 复制代码 代码如下: >>> commands.getoutput('pwd') '/home/oracle' 2. commands.getstatus(

  • 在Linux下使用命令行安装Python

    一般的Linux上都有默认的Python版本,CentOS6.5默认的Python版本的2.6.6的,因为工作原因,这里需要用到Python3.6.3的版本,在这里,小编将会一步步的教大家进行再Linux下Python3的安装. 一.安装之前查看自带的Python的版本 二.上传并解压Python3.6.3 三.python安装之前需要一些必要的模块,比如openssl,readline等,如果没有这些模块后来使用会出现一些问题,比如没有openssl则不支持ssl相关的功能,并且pip3在安装

  • Python3 执行Linux Bash命令的方法

    和之前C++执行Linux Bash命令的方法 一样,Python依然支持system调用和popen()函数来执行linux bash命令. 方法一:system调用 #仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 import os os.system('ls') 方法二:popen()函数 import os os.popen('ls').readlines() #这个返回值是一个list 方法三:使用模块 subprocess import subprocess subp

  • Linux下使用python调用top命令获得CPU利用率

    本文定位:想通过python调用top命令获取cpu使用率但暂时没有思路的情况. 如果单纯为了获得cpu的利用率,通过top命令重定向可以轻松实现,命令如下: 复制代码 代码如下: top -bi > cpuHistory.log 或 复制代码 代码如下: top -bi | tee  cpuHistory.log 这个就不解释了,不懂的朋友查询下top的帮助文档.这里要实现的是通过python调用top命令,并获得cpu的利用率信息. 用过popen的朋友很快就能想到类似如下的代码(这个是我第

  • python3模拟实现xshell远程执行liunx命令的方法

    依赖包:pip install paramiko 源码demo: from time import * import paramiko # 定义一个类,表示一台远端linux主机 class Linux(object): # 通过IP, 用户名,密码,超时时间初始化一个远程Linux主机 def __init__(self, ip, username, password, timeout=30): self.ip = ip self.username = username self.passwo

  • 在Linux命令行终端中使用python的简单方法(推荐)

    Linux终端中的操作均是使用命令行来进行的.因此,对于小白来说,熟记几个基本的命令行和使用方法能够较快的在Linux命令行环境中将python用起来. 打开命令行窗口 打开命令行窗口的快捷键如下: Ctrl + Alt + t 关闭名命令行窗口 关闭命令行窗口的快捷键如下: Ctrl + d 进入python环境 在命令行中直接输入python即进入了python的编辑环境.进入环境后最明显的提示是:光标由-$变成>>>. 退出python环境 使用ctrl +d的方式退出python

  • Python下调用Linux的Shell命令的方法

    有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的.那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法: 1. os 模块 1.1. os模块的exec方法族 Python的exec系统方法同Unix的exec系统调用是一致的.这些方法适用于在子进程中调用外部程序的情况,因为外部程序会替换当前进程的代码,不会返回.( 这个看了点 help(os)  --> search "exec" 的相关介绍,但是没

  • python中windows链接linux执行命令并获取执行状态的问题小结

    目录 前言 环境 工具 库 内容汇总 创建SSHClient 设置链接主机后的策略 链接远程主机 发送命令 获取linux的输出内容 问题总结 解决方式 演示 推送 前言 最新需要做一个小工具,让协作部门能够获取到服务器上的一些资源讯息,因为工具是pyqt写的所以牵扯到用python链接linux的问题,这里记录一下一些碰到的问题 环境 工具 pycharm qt designer 库 python3.7 pyqt5.15.4 paramiko2.12.0 上网搜了很多,发现paramiko实现

  • Python远程linux执行命令实现

    1.远程登录到linux上,使用到的模块paramiko #远程登陆操作系统 def ssh(sys_ip,username,password,cmds): try #创建ssh客户端 client = paramiko.SSHClient() #第一次ssh远程时会提示输入yes或者no client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #密码方式远程连接 client.connect(sys_ip, 22, userna

  • Python实现Windows和Linux之间互相传输文件(文件夹)的方法

    项目中需要从Windows系统传输ISO文件到Linux测试系统,然后再Linux测试系统里安装这个ISO文件.所以就需要实现如何把文件从Windows系统传输到Linux系统中. 在项目中使用了pscp.exe这个工具,只要按照pscp.exe的使用说明操作即可.只要进入pscp.exe的安装位置,然后输入pscp即可查看pscp的使用说明. 下面是我机器上的: 使用Python实现也挺简单的,下面的code主要介绍4中情况: 1. windows传输文件到Linux 2. windows传输

  • python中playwright结合pytest执行用例的实现

    目录 安装pytest插件 编写测试用例 忽略 HTTPS 错误和设置自定义视口大小 持久上下文 playwright结合Pytest为您的 Web 应用程序编写端到端的测试. 安装pytest插件 C:\Users\lifeng01>pip install pytest-playwright Collecting pytest-playwright Using cached pytest_playwright-0.2.2-py3-none-any.whl (9.8 kB) Requiremen

  • python在windows和linux下获得本机本地ip地址方法小结

    本文实例总结了python在windows和linux下获得本机本地ip地址方法.分享给大家供大家参考.具体分析如下: python的socket包含了丰富的函数和方法可以获得本机的ip地址信息,socket对象的gethostbyname方法可以根据主机名获得本机ip地址,socket对象的gethostbyname_ex方法可以获得本机所有ip地址列表 第一种方法:通过socket.gethostbyname方法获得 import socket localIP = socket.gethos

  • Linux通过命令仅获取IP地址的方法

    一同事的朋友正在参加笔试,遇到这么一个问题让他帮忙解决,结果同事又找到我帮他搞定.真是感慨:通讯发达在某些方面来说,真不知是不是好事啊!题目大致如下所示,一般我们使用ifconfig查看网卡信息,请问你可以通过什么命令,让其只输出IP地址192.168.42.128 看似简单的问题,实现起来也不是太简单.看看下面的思路吧 [root@DB-Server ~]# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:0C:29:9E:70:0E inet

  • python中parser.add_argument()用法实例(命令行选项、参数和子命令解析器)

    目录 一.argparse介绍 二.argparse使用——代码示例 1.创建一个解析器——创建 ArgumentParser() 对象 2.添加参数——调用 add_argument() 方法添加参数 3.解析参数——使用 parse_args() 解析添加的参数 四.python args parse_args() 报错解决 1.error: the following arguments are required: xxx 五.其他问题汇总(评论小伙伴问的) 1.下划线_和横线-的区别 2

  • Python中列表(List) 的三种遍历(序号和值)方法小结

    目录 列表(List) 的三种遍历(序号和值)方法 Python遍历整个列表 1.深入地研究循环 2.在for循环中执行更多的操作 3.在for循环结束后执行一些操作 列表(List) 的三种遍历(序号和值)方法 if __name__ == '__main__': list = ['html', 'js', 'css', 'python'] for i in list: print(list.index(i), i) # 方法1 print( '遍历列表方法1:') for i in list

  • python中使用sys模板和logging模块获取行号和函数名的方法

    对于python,这几天一直有两个问题在困扰我:1.python中没办法直接取得当前的行号和函数名.这是有人在论坛里提出的问题,底下一群人只是在猜测python为什么不像__file__一样提供__line__和__func__,但是却最终也没有找到解决方案.2.如果一个函数在不知道自己名字的情况下,怎么才能递归调用自己.这是我一个同事问我的,其实也是获取函数名,但是当时也是回答不出来. 但是今晚!所有的问题都有了答案.一切还要从我用python的logging模块说起,logging中的for

  • Python使用windows设置定时执行脚本

    如果你写了一些Python程序,想要在特定的时间进行执行,例如你想让一段爬虫程序在每天的上午10点执行一次,那么我们就可以来使用windows自带的定时任务进行设置.由于Windows系统,无法使用Linux下强大的crontab命令.所以该定时任务也是针对Windo系统的,让我们直接进入主题吧. 一.进入任务计划程序 二.设定定时任务 1.创建基本任务 2.创建基本任务名称和描述 3.选择触发器 4.对选择的触发器设定程序执行的时间 5.选择启动程序 6.选择程序执行依赖的解释器以及程序脚本所

随机推荐