为啥 ncat -exec 可以与 shell 脚本一起使用,但不能与 perl 脚本一起使用?
Posted
技术标签:
【中文标题】为啥 ncat -exec 可以与 shell 脚本一起使用,但不能与 perl 脚本一起使用?【英文标题】:Why does ncat -exec work with a shell script but not with a perl script?为什么 ncat -exec 可以与 shell 脚本一起使用,但不能与 perl 脚本一起使用? 【发布时间】:2013-07-10 19:16:39 【问题描述】:我正在尝试编写一个小型硬件模拟器,它从套接字读取输入并将响应写回。我想将 ncat 用于网络部分,将 Perl 用于逻辑。但是当我用 ncat 运行我的 perl 脚本时,它永远不会发送响应。
首先,这显示了我想如何使用 ncat。我将 /bin/cat 用于演示目的,因为它很简单。
启动服务器ncat -l 1234 -keep-open --exec "/bin/cat"
启动客户端ncat 12.34.56.789 1234
这样做会导致 ncat 像我期望的那样回显命令。但是当我尝试在 perl 中编写 cat 并使用它而不是 /bin/cat 时。
#!/usr/bin/perl
while (<>)
print $_;
和
ncat -l 1234 -keep-open --exec "/path/cat.pl"
ncat 从不将响应发送回客户端。即使在命令行中,它也完全符合 /bin/cat 的功能。此外,当我将以下 bash 脚本与 ncat 而不是 /bin/cat 一起使用时,它的工作方式与 /bin/cat 一样。 ncat 像我期望的那样将响应回显给客户端。
#!/bin/bash
while [ true ]
do
read lin
echo "$lin"
done
我必须做些什么才能让我的 Perl 脚本按我想要的方式工作?
【问题讨论】:
【参考方案1】:停止标准输出的缓冲(自动刷新)有帮助吗?在 Perl 的 cat 开头添加以下内容:
$| = 1;
如果您的代码在此之前做了任何奇怪的事情,您可以选择在此之前加上 select STDOUT;
,但对于您的 3 行测试脚本,不需要它。
【讨论】:
谢谢。这解决了问题。我想我对 Perl 的了解不如我应该了解的多。以上是关于为啥 ncat -exec 可以与 shell 脚本一起使用,但不能与 perl 脚本一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
shell 命名管道,进程间通信, ncat作http server