Сценарий оболочки для 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 .

  • Как установить apt-get или YUM в Mac OS X
  • Создайте пользователя, который может получить доступ только к одному каталогу
  • Можно ли перечислить только определенные подкаталоги?
  • Использование grep в условном выражении в bash
  • Как создать Lynx с SSL на Mac OS X?
  • Как выводить файл и игнорировать строки, начинающиеся с «?»?
  • После некоторой помощи Стивена Китта и 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, он зависает. (вероятно, в том же месте, но просто не видно)

  • Объединение аргументов bash в одну строку с пробелами
  • Как удалить слова, заканчивающиеся буквой S, если дубликаты без S на конце находятся в одном списке?
  • Какова полезность команды: в сценариях оболочки, учитывая, что она явно ничего не делает?
  • Замените все вхождения символа в переменной с помощью скрипта korn
  • Как я могу направить что-то меньше на ssh?
  • Как я могу «лениво» читать вывод из xrandr?
  • 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 - лучшая ОС в мире.