2010-02-24 5 views
3

птара инструмента имеет такую ​​особенность - когда вы выполняете сканирование [#nmap -A -T4 LOCALHOST] и нажмите кнопку «Enter» - отображает вид статуса информация "Сроки: около 6,17% сделано"Баша повторно эмулировать нажатие на proceess

Вопрос: как я могу заставить это нажатие клавиши повторяться, не касаясь клавиатуры в оболочке борна?

ps: просто пытается найти обход для ошибки в функции proc_open php, когда stdout процесса возвращается только после закрытия stdout pipe, а эмуляция 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

yup, попробовал это не повезло – johnrembo

+0

Поскольку вы использовали ожидаемое решение, дайте Дугласу соответствующий бонус, выбрав его ответ как тот, который помог. Хорошо, что вы добавили свое решение на вопрос - спасибо за это. –

ответ

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? Их обычно можно избежать, используя -regexp, соответствующий команде expect.

Полезно Ожидайте подсказки: при разработке используйте exp_internal 1, чтобы подробно увидеть, как ваши шаблоны соответствуют выходному сигналу команды.

+0

glenn, thanx для подсказок – johnrembo