Python之paramiko模块

1 paramiko介绍

2 通过用户名密码方式远程执行命令
2.1 用户名密码
2.2 补充:批量执行命令

3 通过用户名密码方式上传下载文件
3.1 上传下载文件
3.2 通过用户名批量上传文件

4 通过公钥私钥远程执行命令
5 通过公钥私钥远程上传下载文件
6 通过私钥字符串远程连接服务器
7 生成公钥私钥并上传

1 paramiko介绍

-用于帮助开发者通过代码远程连接服务器,并对服务器进行操作。

pip install paramiko

2 通过用户名密码方式远程执行命令

2.1 用户名密码

import paramiko
 
# 创建SSH对象
ssh = paramiko.SSHClient()
 
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 
# 连接服务器
ssh.connect(hostname='192.168.1.63', port=22, username='root', password='5740##')
 
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df -Th')
 
# 获取命令结果
result = stdout.read()
 
# 关闭连接
ssh.close()
 
print(result.decode('utf-8'))

2.2 补充:批量执行命令

import paramiko
import sys
 
def Ssh_exec_linux(ip, port, usernamme, password):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        ssh.connect(hostname=ip, port=port, username=usernamme, password=password)
    except Exception as e:
        print("服务器%s连接失败!" % ip)
        print(e)
        sys.exit(1)
 
    stdin, stdout, stderr = ssh.exec_command('df -Th')
    print("服务器%s的磁盘使用率如下:" % ip)
    print(stdout.read().decode('utf-8'))  # stdout.read()的结果是bytes,需要解码一下
    ssh.close()
 
 
if __name__ == '__main__':
    servers = {
        '192.168.200.133': {
            'port': '22',
            'username': 'root',
            'password': '5740##'
        },
        '192.168.200.134': {
            'port': '22',
            'username': 'root',
            'password': '5740##'
        },
        '192.168.200.135': {
            'port': '22',
            'username': 'root',
            'password': '5740##'
        },
    }
    for ip, info in servers.items():
        Ssh_exec_linux(ip,
                       info.get('port'),
                       info.get('username'),
                       info.get('password'))

3 通过用户名密码方式上传下载文件

3.1 上传下载文件

import paramiko
 
def sshFile():
    try:
        ssh_conn = paramiko.Transport(('192.168.200.133', 22))
        ssh_conn.connect(username='root', password='5740##')
 
        # 连接sftp客户端
        ftp_client = ssh_conn.open_sftp_client()
 
        # 下载
        source_path = "/root/calico.yaml"
        destination_path = "/Users/sanpangdan/Desktop/zjz_BBS/calico.yaml"  # 指定完整的目标路径,包括文件名
        ftp_client.get(source_path, destination_path)
 
        # 上传
        source_path = "/Users/sanpangdan/Desktop/zjz_BBS/Thumbs.db"
        destination_path = "/root/Thumbs.db"  # 指定完整的目标路径,包括文件名
        ftp_client.put(source_path, destination_path)
 
    except Exception as e:
        print(f"发生错误:{str(e)}")
 
    finally:
        if 'ftp_client' in locals():
            ftp_client.close()
        if 'ssh_conn' in locals():
            ssh_conn.close()
 
if __name__ == '__main__':
    sshFile()

3.2 通过用户名批量上传文件

import paramiko
import os
 
def sshPutFile(ip, port, username, password, localfile, remotedir):
    try:
        # 创建SSH连接
        ssh_conn = paramiko.Transport((ip, port))
        ssh_conn.connect(username=username, password=password)
 
        # 连接SFTP客户端
        ftp_client = ssh_conn.open_sftp_client()
 
        remotedir_file = os.path.join(remotedir, localfile)
        # 上传本地文件到远程服务器
        ftp_client.put(localfile, remotedir_file)
 
        ssh_conn.close()
 
    except Exception as e:
        print(f"上传文件到 {ip} 时发生错误: {str(e)}")
 
 
if __name__ == '__main__':
    servers = {
        '192.168.200.133': {
            'port': 22,
            'username': 'root',
            'password': '5740##',
            'localfile': 'pi_put.py',
            'remotedir': '/root/'
        },
        '192.168.200.134': {
            'port': 22,
            'username': 'root',
            'password': '5740##',
            'localfile': 'pi_put.py',
            'remotedir': '/root/'
        },
        '192.168.200.135': {
            'port': 22,
            'username': 'root',
            'password': '5740##',
            'localfile': 'pi_put.py',
            'remotedir': '/root/'
        },
    }
 
    for ip, info in servers.items():
        sshPutFile(
            ip=ip,
            port=info.get('port'),
            username=info.get('username'),
            password=info.get('password'),
            localfile=info.get('localfile'),
            remotedir=info.get('remotedir'))

4 通过公钥私钥远程执行命令

import paramiko
 
private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
 
# 创建SSH对象
ssh = paramiko.SSHClient()
 
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 
# 连接服务器
ssh.connect(hostname='192.168.200.132', port=22, username='root', pkey=private_key)
 
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df -Th')
 
# 获取命令结果
result = stdout.read()
 
# 关闭连接
ssh.close()
 
print(result)  


--注:
	在 Paramiko 中,pkey 选项用于指定用于身份验证的私钥。具体来说,这个选项允许你提供一个 
	paramiko.RSAKey 或 paramiko.DSSKey 对象,这些对象表示了你的私钥文件
	
	如果你使用 RSA 密钥作为私钥,你可以按照以下方式设置 pkey 选项:
	private_key = paramiko.RSAKey.from_private_key_file('/path/to/private/key')
	
	如果你使用 DSA 密钥,可以这样设置:
	private_key = paramiko.DSSKey.from_private_key_file('/path/to/private/key')
	
在连接服务器时,你可以将 private_key 对象传递给 pkey 参数,

5 通过公钥私钥远程上传下载文件

import paramiko
 
private_key = paramiko.RSAKey.from_private_key_file(r'/root/.ssh/id_rsa')
 
transport = paramiko.Transport(('192.168.200.132', 22))
 
transport.connect(username='root', pkey=private_key)
 
sftp = paramiko.SFTPClient.from_transport(transport)
 
# 将location.py 上传至服务器 /tmp/test.py
sftp.put('/data/123.py', '/root/123.py')
 
# 将remove_path 下载到本地 local_path
# sftp.get('123.py', '123.py')
 
transport.close()

6 通过私钥字符串远程连接服务器

# 也可以是存在于数据库中
key = """-----BEGIN RSA PRIVATE KEY-----
 
-----END RSA PRIVATE KEY-----"""
 
 
import paramiko
from io import StringIO
 
private_key = paramiko.RSAKey(file_obj=StringIO(key))
 
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='192.168.16.85', port=22, username='root', pkey=private_key)
 
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 获取命令结果
result = stdout.read()
 
# 关闭连接
ssh.close()
 
print(result)

7 生成公钥私钥并上传

# 1 生成公钥和私钥s
sh-keygen.exe -m pem

# 2 在当前用户家目录会生成: .ssh/id_rsa.pub    .ssh/id_rsa

# 3 把公钥放到服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.16.85 

# 4 以后再连接服务器时,不需要在输入密码
ssh root@192.168.16.85

你可能感兴趣的:(python01,python,paramiko,SSH,上传下载文件,远程执行命令)