Интерактивный сеанс ssh, запущенный с помощью команды bash

#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. Классно!. Второй вариант сработал для меня. Я собираюсь взглянуть на почту.