news 2026/5/7 19:12:47

ssh+tmux实现socket命令行交互

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ssh+tmux实现socket命令行交互

要在python3 znc.py die0_uart0 17100这种“串口转发/交互会话”里自动输入命令,关键是:进程必须运行在tmux pane(有伪终端),然后用 tmux 的send-keys往该 pane 注入按键。


ssh+tmux实现python socket通信

1) 基本方式:tmux 里启动 znc,再 send-keys 输入

1.1 启动会话(远端执行)

sshuser@runtime' tmux new-session -d -s znc0 "python3 -u znc.py die0_uart0 17100" '

1.2 向该串口“输入命令 + 回车”

sshuser@runtime' tmux send-keys -t znc0:0.0 "help" C-m '
  • -t znc0:0.0:session=znc0,window=0,pane=0
  • C-m:回车(Enter)

你也可以连续发送多条:

sshuser@runtime' tmux send-keys -t znc0:0.0 "cmd1" C-m tmux send-keys -t znc0:0.0 "cmd2" C-m '

2) Python 里实现(ssh 执行 tmux 命令)

importsubprocessimportshlex host="user@runtime"target="znc0:0.0"defssh(cmd:str):subprocess.check_call(["ssh",host,cmd])# 1) 启动 znc(若已存在可先 kill-session)ssh('tmux kill-session -t znc0 2>/dev/null || true')ssh('tmux new-session -d -s znc0 "python3 -u znc.py die0_uart0 17100"')# 2) 发送命令defsend(cmd:str):# 注意引号转义ssh(f"tmux send-keys -t{shlex.quote(target)}{shlex.quote(cmd)}C-m")send("help")send("version")

3) 同时还要“抓日志”:pipe-pane + send-keys 组合

这样既能输入,也能实时落盘:

sshuser@runtime' LOG=/var/log/emu/znc_uart0.log tmux kill-session -t znc0 2>/dev/null || true tmux new-session -d -s znc0 "python3 -u znc.py die0_uart0 17100" tmux pipe-pane -t znc0:0.0 -o "cat >>$LOG" tmux send-keys -t znc0:0.0 "help" C-m '

4) 可靠性注意事项(很关键)

  1. 确保进程真的在 pane 里起来了:否则 send-keys 没对象。
    可检查:

    tmux has-session-tznc0 tmux list-panes-tznc0-F"#{pane_id} #{pane_current_command}"
  2. 等待串口 ready:znc 启动后可能需要几百 ms~几秒才连上。
    你可以 sleep:

    tmux new-session-d-sznc0"python3 -u znc.py die0_uart0 17100"sleep1tmux send-keys...

    或在日志里 grep 到 “connected/ready” 再发命令(更稳)。

  3. 回车键:一般用C-m;有些场景需要C-j(LF),但串口交互大多是C-m

  4. 特殊按键:如 Ctrl-C:

    tmux send-keys-tznc0:0.0 C-c

Python 实现示例

Python 实现:通过 ssh 在远端启动 tmux + znc.py,开启 pipe-pane 落日志;然后轮询 capture-pane 等待出现 login:,自动输入 root,再等待出现提示符 root@riscv64:~#;最后提供 send_cmd() 执行命令并可选等待输出关键字。

依赖:本机能免密 ssh 到 runtime server(或已配置 ssh key),远端已安装 tmux,且能运行 python3 znc.py …

代码实现:

#!/usr/bin/env python3importsubprocessimporttimeimportshlexfromdataclassesimportdataclass@dataclassclassTmuxSerialConfig:ssh_host:str# e.g. "user@10.0.0.1"session:str# e.g. "znc0"pan
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/2 5:07:37

springboot+vue基于spring的药品销售商城进销存管理系统的设计与实现

目录摘要技术要点开发技术核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!摘要 该系统基于SpringBoot和Vue.js技…

作者头像 李华
网站建设 2026/5/7 18:51:44

springboot+vue社区居民信息流动人口管户籍理及数据分析与可视化系统设计

目录 摘要 开发技术 核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度总结源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 摘要 该系统基于SpringBoot后端框架与Vue…

作者头像 李华
网站建设 2026/5/3 8:24:50

openJiuwen 0 基础入门:工作流编排从零到一及深度踩坑指南

openJiuwen 0 基础入门:工作流编排从零到一及深度踩坑指南、 前言:什么是工作流? 在接触 openJiuwen 之前,我对“工作流”(Workflow)这个概念几乎一无所知。听起来像是企业级系统里的高深术语,…

作者头像 李华
网站建设 2026/5/1 4:47:13

Gemini CLI 终极使用指南

1. 简介:为什么使用 Gemini CLI?Gemini CLI (google/gemini-cli) 是 Google 推出的开源命令行 AI 代理。它不仅是一个聊天机器人,更是一个能通过终端理解你项目上下文、读取文件甚至执行任务的开发助手。主要特点:上下文感知&…

作者头像 李华
网站建设 2026/5/1 4:41:21

极限编程(ExtremeProgramming)是什么?

极限编程(ExtremeProgramming)是什么? 极限编程(ExtremeProgramming),简称 XP,是一种敏捷软件开发框架,它强调软件质量和响应变化的能力,尤其适用于需求快速变化或存在不…

作者头像 李华