Python paramiko实现SSH连接与文件传输完整指南

Owen
Owen
发布时间:2026-10-14| 1人浏览过
原创

本文详解Python中paramiko库的两种核心用法:基于用户名密码的SSH连接与基于SSH密钥的免密登录。涵盖生成公钥、配置authorized_keys、使用ssh-copy-id命令以及通过SFTP上传文件的完整代码示例,帮助开发者快速实现远程服务器操作与文件传输。

基于用户名密码的SSH连接与文件上传

首先介绍使用用户名和密码进行SSH连接的方式。这种方式适用于没有配置密钥对的环境,通过指定目标主机地址、用户名及密码建立连接。


import paramiko
paramiko.util.log_to_file('paramiko.log') # 记录日志文件
ssh = paramiko.SSHClient()
try:
  ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  ssh.connect('139.xx.xx.xx', username='work', password='***')
  cmd = 'ls' # 需要执行的Linux命名
  stdin, stdout, stderr = ssh.exec_command(cmd) #执行命令后的结构
  print(stdout.readlines())
  print(stdout.read().decode())
except Exception as e:
  print("%s:%s" % (e.__class__, e))
finally:
  # 关闭
  ssh.close()

基于SSH密钥的免密登录与文件上传

接着介绍基于SSH密钥的免密登录方式。这种方式安全性更高,无需每次输入密码,通过加载本地私钥文件进行身份认证,适合自动化脚本和长期运行的服务。


import paramiko
ssh = paramiko.SSHClient()
SSH_PRIVATE_KEY ='/Users/xueerhuan/.ssh/id_rsa' #本地密钥文件路径

try:
  key = paramiko.RSAKey.from_private_key_file(SSH_PRIVATE_KEY) # 无解密密码时
  #key = paramiko.RSAKey.from_private_key_file(SSH_PRIVATE_KEY, password='******') # 有解密密码时,

  ssh.load_system_host_keys() #通过known_hosts 方式进行认证可以用这个,如果known_hosts 文件未定义还需要定义 known_hosts
  #ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 通过公共方式进行认证 (不需要在known_hosts 文件中存在)
  ssh.connect(hostname='139.XX.XX.XX', port=22, username='root', pkey=key)
  stdin, stdout, stderr = ssh.exec_command("ps")
  # 获取命令结果
  result = stdout.read()
  # 打印输出
  print(result.decode())
except Exception as e:
  print("%s:%s" % (e.__class__, e))
finally:
  # 关闭
  ssh.close()

SSH密钥生成与配置指南

在配置免密登录前,需要先生成SSH密钥对。以下是生成密钥的具体步骤和注意事项。

首先,进入本地用户目录下的.ssh文件夹。在终端中执行命令:cd .ssh/

然后,使用ssh-keygen工具生成本地的公钥和私钥对。执行命令:ssh-keygen

执行上述命令后,在当前目录下会生成id_rsa(私钥)和id_rsa.pub(公钥)两个文件。例如:xueerhuan@ubuntu:~/.ssh$ ls id_rsa id_rsa.pub

接下来,将生成的id_rsa.pub文件中的内容复制到目标服务器的.ssh/authorized_keys文件中。如果目标服务器上没有authorized_keys文件,需要手动创建。请注意,authorized_keys文件的权限必须设置为600,否则SSH服务可能会拒绝读取。

或者,可以直接在本地终端使用一条命令自动完成公钥的复制。执行ssh-copy-id命令,后面跟上支持免密登录的目标用户地址,例如:ssh-copy-id user@host_ip。


morra@ubuntu:~/.ssh$ ssh-copy-id "morra@192.168.1.42"
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/morra/.ssh/id_rsa.pub"
The authenticity of host '192.168.1.42 (192.168.1.42)' can't be established.
ECDSA key fingerprint is SHA256:/ufx+/OLtdsYy7vsdk4KDu9xJsBp6zHonRAf2jjT0GI.
Are you sure you want to continue connecting (yes/no)? n^H
Please type 'yes' or 'no': yes
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
Password:

Number of key(s) added: 1

Now try logging into the machine, with:  "ssh 'morra@192.168.1.42'"  and check to make sure that only the key(s) you wanted were added.

#去目标机器下,检查authorized_keys文件
localhost:.ssh morra$ cat authorized_keys 

以下是使用用户名和密码上传文件的Python代码示例。通过paramiko库建立连接后,获取transport对象并创建SFTP客户端,最后调用put方法上传本地文件到远程服务器。


import os
import paramiko
ssh = paramiko.SSHClient()
SSH_PRIVATE_KEY ='/Users/xueerhuan/.ssh/id_rsa' #本地密钥文件路径
key = paramiko.RSAKey.from_private_key_file(SSH_PRIVATE_KEY)
paramiko.util.log_to_file('paramiko.log')

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('139.XX.XX.XX', username='root', password='***')
t = ssh.get_transport()
sftp = paramiko.SFTPClient.from_transport(t)
d = sftp.put("mm.txt", "/home/work/.ssh/mm.txt")
print(d)

以下是使用SSH密钥进行免密上传文件的Python代码示例。与密码登录类似,但在连接时指定了私钥路径(pkey=key),无需提供密码参数,实现了更安全、自动化的文件传输。


import os
import paramiko
ssh = paramiko.SSHClient()
SSH_PRIVATE_KEY ='/Users/xueerhuan/.ssh/id_rsa' #本地密钥文件路径
key = paramiko.RSAKey.from_private_key_file(SSH_PRIVATE_KEY)
paramiko.util.log_to_file('paramiko.log')
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='139.XX.XX.XX', port=22, username='root', pkey=key)
t = ssh.get_transport()
sftp = paramiko.SFTPClient.from_transport(t)
d = sftp.put("mm.txt", "/home/work/.ssh/mm.txt")
print(d)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。