Сообщение tcsetattr: Input/output error
приходит от ssh , когда оно пытается перевести локальный терминал в «сырой» режим (который включает в себя вызов tcsetattr ; см. enter_raw_mode
in sshtty.c
, вызывается с client_loop
в clientloop.c
).
Из IEEE Std 1003.1, 2004 (Posix) Раздел 11.1.4: Контроль доступа к терминалу , tcsetattr может возвращать -1 с помощью errno == EIO
(т.е. «Input /ошибка вывода »), если вызывающий процесс находится в потерянной (или фоновой?) группе процессов.
Эффективно ssh пытается изменить настройку локального терминала, даже если он не находится вгруппа процессов переднего плана (из-за вашего fork и выхода из локального сценария (о чем свидетельствует видимое приглашение оболочки, которое появляется непосредственно перед сообщением об ошибке в вашем цитируемом выводе)).
Есливы просто хотите избежать сообщения об ошибке, вы можете использовать ssh -ntt
(перенаправить стандартный ввод из / dev / null, но в любом случае попросить удаленную сторону выделить tty) вместо ssh -t
(добавьте -l
и любые другие параметрыконечно, вам нужно вернуться обратно.
Скорее всего, вам интересно поддерживать работу локального сценария, пока некоторые из удаленных процессов все еще работают.Для этого вам нужно использовать функцию wait
(или одного из его «родственников»), чтобы дождаться завершения каждого разветвленного процесса перед выходом из программы, которая разветвила их (это сохранит их вгруппа процессов переднего плана, пока в них есть программа, которая их запустила).Возможно, вы все равно захотите использовать -n
, так как было бы странно, если бы несколько экземпляров ssh , которые вы разветвили, все пытались использовать (считывать или изменять настройки) локальный терминал нав то же время.
В качестве простой демонстрации вы можете сделать так, чтобы локальный скрипт выполнял sleep 30
после разветвления всех дочерних элементов, чтобы у команд ssh было время для запуска, покаони являются частью группы процессов переднего плана.Это должно подавить сообщение об ошибке, но оно не будет соответствовать вашей заявленной цели.Для этого вам нужно wait
(если я правильно понимаю вашу цель).