当您只有一个串行控制台时,如何将文件发送到主机?

Ste*_*ski 29 solaris console serial-console

如果您只有一个串行控制台(比如通过终端服务器通过 telnet),可以使用哪些方法将文件传入/传出主机?

剪切/粘贴适用于小/可打印的东西,我玩过 uuencode/uudecode(带 gzip)的组合来处理不可打印的问题,但这都非常有限。

War*_*ung 15

您将在连接的另一端使用的串行控制台程序¹ 将通过某种方式将文件发送到远程端。具体如何进行取决于您在远程系统上可用的资源。

我有lrzszkermit在远程

最简单的情况是,如果您在远程端安装了可靠的二进制文件传输程序,例如lrzszkermit。这曾经比今天更常见,但您的特定系统可能仍然具有其中之一。

您在本地使用的串行控制台程序几乎肯定可以进行 Zmodem 或 Kermit 上传,这让您可以直接发送您需要的任何内容。

在 Zmodem 的情况下,只需rz在远程系统上键入,它会发出一个本地串行终端应该理解的特殊字符串,从而弹出一个文件选择器对话框。

Kermit 是一种更简单的协议,因此在这种情况下您必须手动启动传输。

我没有二进制文件传输程序,但我有uuencode/base64

使用适当的二进制文件传输程序(如lrzsz或 )有几个优点kermit:效率、校验和、自动重试、中止传输恢复、多文件传输等,但这些都是奢侈的。如果您只需要发送一个文件,或者您很少发送文件,则可以使用 ASCII 上传。

因为终端协议解释了二进制数据文件中出现的许多字节值,所以不能直接通过同一连接发送文件;如果这样做,两端的终端仿真代码将尝试解释一些数据,破坏数据并可能混淆终端处理代码。

您可以通过在本地将二进制数据编码为 ASCII 的安全子集,然后在远程端将其转换回原始二进制数据来解决此问题。这就是uuencodebase64程序所做的,仅在次要算法选择上有所不同。

在本地系统上,您对文件进行编码:²

$ uuencode -o sbf.uue some-binary-file.gz some-binary-file.gz
Run Code Online (Sandbox Code Playgroud)

然后在远程系统上键入此命令,并使用本地串行控制台的“ASCII 上传”功能发送文件:

$ cat | uudecode
Run Code Online (Sandbox Code Playgroud)

文件上传完成后,点击Ctrl-C退出cat。现在,您可以根据需要在远程系统上拥有解码文件。

但是我有很多文件要发送,可打印的 ASCII 转码很痛苦!

让自己提升到更高的技术水平并不难。如果远程系统有 C 编译器,您可以使用先前的技术向远程系统发送lrzsz源代码的副本。在本地方面:

$ uuencode -o lrzsz.tgz.uue lrzsz-0.12.20.tar.gz lrzsz-0.12.20.tar.gz
Run Code Online (Sandbox Code Playgroud)

然后在远程系统上,通过串行控制台程序键入:

$ cat | uudecode
^C
$ tar xvf lrzsz-0.12.20.tar.gz
...build lrzsz normally
Run Code Online (Sandbox Code Playgroud)

启动第一个命令后,将lrzsz.tgz.uue文件“ASCII 上传”到远程系统。管道接受 uuencoded 数据并将其解码为二进制 tarball,您可以解压缩和构建。

但是我在远程系统上没有 C 编译器

如果您甚至不必在远程系统上的编译器,你可以交叉编译rz本地系统上(或其他)程序,并将其发送给使用上述技术的远程系统。


脚注:

  1. minicompicocomPuTTYVanDyke CRT ...

  2. 您必须uuencode两次为此版本提供输入文件名,一次是命名输入数据的源,另一次是声明远程系统在将数据解码为输出文件时应调用该文件的内容。您可能希望远程系统为其输出文件使用不同的名称。

    您的本地版本的uuencode行为可能有所不同。


elm*_*rco 5

也许你应该试试minicom

  • 这个答案是不正确的。Minicom 为文件传输生成 lrzsz。Minicom 不能也不会处理它自己的文件传输。 (5认同)
  • 不,minicom 处理自己的文件 xfers。sx,sy,sz 和 rx,ry,rz 是独立的程序,通常可以在名为 lszrz 之类的包中找到。虽然我建议使用 sz 和 rz。小巧、简单,它做它该做的。Minicom 是一个完整的终端模拟器。 (4认同)

Kev*_*n M 5

如果您只有一个串行控制台,不知道这是否可行,但是如果您有网络访问权限,那么您可以使用nc(1)TCP/IP 复制文件。

# WARNING: Depending on your setup, this could make your system unbootable
root@destination-box.local # nc -l 8675 | dd of=/dev/sdXXX
root@source-box.local # dd if=/dev/sdYYY | nc destination-box.local 8675
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我sdbYYY从源框克隆到sdaXXX目标框。我为 TCP 端口号选择 8675 是随意的;您可以使用您有权访问的任何端口。它不一定是一个设备;它可以是任何文件。

kevin@destination-box.local $ nc -l 12345 >> ~/.ssh/authorized_keys
kevin@source-box.local $ cat ~/.ssh/id_rsa.pub | nc destination-box.local 12345
Run Code Online (Sandbox Code Playgroud)

在第二个示例中,我复制了我的 rsa 公钥 ( ~/.ssh/id_rsa.pub) 并将其添加到目标主机的授权密钥文件中。

  • 我可以在你的第一个想法上方建议一个大的红色警告标志吗?一些有心学习的孤独灵魂可能会执行类似的操作,希望只是复制文件,当然没有先阅读以下段落:) (5认同)

J. *_*ker 5

基本上,您必须使用互联网之前的方法通过串行 tty 进行传输,并且您必须有一种方法可以在另一端接收传输。显然,最好的方法是使用 ZMODEM,这意味着您需要sz在接收端有一个类似的工具。然而,这并不总是可行的,例如,当接收目标是没有网络的路由器时。

进行这种传输的唯一可能方法是直接通过通道,使用终端安全 ASCII,以 8 位之前的简洁风格。我将使用更现代的工具,我希望它们安装在大多数系统上。

发件人:

首先我们编码我们的文件

base64 file.tar.gz > file.tar.gz.b64
Run Code Online (Sandbox Code Playgroud)

现在确保您的 com send-file 命令是ascii-xfr,这是我的连接命令行

picocom -f n -p n -d 8 -b 115200  --send-cmd "ascii-xfr -snv" /dev/ttyS0
Run Code Online (Sandbox Code Playgroud)

通常我们希望ascii-xfr在接收端,但由于我们没有它,因此-n可以通过保持正确的行尾来解决这个问题。

接收者:

现在我们已经连接,转到您想要接收文件的目录。

cd /tmp/
cat > file.tar.gz.b64
Run Code Online (Sandbox Code Playgroud)

在 picocom 上,我只需CTRL+a+s,然后输入我发送的文件的完整路径。传输完成后,您需要按CTRL+c来中断该cat.

现在我们解码文件,

base64 -d file.tar.gz.b64 > file.tar.gz
Run Code Online (Sandbox Code Playgroud)

尽你所能验证该文件与您发送的文件相同,因为 ASCII 传输没有校验和保护。我的接收箱有sha512sum,但任何校验和命令就足够了。一旦您手动确认金额匹配,您就可以假定转账成功!


txw*_*ger 2

我会使用kermit,文件传输程序的鼻祖。早在 Linux 出现之前我们就已经使用它了。