#bash #ssh #xargs
Вопрос:
Я пытаюсь запустить интерактивный сеанс ssh, созданный с помощью команды bash (как показано ниже).
Если я не добавлю «ttt», я просто получу сообщение о сеансе «неинтерактивный», и сеанс ssh будет закрыт.
После добавления флага » ttt » сеанс остается открытым, но я не могу вводить команды или взаимодействовать с удаленным сеансом.
Это упрощенная версия команды, которую я пытаюсь выполнить
echo "username@host" | xargs -I{} bash -x -c 'ssh -ttt" $0' {}
Не уверен, есть ли дополнительный флаг, который следует добавить, или альтернативный способ сделать это.
Ответ №1:
Вход в xargs
(и, следовательно bash
, и, следовательно ssh
) поступает из канала, а не с вашего терминала. В зависимости от более широкого контекста, один из этих вариантов должен работать, чтобы разрешить ssh
чтение с терминала:
- Сначала запишите список хостов в массив, а затем используйте
for
цикл вместоxargs
. Что-то вроде этого:readarray -t hostarray < <(echo "username@host") for host in "${hostarray[@]}"; do ssh "$host" done
- Добавьте
-o
опцию вxargs
, которая указывает ему перенаправить stdin команды из /dev/tty (т. е. терминала). - Перенаправьте обычный stdin вокруг
xargs
команды с помощью другого файлового дескриптора, например #3 (примечание: я это не проверял):{ echo "username@host" | xargs -I{} bash -x -c 'ssh -ttt "$0" <amp;3' {}; } 3<amp;0
Кстати, в дополнение к проблемам с ssh
неполучением ввода, который он должен был получить (т. Е. с терминала), у вас также могут возникнуть проблемы с кражей ввода, предназначенного для чего-то другого, например, части списка хостов, которые вы хотели xargs
прочитать. Смотрите BashFAQ #89: Я читаю файл строчка за строчкой и запускаю ssh или ffmpeg, обрабатывается только первая строка!
Комментарии:
1. Классно!. Второй вариант сработал для меня. Я собираюсь взглянуть на почту.