SFTPClient类
SFTPClient类importparamikoaspk host10.1.8.128port22userrootpasswordroottry:#建立隧道tpk.Transport((host,port))#建立连接t.connect(usernameuser,passwordpassword)#客户端sftppk.SFTPClient.from_transport(t)#上传文件sftp.put(C:\\Users\\孟宇\\PyCharmMiscProject\\paramiko模块\\system.log,/root/system.log)print(成功)t.close()exceptExceptionase:print(e)成功sftp.get(/root/abc.txt,./abc.txt)print(成功)成功sftp.mkdir(/root/test)print(成功)成功sftp.rename(/root/test,/root/test_python)print(成功)成功#删除目录sftp.rmdir(/root/test_python)#删除文件sftp.remove(/root/abc.txt)print(成功)t.close()#查看文件状态print(sftp.stat(/root/system.log))#查看文件列表print(sftp.listdir(/root/))-rw-r--r--1003459720Jul09:26?[.bash_logout,.bash_profile,.bashrc,.cshrc,.tcshrc,anaconda-ks.cfg,.bash_history,.viminfo.tmp,Python-3.14.2.tgz,Python-3.14.2,.config,.cache,system.log,.viminfo]堡垒机模式下的远程命令执行importsysimportparamiko as pkimporttime# 配置信息 blhost10.1.8.128# 堡垒机 IPbluserrootblpwdroothost10.1.8.129# 业务机 IPuserrootpwdrootport22# 开始连接 pk.util.log_to_file(sshclient_system.log)sshclientpk.SSHClient()sshclient.set_missing_host_key_policy(pk.AutoAddPolicy())try: sshclient.connect(hostnameblhost,usernamebluser,passwordblpwd,timeout10)print([] 堡垒机连接成功)except Exception as e: print(f[-] 堡垒机连接失败: {e})sys.exit(1)# 创建交互式 shellchannelsshclient.invoke_shell()channel.settimeout(10)# 发送 ssh 登录业务机命令channel.send(fssh {user}{host}\n)buff# ----- 阶段1等待密码提示或 yes/no -----whileTrue: try: respchannel.recv(9999).decode(utf-8)ifnot resp:continuebuffresp print(f[DEBUG] 收到: {repr(resp)})except Exception as e: print(f[-] 接收超时/错误: {e})channel.close()sshclient.close()sys.exit(1)ifyes/noinbuff.lower(): channel.send(yes\n)buffcontinueifpassword:inbuff.lower(): print([] 检测到密码提示发送密码)break# ----- 阶段2发送密码 -----channel.send(pwd \n)buff# ----- 阶段3等待业务机 shell 提示符 -----whileTrue: try: respchannel.recv(9999).decode(utf-8)ifnot resp:continuebuffresp print(f[DEBUG] 收到: {repr(resp)})except Exception as e: print(f[-] 接收超时/错误: {e})channel.close()sshclient.close()sys.exit(1)ifpermission deniedinbuff.lower(): print([-] 业务机认证失败请检查密码)channel.close()sshclient.close()sys.exit(1)if#inbuff or$inbuff: print([] 业务机登录成功)break# ----- 阶段4执行 ifconfig 并读取输出 -----channel.send(ifconfig\n)bufftime.sleep(0.5)whileTrue: try: respchannel.recv(9999).decode(utf-8)ifnot resp:continuebuffrespif#inbuff or$inbuff:breakexcept Exception as e: print(f[-] 接收命令输出超时: {e})break# 打印输出去除最后一行提示符linesbuff.splitlines()iflines and(#inlines[-1]or$inlines[-1]): lines.pop()print(\n ifconfig 输出 \n)print(\n.join(lines))channel.close()sshclient.close()ifconfigens160:flags4163UP,BROADCAST,RUNNING,MULTICASTmtu1500inet10.1.8.129 netmask255.255.255.0 broadcast10.1.8.255 inet6 fe80::20c:29ff:feb5:6649 prefixlen64scopeid 0x20linkether 00:0c:29:b5:66:49 txqueuelen1000(Ethernet)RX packets350bytes164182(160.3KiB)RX errors0dropped0overruns0frame0TX packets372bytes40988(40.0KiB)TX errors0dropped0overruns0carrier0collisions0lo:flags73UP,LOOPBACK,RUNNINGmtu65536inet127.0.0.1 netmask255.0.0.0 inet6 ::1 prefixlen128scopeid 0x10hostloop txqueuelen1000(Local Loopback)RX packets0bytes0(0.0B)RX errors0dropped0overruns0frame0TX packets0bytes0(0.0B)TX errors0dropped0overruns0carrier0collisions0远程文件上传importparamikoimportsysimporttime# 堡垒机信息 blip10.1.8.128bluserrootblpwdroot# 业务服务器信息 hostname10.1.8.129usernamerootpasswordroot# 路径配置 tmpdir/tmpremotedir/datalocalpathC:\\Users\\孟宇\\Downloads\\Python-3.14.2.tgztmppathtmpdir/Python-3.14.2.tgzremotepathremotedir/Python-3.14.2.tgzport22PASS_PROMPTpassword:SHELL_PROMPT## 业务机提示符paramiko.util.log_to_file(syslogin.log)# ----- 阶段1上传文件到堡垒机 -----tparamiko.Transport((blip,port))t.connect(usernamebluser,passwordblpwd)sftpparamiko.SFTPClient.from_transport(t)print([] 上传本地文件到堡垒机...)sftp.put(localpath,tmppath)print([] 上传完成)sftp.close()t.close()# ----- 阶段2通过堡垒机执行 scp -----sshparamiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect(hostnameblip,usernamebluser,passwordblpwd,timeout10)print([] 堡垒机 SSH 连接成功)channelssh.invoke_shell()channel.settimeout(10)time.sleep(0.5)# ---------- 2.1 先创建业务机上的目标目录 ----------mkdir_cmdfssh{username}{hostname}mkdir -p{remotedir}\nchannel.send(mkdir_cmd)print(f[] 发送创建目录命令:{mkdir_cmd.strip()})buffwhileTrue:try:respchannel.recv(9999).decode(utf-8)ifnotresp:continuebuffrespprint(f[DEBUG] mkdir 输出:{repr(resp)})exceptExceptionase:print(f[-] 接收超时:{e})channel.close()ssh.close()sys.exit(1)# 如果出现密码提示可能业务机要求密码处理ifPASS_PROMPTinbuff.lower():channel.send(password\n)buffcontinue# 如果出现提示符说明命令执行完成if#inbuffor$inbuff:print([] 目录创建完成或已存在)break# ---------- 2.2 发送 scp 命令 ----------scp_cmdfscp{tmppath}{username}{hostname}:{remotepath}\nchannel.send(scp_cmd)print(f[] 发送 scp 命令:{scp_cmd.strip()})buff# 等待密码提示如果是首次 scp 会询问whileTrue:try:respchannel.recv(9999).decode(utf-8)ifnotresp:continuebuffrespprint(f[DEBUG] scp 输出:{repr(resp)})exceptExceptionase:print(f[-] 接收超时:{e})channel.close()ssh.close()sys.exit(1)# 处理主机密钥确认ifyes/noinbuff.lower():channel.send(yes\n)buffcontinue# 检测密码提示ifPASS_PROMPTinbuff.lower():print([] 检测到密码提示发送业务机密码)channel.send(password\n)buffcontinue# 如果出现提示符传输完成if#inbuffor$inbuff:print([] scp 传输完成)break# 打印 scp 输出去除提示符行linesbuff.splitlines()iflinesand(#inlines[-1]or$inlines[-1]):lines.pop()print(\n scp 输出信息 \n)print(\n.join(lines))channel.close()ssh.close()print([] 任务完成)[]上传本地文件到堡垒机...[]上传完成[]堡垒机 SSH 连接成功[]发送创建目录命令:ssh root10.1.8.129mkdir -p /data[DEBUG]mkdir 输出:Last login: Mon Jul 20 14:05:12 2026 from 10.1.8.1\r\r\n[\x1b[91mroot\x1b[93m\x1b[92;1mxhde\x1b[0m \x1b[94m~\x1b[0m \x1b[35m14:06:02\x1b[0m]\x1b[93m#\x1b[0m []目录创建完成或已存在[]发送 scp 命令:scp/tmp/Python-3.14.2.tgz root10.1.8.129:/data/Python-3.14.2.tgz[DEBUG]scp 输出:ssh root10.1.8.129 mkdir -p /data\r\n[DEBUG]scp 输出:scp /tmp/Python-3.14.2.tgz root10.1.8.129:/data/Python-3.14.2.tgz\r\n[DEBUG]scp 输出:\rroot10.1.8.129s password: []检测到密码提示发送业务机密码[DEBUG]scp 输出:\r\n[DEBUG]scp 输出:[\x1b[91mroot\x1b[93m\x1b[92;1mxhde\x1b[0m \x1b[94m~\x1b[0m \x1b[35m14:06:03\x1b[0m]\x1b[93m#\x1b[0m []scp 传输完成scp 输出信息[]任务完成输出: ‘scp /tmp/Python-3.14.2.tgz root10.1.8.129:/data/Python-3.14.2.tgz\r\n’[DEBUG] scp 输出: \rroot10.1.8.129’s password: [] 检测到密码提示发送业务机密码[DEBUG] scp 输出: ‘\r\n’[DEBUG] scp 输出: [\x1b[91mroot\x1b[93m\x1b[92;1mxhde\x1b[0m \x1b[94m~\x1b[0m \x1b[35m14:06:03\x1b[0m]\x1b[93m#\x1b[0m ’[] scp 传输完成 scp 输出信息 [] 任务完成

相关新闻

XMind MCP协议详解与集成开发指南

XMind MCP协议详解与集成开发指南

1. MCP协议基础解析XMind MCP(Model Context Protocol)是基于JSON-RPC 2.0规范的通信协议,专为思维导图软件与外部系统的深度集成设计。这个协议本质上建立了一套标准化的对话机制,让XMind可以像人类对话一样与其他应用程序交换数…

2026/10/13 5:05:41 阅读更多 →
TMS320F2837xS中断配置全解析:从PIE架构到实战避坑指南

TMS320F2837xS中断配置全解析:从PIE架构到实战避坑指南

1. 项目概述与中断系统核心价值 在嵌入式实时控制领域,尤其是电机驱动、数字电源、新能源并网这些对时序和响应速度要求严苛的场景里,中断机制是系统能够“一心多用”并保持确定性的基石。想象一下,你正在厨房同时处理几个锅,主菜…

2026/10/7 12:19:03 阅读更多 →
2026/7/21

2026/7/21

基础线学习Git的使用,配置环境,学习远程本地连接,Github和Gitee使用基础克隆,添加,提交,推送,拉取学习vscode协助keil开发环境及trae辅助使用keil assistant(已落后需更新&#xff0…

2026/10/5 8:57:12 阅读更多 →

最新新闻

Java面试实录:从JVM到MySQL,那些让面试官崩溃的基础错误

Java面试实录:从JVM到MySQL,那些让面试官崩溃的基础错误

互联网大厂Java开发者面试实录:严肃面试官遇上搞笑水货程序员谢飞机如果你没经历过那种"简历挺漂亮,开口就崩盘"的Java面试,那你可能还没当过面试官。我在某头部电商平台做Java技术面试官已经有年头了,每周至少面七八个…

2026/10/13 18:17:10 阅读更多 →
AnyPS5:PS5跨平台兼容性问题的技术本质与工程应对

AnyPS5:PS5跨平台兼容性问题的技术本质与工程应对

1. “AnyPS5”不是产品型号,而是一类跨平台兼容性问题的代号“AnyPS5”这个标题乍看像某款新主机或破解工具的代号,但实际在技术社区中,它早已演变为一个隐含多重语义的行业暗语——它不指向某个具体硬件,而是指代一类在非原生PS5…

2026/10/13 18:17:10 阅读更多 →
一文掌握 TypeScript 泛型:约束、推断、条件类型与项目实战封装

一文掌握 TypeScript 泛型:约束、推断、条件类型与项目实战封装

写 TypeScript 这几年,TypeScript Generics 泛型是我花时间最长才真正理解的部分,也是后来收获最大的一部分。早期写工具函数或者封装库的时候,我最常用的手段就是 any,偶尔兴致来了把 any 换成 unknown,结果类型报错从…

2026/10/13 18:17:10 阅读更多 →
群同构同态定理详解:从正规子群到商群的一站式攻克

群同构同态定理详解:从正规子群到商群的一站式攻克

如果你也正在啃抽象代数,估计你和我当年一样,第一遍学到“群同构同态定理”的时候,心里是有点发毛的。明明只是三行定理,却牵出正规子群、商群、陪集、核与像一整套概念,做题时又不知道从哪下手。这篇文章就是想把这块…

2026/10/13 18:17:10 阅读更多 →
监控数据丢失?OpenFalcon Transfer 多重备份方案与实战

监控数据丢失?OpenFalcon Transfer 多重备份方案与实战

一、为什么要盯住 Transfer:监控链路里最容易丢数据的一环凡是维护过自建监控系统的人,大概率都被同一个问题折磨过:数据明明从 agent 发出去了,图表上却出现了断点,等到想排查的时候,几个小时前的原始数据…

2026/10/13 18:17:10 阅读更多 →
Scratch图层顺序详解:背景为何会挡住角色?层次指令一次弄懂

Scratch图层顺序详解:背景为何会挡住角色?层次指令一次弄懂

1. 一个让人抓狂的现象:背景为什么会跑到角色前面去前阵子有人拿着一个半成品的Scratch作品来问我:“背景坏了不显示前面了,明明画好了山和天空,运行起来整个画面却被一块黑乎乎的东西盖住,角色怎么点都不出现。”我打…

2026/10/13 18:16:09 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →