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

使用 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("连接已关闭。")
代码解释:

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

# 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}")
缺点:
**安全性
