如何创建通过 ssh 中继数据的虚拟串行端口?

如何创建通过 ssh 中继数据的虚拟串行端口?

我在远程 Linux 机器上有一个串行端口,我可以通过 ssh 访问它。

我想创建一个文件(不是真正的文件,可能是设备文件或 unix 域套接字?),当写入时通过 ssh 写入远程串行端口,反之则读取。

我认为有一个创建文件的命令就足够了,然后通过从文件中读取来使命令的 STDIN 可以访问,并且写入文件将导致在命令的 STDOUT 流上输出数据。然后我可以这样使用它:

ssh user@host "cat /dev/ttyREAL" | <some_command> /dev/ttyFAKE | ssh user@host "tee /dev/ttyREAL"

是否有这样的命令,或者我以错误的方式执行它?

答案1

也许你可以做类似这个例子的事情,使用socat它创建一个伪tty和一个到它的符号链接~/myserialline。当您打开它时,socat 会运行 ssh(在本例中为 localhost),并在其中运行 socat 将 stdin/stdout 连接到真正的串行设备。

 socat PTY,link=$HOME/myserialline,raw,echo=0  EXEC:'ssh localhost socat - /dev/ttyS0'

假设您有这样的串行设备,您可以从(bash)shell 进行测试,例如:

exec 3<>~/myserialline # open pty for read and write
cat -u <&3 &  # read from pty
echo hello >&3 # write to pty

答案2

我不完全确定您作为示例给出的管道的第一部分,但是如果您可以以某种方式配置写入串行端口的程序以使用假串行端口,您可以简单地编写:

socat pty,link=$HOME/ttyFAKE,raw,echo=0 - | ssh user@host "tee /dev/ttyREAL"

socat 将为您创建设备。

答案3

我假设您想要这个,因为您需要通过 ssh 连接与串行端口另一端的设备进行通信,并且它不是调制解调器或类似的设备(您可以在其中使用网络堆栈)。

如果您要写入的命令可以运行命令并使用 stdin 和 stdout 与该命令进行通信,则您可以只使用 SSH 本身,因为 SSH 通过加密通道转发 stdin 和 stdout,就像该命令在本地运行一样。此时,您真正需要的只是一个允许您使用 stdin/stdout 写入串行端口的命令。该cu命令执行此操作;例如,你可以运行ssh host cu -s 9600 -lttyS0.

如果这不能满足您的要求,您真的必须提供更多信息......

相关内容