当您拥有的只是一个串行控制台(例如通过终端服务器通过 telnet)时,可以使用哪些方法将文件传入/传出主机?
剪切/粘贴适用于小/可打印的内容,我已经使用 uuencode/uudecode (使用 gzip)的组合来处理不可打印的内容,但这都是非常有限的。
答案1
您将在连接另一端使用的串行控制台程序将通过某种方式将文件发送到远程端。具体如何进行取决于远程系统上有哪些可用资源。
我有lrzsz
或kermit
在远程端
最简单的情况是,如果您在远程端安装了可靠的二进制文件传输程序,例如lrzsz
或者kermit
。这曾经比今天更常见,但您的特定系统可能仍然有其中之一。
您在本地使用的串行控制台程序几乎肯定有一种方法可以进行 Zmodem 或 Kermit 上传,这样您就可以直接发送您需要的任何内容。
对于 Zmodem,只需rz
在远程系统上键入,该系统会发出本地串行终端应该理解的特殊字符串,从而弹出一个文件选择器对话框。
Kermit 是一个更简单的协议,因此在这种情况下您必须手动启动传输。
我没有二进制文件传输程序,但我有uuencode
/base64
lrzsz
使用适当的二进制文件传输程序(如或 )有几个优点kermit
:效率、校验和、自动重试、中止的传输恢复、多个文件传输等,但这些是奢侈品。如果您只需要发送一个文件,或者您很少发送文件,则可以使用 ASCII 上传。
因为终端协议解释二进制数据文件中出现的许多字节值,您无法通过同一连接直接发送文件;如果这样做,任一端的终端仿真代码将尝试解释某些数据,从而损坏数据并可能令人困惑的以及终端处理代码。
您可以通过在本地将二进制数据编码为 ASCII 的安全子集,然后在远程将其转换回原始二进制数据来解决此问题。这就是uuencode
和base64
程序确实如此,仅在较小的算法选择上有所不同。
在本地系统上,您对文件进行编码:²
$ uuencode -o sbf.uue some-binary-file.gz some-binary-file.gz
然后,您在远程系统上键入此命令,并使用本地串行控制台的“ASCII 上传”功能发送文件:
$ cat | uudecode
文件上传完成后,点击Ctrl-C退出cat
。现在,您已根据需要在远程系统上获得了解码后的文件。
但我有许多要发送的文件和可打印的 ASCII 转码很痛苦!
让自己达到更高的技术水平并不难。如果远程系统具有 C 编译器,则可以使用现有技术向远程系统发送源代码的副本lrzsz
。在本地端:
$ uuencode -o lrzsz.tgz.uue lrzsz-0.12.20.tar.gz lrzsz-0.12.20.tar.gz
然后在远程系统上,通过串行控制台程序键入:
$ cat | uudecode
^C
$ tar xvf lrzsz-0.12.20.tar.gz
...build lrzsz normally
启动第一个命令后,将文件“ASCII 上传”lrzsz.tgz.uue
到远程系统。该管道接受 uuencoded 数据并将其解码为二进制 tarball,您可以解压并构建它。
但我在远程系统上没有 C 编译器
如果远程系统上甚至没有编译器,您可以交叉编译rz
本地系统上的(或其他)程序并使用上述技术将其发送到远程系统。
脚注:
答案2
基本上,您必须使用预互联网方法通过串行 tty 进行传输,并且您必须有一种方法在另一端接收传输。显然,最好的方法是使用 ZMODEM,这意味着您需要有一个类似于sz
接收端已有的工具。然而,这并不总是可行,例如,当接收目标是没有网络的路由器时。
执行此传输的唯一可能方法是直接通过通道,使用终端安全 ASCII,采用前 8 位干净风格。我将使用更现代的工具,我希望大多数系统上都安装了这些工具。
发件人:
首先我们对文件进行编码
base64 file.tar.gz > file.tar.gz.b64
现在确保您的 com 发送文件命令是,ascii-xfr
这是我的连接命令行
picocom -f n -p n -d 8 -b 115200 --send-cmd "ascii-xfr -snv" /dev/ttyS0
通常我们需要ascii-xfr
接收端,但由于我们没有它,因此-n
可以通过保持正确的行结尾来解决这个问题。
接收者:
现在我们已经连接,请转到您想要接收文件的目录。
cd /tmp/
cat > file.tar.gz.b64
在picocom上,我只是CTRL+a+s,然后输入我要发送的文件的完整路径。传输完成后,您需要CTRL+c打破这一点cat
。
现在我们解码文件,
base64 -d file.tar.gz.b64 > file.tar.gz
尽一切努力验证该文件与您发送的文件是否相同,因为 ASCII 传输没有校验和保护。我的接收盒有sha512sum
,但任何校验和命令就足够了。一旦您手动确认金额匹配,您就可以认为转账成功了!
答案3
不知道如果您只有一个串行控制台,这是否可行,但如果您有网络访问权限,那么您可以nc(1)
使用 TCP/IP 来复制文件。
# WARNING: Depending on your setup, this could make your system unbootable
[email protected] # nc -l 8675 | dd of=/dev/sdXXX
[email protected] # dd if=/dev/sdYYY | nc destination-box.local 8675
在上面的示例中,我sdbYYY
从源框克隆到sdaXXX
目标框。我选择 8675 作为 TCP 端口号是任意的;您可以使用您有权访问的任何端口。它不一定是一个设备;它也可以是一个设备。它可以是任何文件。
[email protected] $ nc -l 12345 >> ~/.ssh/authorized_keys
[email protected] $ cat ~/.ssh/id_rsa.pub | nc destination-box.local 12345
在第二个示例中,我复制了 rsa 公钥 ( ~/.ssh/id_rsa.pub
) 并将其添加到目标主机的授权密钥文件中。
答案4
我会用克米特,文件传输程序的祖父母。早在 Linux 出现之前我们就已经使用它了。