Paramiko是一个用于SSH协议的Python实现,它允许你在Python中创建SSH连接并进行远程操作。可以使用Paramiko执行各种SSH操作,包括远程命令执行、文件传输等。本文主要介绍Python中使用paramiko远程执行命令,建立连接,切换用户,上传上载文件等。
1、安装引用Paramiko
paramiko包含了两个核心组件:SSHClient 和 SFTPClient,在Python 环境中安装 Paramiko命令如下,
pip install paramiko
2、使用Paramiko 建立连接
Paramiko可以通过用户和密码方式连接服务器,也可以通过密钥的文件的方式连接。
连接参数说明:
参数名
|
描述
|
默认值
|
hostname
|
连接的目标主机
|
|
port
|
指定端口
|
SSH_PORT
|
username
|
验证的用户名
|
None
|
password
|
验证的用户密码
|
None
|
pkey
|
私钥方式用于身份验证
|
None
|
key_filename
|
私钥文件名或文件列表
|
None
|
timeout
|
可选的TCP连接超时时间
|
None
|
allow_agent
|
是否允许连接到SSH代理
|
True
|
look_for_keys
|
是否在~/.ssh中搜索私钥文件
|
True
|
compress
|
是否打开压缩
|
False
|
1)使用密码连接服务器
import paramiko
from paramiko import SSHClient
def connect_with_password(host, username, password):
ssh = paramiko.SSHClient()
# 自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.load_system_host_keys()
ssh.connect(host, username=username,
password=password)
session = ssh.get_transport().open_session()
AgentRequestHandler(session)
ssh_stdin, ssh_stdout, ssh_stderr = session.exec_command("ls -l")
content = ssh_stdout.read()
return session
connect_with_password("192.168.31.11","root","admin")
2)使用密钥连接服务器
import paramiko
from paramiko import SSHClient
def connect_with_RSAKey(host, username, file):
# 配置私人密钥文件位置
private = paramiko.RSAKey.from_private_key_file(file)
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接SSH服务端,以用户名和密码进行认证
ssh.connect(hostname=host, port=22, username=username, pkey=private)
session = ssh.get_transport().open_session()
AgentRequestHandler(session)
ssh_stdin, ssh_stdout, ssh_stderr = session.exec_command("ls -l")
content = ssh_stdout.read()
return session
connect_with_RSAKey("192.168.31.11","root","/root/.ssh/id_rsa")
3、使用paramiko远程执行命令
使用paramiko登陆服务,切换到root用户,并执行命令,如不需要切换用户,则可以把相关代码注释即可。
import paramiko
import time
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname="250.250.250.250", port=22, username="admin", password="123")
channel = ssh.invoke_shell() #打开一个新的子shell进程,用来与Linux进行交互
time.sleep(0.1)
channel.send("sudo root \n") #切换
channel.send("123abc\n") #输入登录密码
buff = ''
while not buff.endswith('# '):
resp = channel.recv(9999)
buff += resp.decode('utf-8')
print(buff)
channel.send("ls")
channel.send('\n')
buff = ''
while not buff.endswith('# '): # 当指令执行结束后,Linux窗口会显示#,等待下条指令,所以可以用作识别全部输出结束的标志。
resp = channel.recv(9999)
buff += resp.decode('utf-8')
print(buff)
print("------end------")
# 查看是否切换成功
channel.send("whoami")
channel.send("\n")
buff = ''
while not buff.endswith('# '):
resp = channel.recv(9999)
buff += resp.decode('utf-8')
print(buff)
except paramiko.ssh_exception.AuthenticationException:
print('登录失败,IP用户名或密码错误。')
exit(-1)
4、使用paramiko上传下载文件
在我们需要更新服务器端的文件时,使用paramiko可以实现自动上传下载文件操作,如下,
import paramiko
from paramiko import SSHClient
#文件下载
def download_file_ftp(host, username, password, local_path, remote_path):
#与服务器创建ssh连接,transport方法建立通道,以元组的方式写服务器信息
ssh_ftp = paramiko.Transport((host, 60317))
ssh_ftp.connect(username=username, password=password)
#创建连接后,使用sftpclient类和from_transport(括号里写上边创建的Transport通道)基于上边ssh连接创建一个sftp连接,定义成ftp_client变量后边方便引用
ftp_client = paramiko.SFTPClient.from_transport(ssh_ftp)
#下载文件
#ftp_client.get("目标文件", r"保存位置,写到文件名")
ftp_client.get(remote_path, local_path)
#关闭ssh连接
ssh_ftp.close()
#文件上传
def upload_file_ftp(host, username, password, local_path, remote_path):
#与服务器创建ssh连接,transport方法建立通道,以元组的方式歇服务器信息
ssh_ftp = paramiko.Transport((host, 60317))
ssh_ftp.connect(username=username, password=password)
#创建连接后,使用sftpclient类和from_transport(括号里写上边创建的Transport通道)基于上边ssh连接创建一个sftp连接,定义成ftp_client变量后边方便引用
ftp_client = paramiko.SFTPClient.from_transport(ssh_ftp)
#上传文件
ftp_client.put(local_path, remote_path)
#关闭ssh连接
ssh_ftp.close()
download_file_ftp("192.168.31.11","root","admin","/root/server.py","/home/data/server.py")
upload_file_ftp("192.168.31.11","root","admin","./server.py","/home/data/server.py")