当前位置: 首页 > news >正文

Python实现ssh自动连接

此文章为了实现不同PC端可以通过Python代码来代替终端命令实现ssh连接

一,终端连接

以下先介绍传统的连接方式:

1,确保网络连通性

  • 两台设备需在同一局域网或能通过互联网互相访问(如需公网访问,需配置端口转发)。

  • 检查连通性(例如设备A ping 设备B):

ping <设备B的IP地址>

2. 确认SSH服务运行

在设备B(被连接的设备)上安装SSH服务(如未安装。以Linux为例):

sudo apt install openssh-server 

启动ssh服务:

sudo systemctl start sshd  

检查服务状态:

sudo systemctl status sshd

3. 获取设备B的IP地址

ifconfig

4.防火墙设置

确保设备B的防火墙允许SSH端口(默认22):

sudo ufw allow 22

5. 从设备A发起SSH连接

ssh <用户名>@<设备B的IP地址>

例如

ssh user@192.168.1.100

二,Python代码连接

要通过 Python 代码自动实现 SSH 连接,可以使用 paramiko 库(最常用的 SSH 客户端库,支持 远程命令执行SFTP文件传输端口转发

1.安装paramiko库

pip install paramiko

 2.导入库并创建ssh客户端

import paramiko# 创建SSH客户端对象
ssh = paramiko.SSHClient()

3.设置主机密钥策略

SSH 连接时,客户端会验证服务器的主机密钥(防止中间人攻击)。
paramiko 提供几种策略:

  • AutoAddPolicy:自动添加未知主机密钥(方便测试,但安全性较低)。

  • WarningPolicy:未知主机时发出警告(默认)。

  • RejectPolicy:拒绝未知主机(最安全,需提前手动信任)。

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 

 4.建立ssh连接

分为密码认证和密钥认证两种

密码认证:

host = "192.168.1.100"  # 目标服务器IP
port = 22               # SSH端口(默认22)
username = "ubuntu"     # 用户名
password = "your_password"  # 密码(生产环境避免硬编码)try:ssh.connect(host, port, username, password)print("SSH连接成功!")
except paramiko.AuthenticationException:print("认证失败:用户名或密码错误")
except paramiko.SSHException as e:print(f"SSH连接失败: {e}")
except Exception as e:print(f"未知错误: {e}")

密钥认证:

密钥认证就是将密码放到一个权限文件,这样更安全

private_key_path = "~/.ssh/id_rsa"  # 私钥路径try:private_key = paramiko.RSAKey.from_private_key_file(private_key_path)ssh.connect(host, port, username, pkey=private_key)print("SSH密钥认证成功!")
except paramiko.SSHException as e:print(f"密钥认证失败: {e}")

~/.ssh/id_rsa 文件是 SSH 密钥对中的私钥文件,通常由用户手动生成。使用如下ssh-keygen命令生成

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  • -t rsa:指定密钥类型为 RSA。

  • -b 4096:密钥长度(建议 4096 位)。

  • -C:注释(通常用邮箱标识密钥用途)。

生成过程如下:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/your_user/.ssh/id_rsa):  # 直接回车(默认路径)
Enter passphrase (empty for no passphrase):  # 可选:设置密钥密码(增强安全性)
Enter same passphrase again:  # 确认密码

 也可以使用paramiko生成密钥,同时密钥需要设置权限,这是因为SSH 要求密钥文件权限严格受限,否则会报错。这里不做更详细解释,一般使用密码认证就足够了

5.执行远程命令

使用 exec_command() 执行命令,返回 stdin, stdout, stderr 三个流:

command = "ls -l /tmp"  # 示例命令stdin, stdout, stderr = ssh.exec_command(command)# 获取命令输出
output = stdout.read().decode()  # 标准输出
error = stderr.read().decode()   # 错误输出print("标准输出:\n", output)
if error:print("错误输出:\n", error)

6.关闭ssh

ssh.close()  # 显式关闭连接

完整实例:密码认证+执行命令

import paramikodef ssh_exec_command(host, username, password, command):ssh = paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())try:ssh.connect(host, username=username, password=password)stdin, stdout, stderr = ssh.exec_command(command) # 返回stdin, stdout, stderr三个对
#象。stdin用于向远程命令发送输入数据(如果需要交互式输入),比如stdin.write(),但大多数命令不需要
#输入。stdout读取命令的正常输出(即命令打印到终端的内容),stderr读取命令的错误输出(如报错信
#息)。 stdout.read().decode()读取读取全部输出(二进制需解码)output = stdout.read().decode() # error = stderr.read().decode()if output:print("命令输出:\n", output)if error:print("错误:\n", error)except Exception as e:print(f"SSH操作失败: {e}")finally:ssh.close()# 使用示例
ssh_exec_command("192.168.1.100", "ubuntu", "your_password", "df -h")


http://www.mrgr.cn/news/97251.html

相关文章:

  • 【双维畅聊】网页版聊天室测试报告
  • 服务器磁盘io性能监控和优化
  • 道路裂缝数据集CrackForest-156-labelme
  • 3D图像重建中Bundle Adjustment的推导与实现
  • 【Python爬虫高级技巧】BeautifulSoup高级教程:数据抓取、性能调优、反爬策略,全方位提升爬虫技能!
  • 001 vue
  • Springboot切换到3.3.4后,使用spring security一些小问题记录
  • PyTorch构建自定义模型
  • Flutter之页面布局
  • $R^n$超平面约束下的向量列
  • 蓝桥云客--破译密码
  • 【机器学习】机器学习工程实战-第4章 特征工程
  • 详解七大排序
  • 博途 TIA Portal之1200与Odot零点PN通讯
  • 【2023】ORIGIN或MATLAB 颜色图,等高图,颜色条——需要拟合补全中间的颜色
  • vs环境中编译osg以及osgQt
  • Drools项目实战
  • 论文阅读8——大数据赋能交通信号控制可减少城市碳排放
  • 记一次表格数据排序优化(一)--排序30000条数据有多卡
  • C++/Qt 模拟sensornetwork的工作