Изменить размер псевдо-терминала, выделенного php - PullRequest
1 голос
/ 01 августа 2020

Я пытаюсь разработать веб-консоль, используя php и xterm. js,

Мне удалось получить выделенный псевдо-tty и прикрепить его к xterm. js через веб-сокет, но я не могу сказать процессу, каков размер терминала, чтобы он работал правильно с этим размером, и я не смог найти для этого никакой документации.

// using react/child-process
$process = new Process('/usr/bin/env bash -l', null, null, [
    0 => ['pty', 'r'],
    1 => ['pty', 'w'],
    2 => ['pty', 'w'],
]);
$process->start($this->loop);

1 Ответ

0 голосов
/ 03 августа 2020

Я обнаружил, что run stty на выделенных devpts сделает трюки

if (isset($this->processes[spl_object_id($conn)])) {
    $process = $this->processes[spl_object_id($conn)];
    $data = unpack('i3', $raw);
    $col = $data[2];
    $row = $data[3];
    $getstream = (function () {
        return $this->stream;
    });
    $stty = new Process("stty cols $col rows $row", null, null, [
        $getstream->call($process->stdin), // ex: /dev/pts/0
        $getstream->call($process->stdout),
        $getstream->call($process->stderr),
    ]);
    $stty->start($this->loop);
}

в качестве альтернативы может сделать это

use React\ChildProcess\Process;
$gettty = escapeshellcmd(PHP_BINARY).' -r "echo posix_ttyname(STDIN).PHP_EOL;"';
$bash = "setsid bash -l"; // setsid is important here
$process = new Process(
    "$gettty && $bash",
    null, null,
    [
        ['pty', 'r'],
        ['pty', 'w'],
        ['pty', 'w'],
    ]
);
// TODO: read the first line and get the tty path so can run stty on it later.

Вот простой пример: https://gist.github.com/eslym/d3bd7809681aa9c1eb34913043df9bb6

...