Назад | Перейти на главную страницу

scp внутри sh-скрипта с парольной фразой

У меня есть sh-скрипт для бэкапа

scp /mybackupdir/* backupuser@backupserver:/backup

Есть ли простой способ добавить кодовую фразу в scp? Или мне нужно проверить, запущен ли ssh-agent, а если нет, запустить его и добавить ключ?

Вы не можете указать парольную фразу для scp с аргументом.

Однако вы можете использовать аутентификацию по ключу: ssh-keygen сгенерирует пару ключей rsa для аутентификации ssh-copy-id скопирует ваш открытый ключ на другой хост.

если вы не можете или не хотите использовать аутентификацию по ключам, вы можете написать сценарий ожидания и указать кодовую фразу из этого сценария. Это не самый безопасный способ реализовать это!

Для начала разберемся с некоторыми фактоидами, которые легко запутать:

  • SSH (и, следовательно, scp) поддерживает различные методы аутентификации. Двумя наиболее популярными на сегодняшний день являются «пароль» и «публичный ключ».
  • Если используется «открытый ключ», то на стороне клиента должен быть частный и общественный ключевой файл [1]. В частный можно или нельзя зашифровать парольную фразу
  • Когда используется метод «открытого ключа», ssh-agent может хранить в памяти закрытые ключи. Это может быть удобно, когда файл с секретным ключом зашифрован, и никто не хочет снова и снова вводить его парольную фразу. Но ssh-agent не поможет там, где используется метод аутентификации на основе пароля.

В контексте SSH, когда люди используют термин ...

  • ... "пароль", они обычно означают метод аутентификации на основе пароля
  • ... "парольная фраза", они обычно означают парольную фразу, с помощью которой зашифрован файл закрытого ключа

... но, конечно, это всего лишь условность и большой источник путаницы.


Тем не менее, я пытаюсь ответить на ваш вопрос:

Если вы имеете в виду аутентификацию SSH на основе пароля:

  • Используйте клиентское программное обеспечение, которое позволяет предоставить пароль SSH в пакетном режиме (например, как параметр командной строки, как STDIN или как переменную среды). OpenSSH НЕ поддерживает это!
  • Или оберните сценарий 'expect' вокруг ssh / scp, как описано в [2].
  • Или переключитесь с аутентификации на основе пароля на аутентификацию с открытым ключом.

Если вы имеете в виду аутентификацию с открытым ключом с файлом секретного ключа, зашифрованным с помощью парольной фразы:

  • Удалите защиту парольной фразы из файла закрытого ключа, см., Например, [3].
  • Или предварительно загрузите ключ вручную в ssh-agent и убедитесь, что (а) ssh-агент все еще жив, когда скрипт запускается, и (б) скрипт может найти unix-сокет агента ($ SSH_AUTH_SOCK)

Вы должны прочитать этот пост:

3 шага для выполнения входа по SSH без пароля с помощью ssh-keygen

и вы можете изменить свой сценарий на это:

rsync --rsh='ssh -p(Type your SSH port)' -av /yourBackupDir backupUser@backupserver.example.com:/backup | mail -s "backup on `hostname`" your@email.account

Для аутентификации по публичному ключу вам не нужен ssh-agent. Вы можете просто передать требуемый ключ в ssh или scp с -i аргумент командной строки.

Если вы не хотите, чтобы кодовая фраза запрашивалась, введите пустую парольную фразу (это не пароль ни исходной, ни удаленной системы) при создании пары ключей (rsa) (общедоступный-частный) с помощью ssh-keygen.