如何使用python远程操作linux

在云服务测试中,往往需要我们进入云服务内容进行相关内容的测试。这测试可以使用平台自身的noVNC、外部辅助xshell等工具连接到云服务内部进行测试。
但是在如此反复的测试操作中,就需要用到自动化测试方法去解决这方面的需求。
在python中我们可以通过第三方库paramiko,对linux的云服务器进行操作。
如下命令先行安装

pip3 install paramiko

Paramiko中的几个基础名词:

Channel:是一种类Socket,一种安全的SSH传输通道;
Transport:是一种加密的会话,使用时会同步创建了一个加密的Tunnels(通道),这个Tunnels叫做Channel;
Session:是client与Server保持连接的对象,用connect()/start_client()/start_server()开始会话。

Paramiko的基本使用

SSHClient常用的方法介绍

connect():实现远程服务器的连接与认证,对于该方法只有hostname是必传参数。
常用参数

hostname 连接的目标主机 port=SSH_PORT 指定端口 username=None 验证的用户名 password=None
验证的用户密码 pkey=None 私钥方式用于身份验证 key_filename=None 一个文件名或文件列表,指定私钥文件
timeout=None 可选的tcp连接超时时间 allow_agent=True, 是否允许连接到ssh代理,默认为True 允许
look_for_keys=True 是否在~/.ssh中搜索私钥文件,默认为True 允许 compress=False, 是否打开压缩

set_missing_host_key_policy():设置远程服务器没有在know_hosts文件中记录时的应对策略。目前支持三种策略:
设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,目前支持三种:

AutoAddPolicy
自动添加主机名及主机密钥到本地HostKeys对象,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认
WarningPolicy 用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接
RejectPolicy 自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项
exec_command():在远程服务器执行Linux命令的方法。
open_sftp():在当前ssh会话的基础上创建一个sftp会话。该方法会返回一个SFTPClient对象。

利用SSHClient对象的open_sftp()方法,可以直接返回一个基于当前连接的sftp对象,可以进行文件的上传等操作。

sftp = client.open_sftp()
sftp.put('test.txt','text.txt')

SSHClient常用的方法举例

import paramiko

def sshExeCMD():
# 实例化SSHClient
'''
  创建sshs客户端工具
'''
    client = paramiko.SSHClient()
# 自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接SSH服务端,以用户名和密码进行认证
    client.connect(hostname='192.168.1.105', port=22, username='root', password='123456')

'''
stdin  # 1.标准输入 用于实现交互式命令
stdout # 2.标准输出 保存命令的正常执行结果
stderr # 3.标准错误输出 保存命令的错误信息
'''
# 打开一个Channel并执行命令
    stdin, stdout, stderr = client.exec_command('df -h ')  # stdout 为正确输出,stderr为错误输出,同时是有1个变量有值
# 打印执行结果
    print(stdout.read().decode('utf-8'))
# 关闭SSHClient
    client.close()
    

if __name__ == '__main__':
    sshExeCMD()

paramiko模块实现批量执行命令

import paramiko
import sys

def sshExecCMD(ip, username, password, port=22):
    ssh_client = paramiko.SSHClient()
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh_client.connect(hostname=ip,port=port,username=username,password=password)

    try:
        ssh_client.connect(hostname=ip,port=port,username=username,password=password)
    except Exception as e:
        print("服务器%s连接失败!!!" % ip)
        print(e)
        sys.exit()
    stdin, stdout, stderr = ssh_client.exec_command("dh -hT")
    print(stdout.read().decode("utf-8"))
    ssh_client.close()
if __name__ == '__main__':
    servers = {
        "服务器IP1":{
            "username": "root",
            "password": "123456",
            "port": "22"
        },
        "服务器IP2":{
            "username": "root",
            "password": "123456",
            "port": "22"
        }
    }

    for ip, info in servers.items():
        sshExecCMD(ip=ip,
                   username=info.get("username"),
                   password=info.get("password"),
                   port=info.get("port")
                   )

 

posted @ 2022-06-27 23:35  xiaohaoge  阅读(1038)  评论(0编辑  收藏  举报