Bash: интерактивное дистанционное приглашение

У меня есть сценарий, который подключается к удаленному серверу и проверяет, установлен ли какой-либо пакет:

ssh root@server 'bash -s' < myscript.sh 

myscript.sh:

 OUT=`rpm -qa | grep ntpdate` if [ "$OUT" != "" ] ; then echo "ntpdate already installed" else yum install $1 fi 

Этот пример можно упростить. Вот myscript2.sh который имеет myscript2.sh же проблему:

 read -p "Package is not installed. Do you want to install it (y/n)?" choise 

Моя проблема в том, что bash не может читать мои ответы в интерактивном режиме.

Есть ли способ выполнить локальный скрипт удаленно, не теряя возможности запросить пользователя?

3 Solutions collect form web for “Bash: интерактивное дистанционное приглашение”

Попробуйте что-то вроде этого:

 $ ssh -t yourserver "$(<your_script)" 

-t заставляет tty-распределение, $(<some_file) считывает весь файл и в этом случае передает содержимое как один аргумент в ssh , который будет выполняться оболочкой удаленного пользователя.

Работает для меня, но не уверен, что это универсально.

Ваша проблема в том, что ssh запускает логин, неинтерактивную оболочку на удаленной машине. Очевидным простым решением было бы скопировать сценарий на удаленный сервер и запустить его оттуда:

 scp myscript.sh root@server:/tmp && ssh root@server /tmp/myscript.sh 

Если по какой-либо причине копирование не является вариантом, я бы изменил сценарий для первого подключения и проверил, установлен ли $1 , затем снова подключитесь и установите:

 OUT=$(ssh root@server rpm -qa | grep "$1"); if [ "$OUT" != "" ] ; then echo "$1 already installed" else read -p "Package $1 is not installed. Do you want to install it (y/n)?" choice if [ "$choice" -eq "y" ]; then ssh root@server yum install "$1" fi fi 

Вот хорошее объяснение .

Поэтому я адаптировал сценарий к

 hostname echo -n "Make your choice :" read choice echo "You typed " ${choice} echo done 

и это не сработало.

поэтому я переместил сценарий на удаленный компьютер, чтобы избежать локального перенаправления на ssh. (Мои команды находятся в файле с именем f )

 cat f | ssh user@remotehost.com 'cat >remf' ssh user@remotehost bash remf 

Это сработало. Вот результат:

 christian@clafujiu:~/tmp$ ssh localhost bash tmp/f christian@localhost's password: Linux clafujiu 2.6.32-52-generic #114-Ubuntu SMP Wed Sep 11 19:00:15 UTC 2013 i686 GNU/Linux Sun Nov 10 14:58:56 GMT 2013 Make your choice :abc You typed abc done 

Поскольку @terdon упомянул, что первоначальное намерение заключалось в удаленном запуске локальных скриптов, удаленная копия может быть автоматизирована, это всего лишь один пример на одной строке.

 REMID=`cat f |ssh user@remotehost 'cat > remf_$$; echo $$'` ;ssh root@redtoadservices.com "bash remf_${REMID} ; rm -v remf_${REMID}" 
  • vim: Синтаксис синтаксиса с помощью аргумента командной строки
  • Присоединитесь к интерактивному сеансу процесса, запущенного из rc.local
  • Сделайте tar из файла / dev / stdin
  • Безопасно ли вводить другую команду в STDIN, пока предыдущая команда записывает в STDOUT?
  • автоматически записывать ответы на программу, которая уже читает со стандарта в
  • Как «меньше» файла с именем «-»?
  • Неожиданное поведение сценария оболочки
  • Передача данных в stdin процесса без возникновения EOF впоследствии
  • Как расколоть stdin в несколько многострочных строк и поместить каждый из них в разные переменные bash
  • Почему некоторые команды не читаются со своего стандартного ввода?
  • "Openssl dgst -sha1", создающий посторонний "(stdin) =" префикс и завершающий символ новой строки
  • Linux и Unix - лучшая ОС в мире.