Вы действительно можете использовать vi
с phpseclib, но я действительно рекомендую против этого. Для сценариев вам лучше использовать sed или awk .
Тем не менее, это, тем не менее, возможно, как показывает следующее:
function waitForVertical($ssh)
{
$output = $ssh->read(
'#' .
"\x1B\[\d+C" . // move cursor right n lines
"(?:All|Top|\d\d%|Bot)" .
"\x1B\[\d+;\d+H" . // move cursor to screen location v,h
'#',
SSH2::READ_REGEX
);
if ($ssh->isTimeout()) {
throw new \Exception('Timeout');
}
}
function waitForHorizontal($ssh)
{
$output = $ssh->read(
'#' .
"\x1B\[\d+;\d+H" . // move cursor to screen location v,h
"\d+" .
"\x1B\[\d+;\d+H" . // move cursor to screen location v,h
'#',
SSH2::READ_REGEX
);
if ($ssh->isTimeout()) {
throw new \Exception('Timeout');
}
}
$ssh = new SSH2('127.0.0.1', 2222);
if(!$ssh->login('vagrant', 'vagrant')){
exit('Login Failed');
}
$start = microtime(true);
$ssh->read('vagrant@vagrant:~$');
// enter vi editor
$ssh->write("vi file address\n");
waitForVertical($ssh);
// "/"enables seach mode in vi editor
$ssh->write("/seachword\n");
waitForVertical($ssh);
// clears line in vi editor
$ssh->write('cc');
waitForVertical($ssh);
// enter in new word on that empty line
$ssh->write('replacement word');
waitForHorizontal($ssh);
// hit escape button
$ssh->write("\x1B");
waitForVertical($ssh);
// saves and closes the vi editor
$ssh->write(":wq\n");
$ssh->read('vagrant@vagrant:~$');
$elapsed = microtime(true) - $start;
echo "took $elapsed seconds\n";
Обратите внимание, как я не использую sleep
, в то время как вы. Теоретически, я думаю, что лучше дождаться конкретного вывода, чем просто sleep
. Конечно, даже тогда, кто скажет, будут ли все версии vi
возвращать управляющие коды ANSI, которые используются для построения пользовательского интерфейса в том же порядке.
Также странно, что вы открываете два файла с помощью vi
вместо одного ...