У меня есть 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?
В Вашем упрощенном примере у Вас есть два процесса (Ваша оболочка и кошка) пытающийся читать из “ведомой” стороны 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
)