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

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

scp /mybackupdir/* backupuser@backupserver:/backup

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

5 ответов

Решение

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

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

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

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

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


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

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

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

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

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

Вы не можете предоставить пароль для scp с аргументом.

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

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

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

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 аргумент командной строки.

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

Другие вопросы по тегам