2015-08-15 53 views
2

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

我已经用Python编程,使用套接字,远程shell应用程序,我发送命令在另一台PC上执行。

一切工作正常(对于大多数命令),除了像cat > file命令正在导致我的问题。

通常情况下,我会终止上面的命令CTRL + Deof信号),但在我的客户端按CTRL + D,不会将信号发送到远程shell。所以我无法终止命令,我被卡住了。

任何人都有建议吗?

回答

3

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

如果你的远程没有在tty中运行,那么你不能生成一个eof,因为你不能发送一个长度为0的数据包。但是,如果你运行一个像script /dev/null这样的程序作为远程shell的第一个命令,那么这会将你的shell包含在一个伪tty中,并且你将能够发送一个真实的ctrl-d字符(十六进制0x04),例如,pty会将其转换为eof并结束一个cat。发送一个stty -a到远程来检查您的pty中是否启用了eol。


stty -a我的终端上说lnext = ^V(字面下一个字符),所以我可以输入CTRL-VCTRL-d输入一个真正的十六进制字符0×04。

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

+0

如何从我的终端发送这样的十六进制值?为什么script/dev/null创建一个终端?我通常使用此文件进行垃圾回收。 – Shuzheng

+0

我加了我对答案的回复。 – meuh

+0

谢谢。对于像我这样的新手来说,这是非常技术性的;但我会尝试一下。 – Shuzheng

1

你可以尝试“这里”语法改用来标记EOF:这里需要

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

或只是cat > file <<<"whatever you like to type in"无定界符。

以上内容在Bash手册中记录得非常好。不过不知道其他shell是否支持这一点。

相关问题