Сценарий оболочки для ssh на сервер Unix / Linux из MacOS X 10.10

Я пытаюсь выполнить ssh на сервере, используя скрипт bash из MacOSX.

#!/bin/bash spawn ssh username@gatewayserver expect "password" send "Mypassword\r" interact spawn ssh username@storageserver expect "password" send "Mypassword\r" interact cd /path spawn scp -r retrievedfolder username@gatewayserver:/path/ expect "password" send "Mypassword\r" interact exit exit spawn scp -r username@gatewayserver:/path/retrievedfolder . expect "password" send "Mypassword\r" interact spawn ssh username@gatewayserver expect "password" send "Mypassword\r" interact rm -r retrievedfolder/ exit mv -nv -- "$retrievedfolder" "$retrievedfolder.$(date +%Y%m%d)" mv /retrievedfolder /backup 

Если вы можете следовать, вероятно, избыточному коду, цель заключалась в том, чтобы войти на сервер шлюза, чтобы добраться до сервера хранения. cd в соответствующую папку. безопасную копию папки, которую я хочу в каталог на сервере шлюза, а затем скопируйте файл с сервера шлюза на рабочий стол. Затем я хочу удалить загруженную папку с сервера шлюза (ограничения хранилища) и переместить скопированную папку в папку на рабочем столе с текущей датой, добавленной в конец имени файла. Я думаю, что большая часть того, что я написал, должна работать, если я запускаю Linux, но bash на MacOS не распознает send или interact и ищет файл или каталог после expect .

После некоторой помощи Стивена Китта и webKnjaZ мой код выглядит примерно так:

 #!/bin/bash ssh username@gatewayserver 'ssh username@storageserver; cd /path/; scp -r retrievedfolder username@gatewayserver:/path/' scp -r username@gatewayserver:/path/retrievedfolder . ssh username@gatewayserver 'rm -r retrievedfolder/' mv -nv -- "retrievedfolder" "retrievedfolder.$(date +%Y%m%d)" mv retrievedfolder.$(date +%Y%m%d)/ backup/ 

После правильной настройки SSH без пароля он работает почти правильно. Без ssh -tt это дает мне сообщение об ошибке: «Pseudo-terminal не будет выделен, потому что stdin не является терминалом». С помощью ssh -tt он останавливается в командной строке после входа во второй сервер, и когда я использую ssh -T, он зависает. (вероятно, в том же месте, но просто не видно)

  • Как указать на папку ssh с закрытыми ключами, чтобы автоматически выбрать один?
  • Как скопировать между двумя удаленными узлами, используя tar, переданные в SSH с удаленного сервера, когда за брандмауэром?
  • В сеансе tmux невозможно подключиться к X-серверу после ssh'ing
  • ssh-add добавить все закрытые ключи в .ssh каталог
  • SSHD_CONFIG продолжает разлагаться при обратном настройке SSH
  • Исходный файл bashrc не работает с ssh -t
  • Установить порты для подключения ssh к удаленному малине Pi
  • Продолжить цикл с помощью клавиатуры
  • 3 Solutions collect form web for “Сценарий оболочки для ssh на сервер Unix / Linux из MacOS X 10.10”

    Я думаю, вы просто пытаетесь скопировать файлы с сервера за NAT через gatewayserver .

    Я бы предложил вам более простое решение.

    1. Настройте аутентификацию без пароля (поместите закрытый ключ с вашего рабочего стола / Mac на оба упомянутых сервера)
    2. Используйте что-то вроде

       ssh -MNf -L 60022:storageserver:22 username@gatewayserver 

      настроить туннель ssh через gatewayserver . Теперь ваш порт Mac 60002 имеет прямое соединение с портом 22 storageserver .

    3. На этом этапе вы можете копировать файлы напрямую через этот туннель:

       scp -P 60022 -R username@localhost:/path/to/folder . 

    Поместите эти команды в свой сценарий bash, и вы достигнете того, чего хотите.

    UPD:

    Сложив все это, вот полный сценарий:

     #!/bin/bash # set up tunnel ssh -MNf -L 60022:storageserver:22 gatewayserver_username@gatewayserver || true # copy files __directly__ into correct backup folder scp -P 60022 -R "storageserver_username@localhost:/remote/path/to/retrievedfolder/at/storageserver" "/local/path/to/backup/retrievedfolder.`date +%Y%m%d`" 

    Предварительные требования (запустите только один раз на вашем Mac):

     # Create SSH keys @ local machine ssh-keygen # Put your local SSH key to the gateway server ssh-copy-id gatewayserver_username@gatewayserver # Enable tunnel (will not ask your password if previous steps are correct) ssh -MNf -L 60022:storageserver:22 gatewayserver_username@gatewayserver # Put your local SSH key to the storageserver server ssh-copy-id -p 60022 storageserver_username@localhost 

    Если вы посмотрите на Shell Script для входа в ssh-сервер, вы заметите, что строка shebang

     #!/usr/bin/expect 

    Это сценарий expect , а не сценарий bash . Вам нужно будет установить Expect, если у вас его еще нет.

    Чтобы еще больше упростить:

    Во-первых, вы должны использовать ключи, а не пароли (которые вы сейчас делаете).

    Во-вторых, добавьте следующее в свой файл ~/.ssh/config

     Host storageserver ProxyCommand ssh gatewayserver nc %h %p 

    В-третьих, используйте rsync чтобы ваш скрипт стал одной командой:

     rsync -havz storageserver:/path/retrievedfolder/ backup/retrievedfolder.$(date +%Y%m%d) 

    Это честный бит короче начальной точки!

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