我可以将 SSH vi 代码编辑器与 phpseclib 一起使用吗?

Can I use the SSH vi code editor with phpseclib?

嘿,我想知道在连接 phpseclibs SSH2 时是否可以使用 vi 代码编辑器。我的目标是能够 运行 一个 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 一起使用,但我真的不建议这样做。对于可脚本化的东西,你最好使用 sed or awk.

也就是说,它是 none-最不可能的,如下所示:

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 的所有版本是否都会 return 用于以相同顺序构建 UI 的 ANSI 转义码。

此外,奇怪的是你用 vi 打开两个文件而不是一个...

我最终使用 sed 编辑配置文件,效果很好,谢谢 neubert。这是我正在使用的。

$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");