Sou*_*hym 5 gnu-screen cp shell-script serial-port serial-console
所以我想要实现的目标似乎很简单,但我似乎无法找到一种方法来做到这一点,而不使用外部实用程序或不预安装的库。
我有一个运行 Linux 的嵌入式系统(内核 3.x,具体取决于型号)。在它上我可以访问大多数 GNU 核心实用程序(如 cat、sed、ls、tar 等)。
我可以通过它访问 shell 会话/dev/ttyUSBx,例如使用 screen :
screen /dev/ttyUSB0 9600
Run Code Online (Sandbox Code Playgroud)
我运行 screen 的计算机(我们称之为source)安装了 ArchLinux,可以访问互联网。
我试图访问的嵌入式系统(我们称之为target)是一台 Linux 机器,没有任何网络访问权限,只有一个串行端口/dev/ttyUSBx。
我需要将二进制文件复制到目标上的特定位置,然后能够通过 cron 作业自动刷新某些硬件(在本例中为 FPGA)。
我无法真正在 上安装软件target,只能制作小型 shell 脚本。
你知道我可以使用任何 POSIX shell 方式来实现与 scp 相同的行为,但通过接口/dev/ttyUSBx而不是 ssh 吗?
我想到使用管道和文件重定向到:
-cat将二进制文件/dev/ttyUSBx从source.
- 在 上target,将流重定向到文件。
我什至不知道如何开始。我需要使用它的项目将于明天到期,但我现在迷失了方向,欢迎任何想法,最好是我可以直接从 shell 脚本使用的标准 POSIX 工具。
我确实可以在目标上访问 gcc,以防需要编译解决方案,但我仍然更喜欢 shell 解决方案,因为编译速度target非常慢,并且需要更多的努力才能部署到多台计算机。
我的目标是自动化此工作流程(尽可能减少用户交互)。也许像将target文件系统挂载为 NFS 之类的东西?
一种可能性是将二进制文件编码为 ASCII 文本,使用传统的uuencode或稍微更现代的base64。这些程序uuencode由sharutilsuudecode包提供,位于coreutils中。它似乎更有可能已经出现在现代 GNU/Linux 发行版上。base64base64
编码二进制文件的结果是大量文本,原则上可以通过终端连接将其复制/粘贴到 上的解码器中target。对于大量数据,使用剪贴板可能不切实际,但我们可以使用 in 工具screen将文件内容粘贴到终端中。
source,跑base64 FILE > FILE.b64。screen连接到 的会话中target,键入 Ctrl-A :readreg p /path/to/FILE.b64。(如果您的screen控制键不是 Ctrl-A,请键入该键。)看来您必须提供 FILE.b64 的完整路径;〜不起作用。屏幕应该报告类似“将 26665052 个字符放入缓冲区”之类的信息。target,运行base64 -d > FILE.:paste p。处理此问题的另一个长期存在的方法是ZModem,这是一种通过终端连接传输文件的古老方法。许多终端仿真器都内置了对 ZModem 的支持,例如 Konsole,只要lrzsz安装了该软件包即可。然而,很可能 lrzsz 没有安装,所以使用 base64 会更好。
这些方法都解决了通过您当时用于控制台的串行链路传输文件的问题。如果您不需要控制台,那么安排将target链接中的任何内容转储到文件中应该更简单;但如果串行控制台是您与设备交互的唯一方式,那就会出现问题!