凌峰创科服务平台

Python远程连接Linux服务器,如何实现?

下面我将为你详细介绍几种主流方法,从最推荐的 paramiko 到其他替代方案。

Python远程连接Linux服务器,如何实现?-图1
(图片来源网络,侵删)

使用 paramiko (最推荐)

paramiko 是 Python 事实上的标准 SSH 库,它允许你执行命令、传输文件,并建立安全的 SSH 隧道。

安装 paramiko

你需要安装这个库,打开你的终端或命令行,执行:

pip install paramiko

基本用法:执行命令

这是最常见的用法,即登录服务器并执行一个或多个命令。

import paramiko
# --- 服务器信息 ---
hostname = 'your_server_ip'  # 服务器的 IP 地址或域名
port = 22                   # SSH 端口,默认是 22
username = 'your_username'  # 你的用户名
password = 'your_password'  # 你的密码 (不推荐,建议使用密钥)
# 或者使用密钥文件
# key_filename = '/path/to/your/private_key' # ~/.ssh/id_rsa
# --- 创建 SSH 客户端对象 ---
ssh = paramiko.SSHClient()
# --- 自动添加服务器的主机密钥 (首次连接时需要) ---
# 这会接受任何新的主机密钥,有安全风险,仅用于测试。
# 生产环境中,应该使用 ssh.load_host_keys() 或设置 known_hosts 文件。
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
    # --- 连接服务器 ---
    # 如果使用密码
    ssh.connect(hostname, port=port, username=username, password=password)
    # 如果使用密钥文件 (更安全)
    # ssh.connect(hostname, port=port, username=username, key_filename=key_filename)
    print(f"成功连接到 {hostname}")
    # --- 执行命令 ---
    command = 'ls -l /home'  # 列出 /home 目录下的文件
    print(f"正在执行命令: {command}")
    # stdin, stdout, stderr 分别是标准输入、标准输出、标准错误
    stdin, stdout, stderr = ssh.exec_command(command)
    # 获取命令的输出
    output = stdout.read().decode('utf-8')
    error = stderr.read().decode('utf-8')
    if error:
        print(f"命令执行出错:\n{error}")
    else:
        print("命令执行成功,输出如下:")
        print(output)
finally:
    # --- 关闭连接 ---
    ssh.close()
    print("连接已关闭。")

代码解释:

Python远程连接Linux服务器,如何实现?-图2
(图片来源网络,侵删)
  1. paramiko.SSHClient(): 创建一个 SSH 客户端实例。
  2. ssh.set_missing_host_key_policy(...): 当你第一次连接一台新服务器时,它的 SSH 密钥是未知的,这个设置会自动接受并保存服务器的密钥。注意:在生产环境中,这存在“中间人攻击”的风险,更安全的做法是预先将服务器的公钥添加到本地 ~/.ssh/known_hosts 文件中。
  3. ssh.connect(): 建立与服务器的连接,可以使用密码或私钥文件进行认证。
  4. ssh.exec_command(): 执行一个远程命令,它会返回三个文件类对象:stdin (输入流), stdout (输出流), stderr (错误流)。
  5. stdout.read().decode('utf-8'): 读取命令的标准输出,并将其从字节串解码为字符串。
  6. ssh.close(): 关闭 SSH 连接,释放资源。

高级用法:传输文件 (SFTP)

paramiko 也内置了 SFTP (SSH File Transfer Protocol) 客户端,用于在本地和远程服务器之间安全地传输文件。

import paramiko
# --- 服务器信息 (同上) ---
hostname = 'your_server_ip'
port = 22
username = 'your_username'
password = 'your_password'
# key_filename = '/path/to/your/private_key'
# --- 创建 SSH 和 SFTP 客户端 ---
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
    ssh.connect(hostname, port=port, username=username, password=password)
    # --- 创建 SFTP 客户端 ---
    sftp = ssh.open_sftp()
    # --- 示例1: 上传文件 ---
    local_path = 'local_file.txt'
    remote_path = '/home/your_username/remote_file.txt'
    print(f"正在上传 {local_path} 到 {remote_path}...")
    sftp.put(local_path, remote_path)
    print("文件上传成功。")
    # --- 示例2: 下载文件 ---
    # remote_path_download = '/home/your_username/remote_file.txt'
    # local_path_download = 'downloaded_file.txt'
    # print(f"正在从 {remote_path_download} 下载到 {local_path_download}...")
    # sftp.get(remote_path_download, local_path_download)
    # print("文件下载成功。")
    # --- 列出远程目录 ---
    print("列出 /home 目录内容:")
    dir_contents = sftp.listdir('/home')
    for item in dir_contents:
        print(item)
finally:
    # --- 关闭 SFTP 和 SSH 连接 ---
    if 'sftp' in locals():
        sftp.close()
    ssh.close()
    print("连接已关闭。")

使用 fabric

Fabric 是一个更高级的 Python 库,构建在 paramiko 之上,它提供了更简洁、更“Pythonic”的 API,特别适合自动化任务部署、系统管理等。

安装 fabric

pip install fabric

基本用法

fabric 通常通过一个 fabfile.py 来管理任务。

创建一个名为 fabfile.py 的文件:

Python远程连接Linux服务器,如何实现?-图3
(图片来源网络,侵删)
# fabfile.py
from fabric import Connection, Config
# --- 服务器信息 ---
hostname = 'your_server_ip'
user = 'your_username'
# password = 'your_password' # 可以直接写密码,但更推荐使用 SSH Agent 或配置文件
def list_home_dir(c):
    """列出远程服务器 /home 目录的内容"""
    print(f"正在连接到 {hostname} 并执行命令...")
    result = c.run('ls -l /home', hide=False)  # hide=False 会实时显示输出
    print("命令执行完成。")
    # result.stdout 获取命令的输出
    print("服务器返回的输出:")
    print(result.stdout)
def upload_test_file(c):
    """上传一个测试文件到远程服务器"""
    local_file = 'test.txt'
    remote_path = '/tmp/test.txt'
    print(f"正在上传 {local_file} 到 {remote_path}...")
    c.put(local_file, remote_path)
    print("文件上传成功。")
# --- 使用 SSH Agent 进行认证 (推荐) ---
# 如果你的本地 SSH Agent (ssh-agent) 已经添加了私钥,fabric 会自动使用它
# conn = Connection(host=hostname, user=user)
# --- 使用密码进行认证 ---
conn = Connection(host=hostname, user=user, connect_kwargs={'password': 'your_password'})
# --- 执行任务 ---
# 你可以从命令行运行: fab list_home_dir
# 或者直接在这里调用
if __name__ == '__main__':
    # 执行 list_home_dir 任务
    list_home_dir(conn)
    # 执行 upload_test_file 任务
    # upload_test_file(conn)
    conn.close()

如何运行:

将上述代码保存为 fabfile.py,然后在终端中运行:

# 执行 list_home_dir 函数
fab list_home_dir
# 或者指定用户和主机
fab -H your_server_ip -u your_username list_home_dir

fabric 的优势在于它的任务管理和更简洁的 API(如 c.run()c.put())。


使用 subprocess + ssh 命令 (简单但不推荐)

这种方法是 Python 调用系统自带的 ssh 命令,它非常简单,但不推荐用于复杂的自动化脚本,因为它难以处理交互、错误和会话管理。

import subprocess
hostname = 'your_server_ip'
username = 'your_username'
command = 'ls -l /etc'
# 构建完整的 ssh 命令
# 注意:密码直接写在命令行中是不安全的,可能会被看到
full_command = f'ssh {username}@{hostname} "{command}"'
try:
    # 执行命令
    # shell=True 是必须的,以便让 shell 解释命令中的引号
    result = subprocess.run(full_command, shell=True, check=True, capture_output=True, text=True)
    print("命令执行成功,输出如下:")
    print(result.stdout)
except subprocess.CalledProcessError as e:
    print(f"命令执行失败,错误码: {e.returncode}")
    print(f"错误信息: {e.stderr}")

缺点:

**安全性

分享:
扫描分享到社交APP
上一篇
下一篇