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

  • Почему моя попытка пересылки X11 завершилась с ошибкой «connect /tmp/.X11-unix/X0: нет такого файла или каталога»?
  • SSH в моей локальной сети - проблема с логином
  • Как я могу сделать ssh игнорировать .ssh / config?
  • Невозможно туннелировать через ssh без команды / получения оболочки
  • Перенаправление портов для удаленного хоста на локальной машине
  • Имя пользователя и пароль в командной строке с помощью sshfs
  •  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 не является терминалом.

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

  • Буфер обмена через сеанс SSH через VIM
  • Вход через ssh в последнюю использованную папку
  • ssh работает, но sftp не делает
  • Как мы можем ограничить влияние зондов ssh?
  • Как ограничить пользователей ssh ​​только для просмотра / home /% u contents
  • ssh для private-ip
  • 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 - лучшая ОС в мире.