【问题标题】:How to send `eof` signal, over a socket, to a command running in remote shell?如何通过套接字向在远程 shell 中运行的命令发送“eof”信号?
【发布时间】:2015-11-08 12:11:36
【问题描述】:

如何通过套接字将eof 信号发送到远程shell 中运行的命令?

我使用 Python 编程,使用套接字,一个远程 shell 应用程序,我在其中发送要在另一台 PC 上执行的命令。

一切正常(对于大多数命令),除了像 cat > file 这样的命令给我带来问题。

通常,我会用CTRL + Deof 信号)终止上面的命令,但在我的客户端中按CTRL + D,不会将信号发送到远程shell。因此我无法终止命令并且我被卡住了。

有人有建议吗?

【问题讨论】:

    标签: linux sockets python-3.x signals


    【解决方案1】:

    eof 不是一个信号,而是在您键入 ctrl-d 时由 tty 驱动程序实现为长度为 0 的读取。

    如果您的遥控器没有在 tty 中运行,那么您将无法生成 eof,因为您无法发送长度为 0 的数据包。但是,如果您在远程 shell 中将script /dev/null 之类的程序作为第一个命令运行,那么这会将你的 shell 包裹在一个伪 tty 中,你将能够发送一个真正的 ctrl-d 字符(十六进制 0x04),pty 会将其转换为 eof 并结束一只猫,例如例子。向遥控器发送stty -a 以检查您的 pty 中是否启用了 eol。


    stty -a 在我的终端上显示 lnext = ^V (literal-next char) 所以我可以输入 ctrl-vctrl-d 来输入一个真正的十六进制 0x04 字符.

    我选择了script,因为我知道它在通信中有效地插入了一个伪终端,并且对数据流没有任何作用。这不是它最初的目的(参见它的手册页),但这并不重要。

    【讨论】:

    • 如何从我的终端发送这样的十六进制值?为什么 script /dev/null 创建一个终端?我通常将此文件用于垃圾。
    • 我在答案中添加了我的回复。
    • 谢谢。对于像我这样的新手来说,这是非常技术性的;但我会试试看。
    【解决方案2】:

    您可以尝试使用 'here' 语法来标记 EOF:

    cat > file <<-EOF
    ...
    ...
    EOF
    

    或者只是cat &gt; file &lt;&lt;&lt;"whatever you like to type in" 这里不需要分隔符。

    以上内容在 Bash 手册中有很好的记录。不过,不知道其他shell是否支持这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-17
      • 2019-06-02
      • 2014-06-05
      • 2015-07-25
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      相关资源
      最近更新 更多