Выполнять несколько команд ssh с другим переключателем

У меня есть сценарий bash для копирования двух файлов с удаленной машины (которые я не могу контролировать), хранящихся в пути aa, который требует доступа root . Вот:

 ssh administrator@host "mkdir ${DIR}" ssh -t administrator@host "sudo su - root -c 'cp /path/for-root-only/data1/${FILENAME} ${DIR}/'" ssh administrator@host "mv ${DIR}/${FILENAME} ${DIR}/data1-${FILENAME}" ssh -t administrator@host "sudo su - root -c 'cp /path/for-root-only/data2/${FILENAME} ${DIR}/'" scp administrator@host:$DIR/{${FILENAME},data1-${FILENAME}} . ssh administrator@host "rm -r ${DIR}" 

Сценарий запрашивает тот же пароль много времени. Я попытался объединить все команды через этот документ, как это для ssh -t :

 ssh -t administrator@host << EOF mkdir ${DIR} sudo su - root -c 'cp /path/for-root-only/data1/${FILENAME} ${DIR}/' mv ${DIR}/${FILENAME} ${DIR}/data1-${FILENAME} sudo su - root -c 'cp /path/for-root-only/data2/${FILENAME} ${DIR}/' EOF scp administrator@host:$DIR/{${FILENAME},data1-${FILENAME}} . ssh administrator@host "rm -r ${DIR}" 

но есть это предупреждение:

Псевдотерминал не будет выделен, потому что stdin не является терминалом.

Я хотел бы спросить, есть ли способ написать этот скрипт, чтобы свести к минимуму количество запросов пароля

2 Solutions collect form web for “Выполнять несколько команд ssh с другим переключателем”

Вам не нужно делать это как документ ЗДЕСЬ (это то, что делает «материал»).

Вы можете просто сделать ssh remotehost "command1; command2 ; command3"

например

 % ssh localhost "date ; uptime ; echo hello" sweh@localhost's password: Tue Jul 19 08:07:48 EDT 2016 08:07:48 up 15 days, 31 min, 3 users, load average: 0.33, 0.33, 0.40 hello 

Однако scp не будет легко сливаться.

Таким образом, вы можете захотеть использовать аутентификацию с открытым ключом вместо аутентификации паролем (также называемую «ssh keys»). Обычно такие вещи автоматизированы.

Откройте соединение SSH один раз, а затем соедините его. Эта функция OpenSSH называется главными соединениями. См. Использование уже установленного SSH-канала

 ssh_control_socket="$(mktemp)" ssh -o ControlPath="$(ssh_control_socket)" -o ControlMaster=yes -o ControlPersist=yes administrator@host "mkdir ${DIR}" # other commands using ssh (ssh, scp, rsync, …): pass the same ControlPath option ssh -o ControlPath="$(ssh_control_socket)" -t administrator@host "…" rsync -e "ssh -o 'ControlPath=$(ssh_control_socket)'" … ssh -o ControlPath="$(ssh_control_socket)" administrator@host -O exit rm -f "$(ssh_control_socket)" 

Раздражающе, вам нужно явно передать параметр ControlPath при каждом вызове SSH (это имя файла, который используется для связи между каждым вызовом ssh и исходным SSH-клиентом, который сделал фактическое соединение). Здесь я передаю явное имя сокета, чтобы сценарий был автономным. Если полагаться на ~/.ssh/config , допустимо, добавьте эту строку в свой файл ~/.ssh/config :

 ControlPath ~/.ssh/%l_%h_%p_%r.multiplex 

Это позволяет каждому клиенту SSH проверить, существует ли существующее соединение для контрейлерных операций. Функция фактически не будет использоваться, если не будет подключения к -o ControlMaster=yes устройству прослушивания, вам все равно необходимо передать -o ControlMaster=yes (или -M для краткости) в первом соединении, то есть ваш скрипт может быть

 # Open the shared connection ssh -M -o ControlPersist=yes administrator@host : # … all SSH-relying commands in their basic form, they will go via the shared connection … # Close the shared connection ssh -O exit administrator@host 
  • Справка по настройке SSH / Не удается выполнить туннель
  • Запустить X на сервере через SSH
  • Java-процесс зависает с .exec и ssh
  • Как я могу решить, какой порт для входа в систему с SSH?
  • Изменение IP удаленно по ssh
  • Директива chroot в sshd_config не позволяет исключить пользователей
  • Как найти md5sum файлов на удаленных машинах, выполнив ssh?
  • Разница между «локальным переадресацией портов» и «динамической переадресацией портов»?
  • SSH завершает работу после выхода из сценария bash
  • scp / path / to / local / file myusername@server.com создает новый файл в локальном каталоге?
  • Разрешено публичное разрешение SSH (облачная платформа Google)
  • Обновите MOTD при регистрации ssh на Debian
  • Interesting Posts

    Как система привилегий файлов Unix отличается от системы Windows?

    После закрытия вкладки в терминале Gnome, как получить в ней историю команд?

    Как установить доменное имя в Crunchbang GNU / Linux?

    Как генерировать прерывание сигнала в файловом дескрипторе в Linux?

    Почему установка / usr / bin автоматически устанавливается в / usr / bin / X11?

    Исполняемые файлы показывают с символом * рядом с их именем в выводе ls

    Как проверить, имеет ли glob расширение?

    Можно ли использовать метафайлы в rtorrent?

    Как передать аргументы git из PKGBUILD?

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

    Программное обеспечение для сканирования не распознает мою Epson xp201 все в одном

    не удалось перемонтировать файловую систему в режим «только для чтения» после обновления пакета

    Установка последней r-базы из r-проекта

    Как найти, к чему относятся ссылки driver.mod.c?

    Создайте каталог с датой

    Linux и Unix - лучшая ОС в мире.