SSH 远程操作
掌握 paramiko 库实现 SSH 远程连接
能远程执行命令、获取输出
实现 SFTP 文件上传下载
核心讲解
SSH 是远程管理 Linux 服务器的标准协议,Python 用 paramiko 库实现 SSH 客户端功能,可以批量执行命令、传输文件,是自动化运维的基础。
(1)安装
pip install paramiko
(2)SSHClient:远程执行命令
核心类,用于建立 SSH 连接、执行 shell 命令。
连接:
connect(hostname, port, username, password)执行命令:
exec_command(命令),返回输入、输出、错误三个流关闭连接:
close()
(3)SFTPClient:文件传输
基于 SSH 的文件传输,安全加密,用于上传下载文件。
从 SSH 连接创建:
ssh.open_sftp()上传:
put(本地路径, 远程路径)下载:
get(远程路径, 本地路径)操作远程文件:
listdir()、remove()、mkdir()
(4)最佳实践
用
with语句管理连接,自动关闭批量操作尽量复用连接,不要频繁创建断开
敏感信息(密码)不要硬编码,用配置文件或环境变量
代码示例
import paramiko
# ===== 1. 远程执行命令 =====
def ssh_exec_cmd(host, port, username, password, cmd):
# 创建SSH客户端
ssh = paramiko.SSHClient()
# 自动添加主机密钥(第一次连接不报错)
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
# 连接服务器
ssh.connect(hostname=host, port=port, username=username, password=password, timeout=10)
# 执行命令
stdin, stdout, stderr = ssh.exec_command(cmd)
# 获取输出和错误
output = stdout.read().decode("utf-8")
error = stderr.read().decode("utf-8")
# 获取返回码
exit_code = stdout.channel.recv_exit_status()
return exit_code, output, error
finally:
ssh.close()
# 示例
if __name__ == "__main__":
# 替换成你的服务器信息
host = "192.168.1.100"
port = 22
username = "root"
password = "your_password"
# 执行命令
code, out, err = ssh_exec_cmd(host, port, username, password, "df -h")
print("返回码:", code)
print("输出:")
print(out)
if err:
print("错误:", err)
# ===== 2. SFTP文件传输 =====
def sftp_upload(host, port, username, password, local_file, remote_file):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect(hostname=host, port=port, username=username, password=password)
# 创建SFTP客户端
sftp = ssh.open_sftp()
# 上传文件
sftp.put(local_file, remote_file)
print(f"上传成功:{local_file} -> {remote_file}")
sftp.close()
finally:
ssh.close()
def sftp_download(host, port, username, password, remote_file, local_file):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect(hostname=host, port=port, username=username, password=password)
sftp = ssh.open_sftp()
# 下载文件
sftp.get(remote_file, local_file)
print(f"下载成功:{remote_file} -> {local_file}")
sftp.close()
finally:
ssh.close()
# 示例
# sftp_upload(host, port, username, password, "local.txt", "/tmp/remote.txt")
# sftp_download(host, port, username, password, "/tmp/remote.txt", "download.txt")
# ===== 3. 批量执行命令 =====
def batch_exec(hosts, cmd):
for host_info in hosts:
print(f"\n===== 执行 {host_info['host']} =====")
code, out, err = ssh_exec_cmd(
host_info["host"],
host_info["port"],
host_info["username"],
host_info["password"],
cmd
)
print(out)
常见误区
主机密钥验证失败:第一次连接会报错,设置
AutoAddPolicy()自动接受命令执行无输出:有些命令输出在 stderr 里,两个流都要读取
长命令卡住:exec_command 是一次性执行,交互式命令(比如 top)会卡住,用 invoke_shell
权限不足:上传下载文件要对应用户权限,路径要正确
密码硬编码:不要把密码写在代码里,用配置文件或环境变量
课后练习
连接你的 Linux 服务器,执行
ls -la命令并输出结果上传一个本地文件到服务器的 /tmp 目录
从服务器下载一个文件到本地
实现批量在多台服务器上执行同一个命令

