Python 使用paramiko远程控制Linux服务器

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

推荐阅读
cjavapy编程之路首页