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")