2010-02-24 14 views
3

NMAP工具具有这样的功能 - 当你执行扫描[#nmap -A -T4本地主机],然后按“Enter”键 - 它显示一种状态信息“时间:约6.17%完成”bash命令对一个proceess反复模拟按键

问题 - 我怎么能强制这个按键重复发生,而无需触摸Bourne shell中的键盘?

ps:试图找到解决php的proc_open函数中的错误的解决办法,只有在关闭标准输出管道后才返回进程的标准输出,而且php的pty模拟在fbsd上不起作用。

问题已关闭。问题解决了与“预期”实用

#!/usr/local/bin/expect 

spawn /usr/local/bin/nmap -A -T4 -p 21-100 localhost 
expect arting {sleep 3; send \r} 
while {1} { 
     expect eof { 
      send_user "finished\n"; 
      exit; 
     } "done;" { 
      sleep 3; 
      send \r; 
      continue; 
     } 

} 
+0

你是否因为某些输出缓冲而犯规?也许尝试fflush()? –

+0

是的,试过没有运气 – johnrembo

+0

由于您确实使用了基于期望的解决方案,请选择他的答案作为帮助,为Douglas提供适当的奖励。这是很好的,你增加了你的解决方案的问题 - 谢谢你这样做。 –

回答

3

大概是最容易使用expect

1

也许最终的'是的男人'计划会做你所需要的 - 该计划被称为'是',并反复产生相同的输入线。

yes ok | recalcitrant.php 

这会经常发送'ok'加换行符给顽固PHP。它受限于接收程序读取其输入的速度。它可以在GNU实用程序和大多数其他基于Unix的平台上使用。

如果您需要在处理任何情报,虽然,那么基于TCL的expect

+0

nope - 这个也不起作用。我现在正在努力深入挖掘“期望”世界 – johnrembo

+0

@johnrembo:坦率地说,我并不十分惊讶,它不会满足您的需求。事实上,我不认为我经常发现它有用。尽管如此,它存在并且如果它能够满足你的需要,没有什么比这更简单的了。但是如果你在输出中需要任何适应性,那么'期望'可能就是你需要的。 –

+0

仍然 - 我发现“是”实用程序非常有用(呃,不适用于这种特殊情况) - 无法想象我到现在为止还不知道如何存在这样的事情(是的,是使用放置在“输入”键) – johnrembo

1

注意,你可以摆脱无限循环:

spawn /usr/local/bin/nmap -A -T4 -p 21-100 localhost 
expect arting {sleep 3; send \r} 
expect { 
    "done;" { 
     sleep 3 
     send \r 
     exp_continue 
    } 
    eof 
} 
puts "finished" 

你确定你需要sleep s?通常可以通过使用与expect命令匹配的-regexp来避免它们。

有用期待提示:在开发过程中,请使用exp_internal 1详细了解您的模式如何与命令输出匹配。

+0

glenn,thanx为提示 – johnrembo