Вход перенаправления от одного терминала до другого

У меня есть sshed в поле Linux, и я использую dvtm и удар (хотя я также попробовал это экраном Gnu и ударом). У меня есть два терминала, текущий/dev/pts/29 и/dev/pts/130. Я хочу перенаправить вход от одного до другого.

Из того, что я понимаю в/dev/pts/130, я могу ввести:

cat </dev/pts/29

И затем то, когда я ввожу в/dev/pts/29 символы, я ввожу, должно обнаружиться в/dev/pts/130. Однако то, что заканчивает тем, что произошло, - то, что любой символ, который я ввожу, перенаправляется. Например, если я ввожу "привет", я получаю это:

/dev/pts/29        |        /dev/pts/130

$                  |        $ cat </dev/pts/29
$ el               |        hlo

Это действительно печально, поскольку я должен сделать это для перенаправления io процесса, работающего в gdb (я попробовал и выполненный/dev/pts/# и набор, нижний-tty/dev/pts/#, и оба привели к вышеупомянутому поведению). Я делаю что-то не так, или действительно ли это - ошибка в bash/screen/dvtm?

7
задан 26.05.2010, 21:28

1 ответ

В Вашем упрощенном примере у Вас есть два процесса (Ваша оболочка и кошка) пытающийся читать из “ведомой” стороны tty. Результат состоит в том, что один процесс получает некоторые символы, другой получает другие.

Под чем Вы подразумеваете, “перенаправляют вход от одного [терминал] к другой”? В Вашей реальной ситуации, что процессы пытаются считать из каждого терминала? Что Вы хотите сделать со своим полученным входом, после того как у Вас есть он? Что, точно, Вы на самом деле пытаетесь выполнить?

Мне, “перенаправляют io процесса, работающего в gdb”, больше походит на повторное открытие stdin/stdout/stderr в процессе, который уже работает.

Можно изменить stdin/stdout/stderr рабочего процесса со (среди прочего) GDB. Ответ для “Перенаправления STDERR / STDOUT процесса ПОСЛЕ ТОГО, КАК это было запущено, с помощью командной строки?” шоу, как это может быть сделано. Вы хотели бы заменить tty путем /dev/null в ответе, и Вы, вероятно, хотите обработать stdin также, но техника все еще применима.


Необходимо смочь заставить упрощенный пример работать надежно, но я не убежден, что он делает то, что Вы на самом деле хотите сделать (имейте в виду, что псевдотерминал является на самом деле парой устройств, как два конца двунаправленного канала; но весь Ваш пример делает он взаимодействует с 'ведомыми' половинами).

Ключ к фиксации Вашего примера должен заставить всех кроме одного из конкурирующего процесса (временно) останавливать чтение от терминала. Если бы, как Ваш пример, у Вас есть оболочка, работающая на стороне, с которой требуется собрать данные, то можно сделать что-то вроде этого:

(
    s="$(stty -g)"
    exec 3<&0
    trap 'stty "$s" 0<&3;exit' 0 INT QUIT

    cat <<EOM
In some other terminal, run the command

    cat <$(tty)

Press ^C or ^\ to quit.
EOM

    stty raw isig brkint susp '' dsusp ''
    while true; do sleep 3600; done </dev/null
)
8
ответ дан 07.12.2019, 14:57

Теги

Похожие вопросы