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)
- [1] В случае OpenSSH, например, ~/.ssh/id_dsa и ~/.ssh/id_dsa.pub. Содержимое последнего должно быть добавлено к ~/.ssh/authorized_keys на стороне сервера
- [2] https://stackoverflow.com/questions/19101879/bash-expect-script-for-ssh
- [3] https://stackoverflow.com/questions/112396/how-do-i-remove-the-passphrase-for-the-ssh-key-without-having-to-create-a-new-ke
Вы не можете предоставить пароль для 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.