zoukankan      html  css  js  c++  java
  • python3使用paramiko操作远程机器

    目标:有A和B两台机器,希望在机器A上操作B上的脚本
     
    解决方法:使用paramiko实现操作远程机器
     
    1.安装paramiko
     
    安装第三方包【pip3 install paramiko】
     
     
    如果pip访问国外站点总超时,可以使用国内镜像,使用-i指定, --trusted-host pypi.douban.com信任镜像源
    pip3 install paramiko -i http://pypi.douban.com/ --trusted-host pypi.douban.com
     
    pipy国内镜像目前有:
    http://pypi.hustunique.com/  华中理工大学
    http://pypi.sdutlinux.org/  山东理工大学
    http://pypi.mirrors.ustc.edu.cn/  中国科学技术大学
     
     
     
    2.paramiko用法
    参考文档:
     
    第一步:通过账号密码连接
    def connect(host,username,password):
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        try:
            ssh.connect(host,username=username,password=password,allow_agent=True)
            return ssh
        except:
            return None
     
    host为要连接的机器IP,username和password为登录机器的账号密码
     
    第二步:在远程机执行命令(shell命令)
    def exec_commands(conn,cmd):
        stdin,stdout,stderr = conn.exec_command(cmd)
        results=stdout.read()+stderr.read()
        print(results)
        return results
     
    stdin:标准输入
    stdout:标准正确输出
    stderr:标准错误输出
    通过stdout.read()获得对应输出内容
     
    第三步:和远程机器间传递文件
    def ftpssh(frompath,topath,method="get"):
        t = paramiko.Transport(远程机器IP)
        t.connect(username= 远程机器登录用户名, password = 远程机器登录密码)
        sftp = paramiko.SFTPClient.from_transport(t)
        if method == "get":#将远程文件copy到本地
            sftp.get(frompath, topath)
        elif method == "put":#将本地文件copy到远程机器上
            sftp.put(frompath, topath)
        t.close()
     
    method=get,将远程机对应文件下载到本地的路径下
    method=put,将本地文件上传到远程机对应路径下
     
    其他说明:
    1.通过paramiko操作远程机器的python3文件,python3脚本里有读写文件的操作
    明明是python3结果有编码问题,所以改了远程机器脚本,读写文件时强指定编码格式为utf-8
    with open(“文件","w",encoding='utf-8'as f:
     
    2.我通过第二步执行命令,读取不到控制台输出的结果,所以通过将输出结果重定向到本地文件,然后通过远程机器间传递文件来实现把文件放到本地
    这样就直接读取本地文件了
     
    比如:我执行Appium测试脚本,会在控制台输出一些操作结果,我想获得这些结果
    cmd="source ~/.bash_profile;/usr/local/bin/python3 ./test.py >> ./log.txt 2>&1"
    exec_commands(cmd)
    ftpssh(WebmanageConfig.uitestpath + "/testsuit/temptestcaseslist.txt", "./temptestcaseslist.txt")
    3.在执行远程机器的脚本时,发现有些环境变量没有读取到,所有我又在脚本中加载了远程机器的环境变量文件
    source ~/.bash_profile
     
    4.每条远程命令执行都是单独处理的,处理完后都会回到初始目录。
    所以有cd目录的操作,最好把多条语句放到同一条命令里,不同命令使用分号隔开
     
  • 相关阅读:
    1、scala安装和基本语法
    3.12-3.16 Hbase集成hive、sqoop、hue
    3.7-3.9 HBase表属性
    3.4-3.6 依据业务需求分析HBase的表设计
    字符串匹配[原始方法]
    括号匹配[栈]
    13.A={1,2,3,5}和为10的问题
    12.回溯递归
    11.字符串{a,b}的幂集[回溯递归]
    10.N个整数中查找是否相加为K[深度搜索]
  • 原文地址:https://www.cnblogs.com/meitian/p/7019643.html
Copyright © 2011-2022 走看看