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())
try:
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")