Привет, мне интересно, могу ли я использовать редактор кода vi, когда подключен к phpseclibs SSH2. Моя цель — иметь возможность запускать скрипт PHP и обновлять значения файла конфигурации. Я могу подключиться через SSH, но ничего, что я ввожу в сценарий после слов, похоже, ничего не меняет в целевом файле конфигурации.
Это то, что я до сих пор.
<?php
require __DIR__ . '/vendor/autoload.php';
use phpseclib\Net\SSH2;
//simulate pressing the escape key
$esc = chr(27);
$ssh = new SSH2('ip address');
if(!ssh->login('username', 'password')){
exit('Login Failed');
}
sleep(5);
//enter vi editor
$ssh->write("vi file address\n");
sleep(5);
//"/"enables seach mode in vi editor
$ssh->write("/seachword\n");
sleep(1);
//clears line in vi editor
$ssh->write("cc");
sleep(1);
//enter in new word on that empty line
$ssh->write("replacement word");
sleep(1);
//simulates pressing the esc key
$ssh->write("$esc");
sleep(1);
//saves and closes the vi editor
$ssh->write(":wq\n");
?>
Вы действительно можете использовать vi
с phpseclib, но я бы порекомендовал против этого. Для сценариев вы бы лучше использовать СЕПГ или же 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
вместо одного …
В итоге я использовал sed для редактирования файла конфигурации, и он отлично работает, спасибо, Нойберт. вот что я использую.
$ssh = new SSH2('IP');
if (!$ssh->login('username', 'password')) {
exit('Login Failed');
}
$ssh->exec("sed -i -e 's/text to find/replacement text/g' /path/and/name");