堡垒机初识--paramiko模块
一、paramiko模块
Python的paramiko模块基于SSH用于连接远程服务器并执行相关的操作。
1.1 在windows上安装paramiko模块
测试环境: win10 , python3.5 并且已安装 pip
在命令窗口,切换到 python 安装目录中的 Scripts
执行: pip install paramiko
检测: import paramiko
二、SSHClient
2.1 基于用户名密码连接
import paramiko ''' 用于连接远程服务器,并执行命令 ''' # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='172.16.200.30', port=22, username='root', password='111111') # 执行命令 stdin, stdout, stderr = ssh.exec_command('ls&&df') # 获取命令结果 # 三元运算 res, err = stdout.read(), stderr.read() result = res if res else err print(result.decode()) # 关闭连接 ssh.close()
输出
- stdin => 标准输入,就是你输入的那个命令
- stdout => 标准输出,你输入命令后执行的结果
- stderr => 标准错误,名利执行的过程中,如果出错了,就把这个错误打到这里
2.2 基于公钥秘钥连接
其实很上面用密码登入没什么区别,只是不用写明文密码了
import paramiko private_key = paramiko.RSAKey.from_private_key_file(r'G:\python\untitled\study9\ceshi') # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='172.16.200.30', port=22, username='root', pkey=private_key) # 执行命令 stdin, stdout, stderr = ssh.exec_command('ls') # 获取命令结果 # 三元运算 res, err = stdout.read(), stderr.read() result = res if res else err print(result.decode()) # 关闭连接 ssh.close()
输出
004776 1 _1748 anaconda-ks.cfg monitor npm-debug.log
2.3 SSHClietn封装了transport
# -*- coding: UTF-8 -*- # SSHClient 封装了Transport import paramiko transport = paramiko.Transport(('172.16.200.30', 22)) transport.connect(username='root', password='111111') ssh = paramiko.SSHClient() ssh._transport = transport # 执行命令 stdin, stdout, stderr = ssh.exec_command('df') res, err = stdout.read(), stderr.read() result = res if res else err print(result.decode()) transport.close()
基于秘钥
# SSHClient 封装了Transport import paramiko private_key = paramiko.RSAKey.from_private_key_file(r'G:\python\untitled\study9\ceshi') transport = paramiko.Transport(('172.16.200.30', 22)) transport.connect(username='root', pkey=private_key) ssh = paramiko.SSHClient() ssh._transport = transport # 执行命令 stdin, stdout, stderr = ssh.exec_command('ds') res, err = stdout.read(), stderr.read() result = res if res else err print(result.decode()) transport.close()
三、SFTPClient
用于连接远程服务器并执行上传和下载
3.1 基于用户名和密码
import paramiko transport = paramiko.Transport(('172.16.200.30', 22)) transport.connect(username='root', password='111111') sftp = paramiko.SFTPClient.from_transport(transport) # 将本地文件上传至服务器 sftp.put(r'G:\python\untitled\study9\ceshi', '/tmp/ceshi') # 将远程服务器的文件下载至本地 sftp.get('/tmp/test.txt', r'G:\python\untitled\study9\test_linux.txt') transport.close() #注: 上传和下载的路径必须是全路径,即必须把文件名也加上,不能只写目录名
3.2 基于公钥和私钥上传和下载
同样改变不多
import paramiko # 秘钥 private_key = paramiko.RSAKey.from_private_key_file(r'G:\python\untitled\study9\ceshi') transport = paramiko.Transport(('172.16.200.30', 22)) transport.connect(username='root', pkey=private_key) sftp = paramiko.SFTPClient.from_transport(transport) # 将本地文件上传至服务器 sftp.put(r'G:\python\untitled\study9\ceshi', '/tmp/ceshi') # 将远程服务器的文件下载至本地 sftp.get('/tmp/test.txt', r'G:\python\untitled\study9\test_linux.txt') transport.close()