bash命令反复模拟进程上的按键

时间:2010-02-24 15:24:22

标签: bash unix shell command-prompt expect

nmap 工具具有此功能 - 当您执行扫描[#nmap -A -T4 localhost]并按“Enter”时 - 它会显示一种状态信息“时间:约6.17%完成”

问题 - 如何在不触及bourne shell键盘的情况下强制重复发生此按键?

ps:只是在php的proc_open函数中找到一个解决方法,只有在关闭stdout管道后才返回进程的stdout,并且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;
        }

}

3 个答案:

答案 0 :(得分:3)

可能最容易使用expect

答案 1 :(得分:1)

也许最终的'是的'程序会做你需要的 - 程序被称为'是'并反复生成相同的输入行。

yes ok | recalcitrant.php 

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

如果您在处理过程中需要任何智能,那么基于Tcl的“expect

答案 2 :(得分: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吗?通常可以使用-regexpexpect命令匹配来避免它们。

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