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