Выполнять несколько команд 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 не является терминалом.

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

  • Выход Capture (sdout / stderr) отправителя SSH-порта
  • Соединение SSH, дающее отказ в соединении
  • SSH: какой из них - мой открытый ключ
  • ssh config auto выполнить удаленную команду
  • Постоянная безопасность соединения SSH и практические последствия
  • SSH Основные проблемы с Debian
  • Если вы используете SSH на другом компьютере, как получить доступ к другим дисплеям X?
  • хранение ключей на вспомогательном съемном диске
  • 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 
    Linux и Unix - лучшая ОС в мире.