使用与概述
paramiko是一个用于在Python中执行远程操作的模块,支持SSH协议。它可以用于连接到远程服务器,执行命令、上传和下载文件,以及在远程服务器上执行各种操作。
核心组件
Paramiko 提供了几个关键类
安装
使用 pip 命令 来安装 paramiko 模块:
基本用法
建立 SSH 连接: 使用 paramiko 可以建立到远程服务器的 SSH 连接。
import paramiko# 创建 SSH 客户端client = paramiko.SSHClient()# 自动添加主机密钥 (不写这个可能会报错找不到主机)client.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接到远程服务器client.connect('your_host', username='your_username', password='your_password', allow_agent=False, look_for_keys=False)# 参数说明:# - hostname: 远程主机的IP地址或域名# - username: 用于SSH连接的用户名# - password: 用于SSH连接的密码# - allow_agent: 是否允许使用代理验证,默认为False# - look_for_keys: 是否在本地寻找私钥文件,默认为False# 执行命令stdin, stdout, stderr = client.exec_command('ls -l')# - stdin:命令的标准输入# - stdout:命令的标准输出# - stderr:命令的错误输出print(stdout.read().decode())# 关闭连接client.close()
上传和下载文件:
使用 paramiko的sftp可以上传和下载文件到远程服务器。
import paramiko# 创建 SSH 客户端client = paramiko.SSHClient()client.set_missing_host_key_policy(paramiko.AutoAddPolicy())client.connect('your_host', username='your_username', password='your_password')# 上传文件sftp = client.open_sftp()local_file_path = 'local_file.txt'remote_file_path = '/path/on/remote/server/remote_file.txt'sftp.put(local_file_path, remote_file_path)# 下载文件local_download_path = 'local_download.txt'remote_download_path = '/path/on/remote/server/remote_file.txt'sftp.get(remote_download_path, local_download_path)# 关闭连接sftp.close()client.close()
SSH 密钥
使用 SSH 密钥进行认证。
import paramiko# 创建 SSH 客户端client = paramiko.SSHClient()client.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 使用密钥认证private_key_path = '/path/to/your/private/key'key = paramiko.RSAKey(filename=private_key_path)client.connect('your_host', username='your_username', pkey=key)# 执行命令等操作# 关闭连接client.close()
异常处理
Paramiko 常见异常:
paramiko.ssh_exception.AuthenticationExceptionparamiko.ssh_exception.SSHExceptionsocket.timeout
示例:
import paramikoimport sockettry: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect( hostname="192.168.1.100", username="root", password="wrong_password", timeout=5 )except paramiko.AuthenticationException: print("认证失败,请检查用户名或密码")except paramiko.SSHException as e: print(f"SSH 连接错误: { e}")except socket.timeout: print("连接超时")finally: ssh.close()
端口转发(隧道)
Paramiko 可以像 ssh -L 一样做本地端口转发,把本地端口映射到远程服务。
import paramikofrom paramiko.forward import forward_tunneltransport = paramiko.Transport(("192.168.1.100", 22))transport.connect(username="root", password="123456")# 将本地 8080 转发到远程 127.0.0.1:80forward_tunnel(local_port=8080,remote_host="127.0.0.1",remote_port=80, transport=transport)
示例
获取交换机配置信息
def get_config(ip,username,passwd,port): config = '' try: t = paramiko.SSHClient() t.set_missing_host_key_policy(paramiko.AutoAddPolicy) t.connect(hostname=ip,username=username,port=port,password=passwd) chan = t.invoke_shell() #sleep 1秒,防止执行过快导致卡死 time.sleep(1) chan.recv(1024) #华为设备关闭分页 chan.send('screen-length 0 temporary'+'\n') #chan.send('screen-length disable '+'\n') H3c设备关闭分页 time.sleep(1) chan.recv(1024) chan.send('dis cu'+'\n') time.sleep(1) count = 0 while True: line = chan.recv(RECV_LEN) config +=str(line).strip() count = count + 1 if "return " in line: break else: time.sleep(0.05) chan.sendall(' ') #防止莫名其妙进入死循环 if count >50: break #清除一些无关信息 config = config.replace('\033[16D','')\ .replace('---- More ----','')\ .replace('dis cu','').replace("\r\n","\n") except Exception as e: traceback.print_exc() return config