Могу ли я использовать редактор кода SSH vi с phpseclib? - PullRequest
0 голосов
/ 16 ноября 2018

Привет, мне интересно, могу ли я использовать редактор кода 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");
?>

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

В итоге я использовал 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");
0 голосов
/ 18 ноября 2018

Вы действительно можете использовать 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 вместо одного ...

...