Описание тега command-history
Я не думаю, что вы можете обойти это.
С -ТТ
, демон
порождает псевдо-терминала и делает рабом частью на stdin, stdout и stderr оболочки, которая выполняет удаленные команды.
министр внутренних дел Великобритании
говорится, что исходя из его (один) FD в основной части псевдо-терминала и отправляет их (через один канал) с помощью SSH
клиента. Нет второго канала для stderr как есть без -Т
.
Кроме того, обратите внимание, что терминал линии дисциплины псевдо-терминал может (и по умолчанию) изменить выход. Например, если будут преобразованы в символы не экранируются там, а не на локальном терминале, так что вы можете отключить вывод пост-обработки.
$ СШ имени localhost 'Эхо х' | в HD качестве
00000000 78 0а |х.|
00000002
$ СШ -Т имени localhost 'Эхо х' | БГ
00000000 78 0а 0d с |х..|
00000003
$ СШ -Т имени localhost 'действовать до его закрытия -opost; Эхо х | БГ
00000000 78 0а |х.|
00000002
Гораздо больше вещей будет на стороне входа (например, ^с
персонажа, который будет вызывать сигнал SIGINT, но и другие сигналы, эхо и все погрузочно-разгрузочные работы, участвующие в каноническом режиме строковый редактор).
Вы могли бы перенаправить stderr в FIFO и извлечь его с помощью второго СШ
:
СШ-ТТ хост mkfifo ФИФО && ЦМД 2> ФИФО' &
SSH хост кот ФИФО' >&2
Но лучше ИМО можно было бы избежать, используя -т
в целом. Это действительно предназначена только для интерактивного использования от реального терминала.
Вместо того, чтобы полагаться на передачу ^C, чтобы позволить удаленного конца закрывается соединение, вы могли бы использовать оболочку, которая делает опрос()
, чтобы обнаружить убитого СШ
или соединение закрыто.
Может, что-то вроде (упрощенно, вы захотите добавить некоторые проверки ошибок):
LC_HUP_DETECTOR='
использовать ИО::опрос;
$Сиг{детский} = суб {$молодец = 1};
$п = ИО::опрос->новый;
$Р->маска(поток stdout, Поллина);
$идентификатор процесса=вилка; если($пид) {setpgrp; метод exec @АГДУ; умирает "старпома: $!\Н"}
опрос $Р ->;
убить сигнал SIGHUP, -$пид, если $сделано;
подождите, выход ($?&127 ? 128+($?&127) : 1+$?>>8)
'хост SSH 'на Perl -е "$LC_HUP_DETECTOR" некоторые УМК'
В переменной$P->маска(поток stdout, Поллина)
выше может показаться глупым, но идея в том, чтобы ждать вешать-хап мероприятия (для чтения конец трубы в stdout должен быть закрыт). POLLHUP как просил Маска игнорируется. POLLHUP имеет смысл только в качестве возвращаемого события (рассказывать, что писать конец был закрыт).
Мы должны дать ненулевое значение маски события. Если мы используем 0
, на Perl
даже не позвонил опрос
. Поэтому здесь мы используем Поллина.
На Linux, что бы вы не попросили, если труба будет сломана, poll() возвращает POLLERR.
В Solaris и FreeBSD, где трубы работают в двух направлениях, когда читаешь конец трубы (который является также написание заканчиваются) закрыт, он возвращается с POLLHUP (и Поллина на FreeBSD, в которой вам предстоит запросу Поллина или $Р->опрос()
не возвращает).
Я не могу сказать, как портативный это в противном случае за пределами этих трех операционных систем.