Автоматизируйте SSH без использования аутентификации с открытым ключом или expect(1)

StackOverflow https://stackoverflow.com/questions/271090

Вопрос

Есть ли способ автоматически передать пароль по ssh?Я хотел бы автоматически подключиться по ssh к серверу без используя аутентификацию с открытым ключом или ожидаемые скрипты, каким-то образом заставляя ssh считывать пароль из stdin или файла.

Причина, по которой это должно быть так, заключается в том, что я хотел бы создать резервную копию своих файлов на сервере, используя rsync / ssh, работающий как задание cron.Этот сервер монтирует мой домашний каталог после это аутентифицирует меня, поэтому использование аутентификации с открытым ключом не работает, поскольку ~/.ssh недоступен до тех пор, пока вход в систему не будет успешным.ожидать (1) не может быть и речи, потому что я хотел бы запустить его как задание cron, а поскольку задания cron не выполняются под терминалом, комбинация expect / ssh просто не работает.У меня нет root-доступа к этому серверу, и было бы трудно заставить администраторов вносить какие-либо изменения в то, как там все работает.

Это было полезно?

Решение

Используйте sshpass .

Например, когда пароль находится в файле password.txt :

sshpass -fpassword.txt ssh username@hostname

(взято из ответа на похожий вопрос )

Другие советы

  

ожидать не может быть и речи, потому что я хотел бы запустить его как задание cron,   и поскольку задания cron не запускаются под терминалом, комбинация wait / ssh   просто не работает

Вы можете запускать ожидаемые сценарии из cron, по крайней мере, вы можете использовать ожидаемые библиотеки, такие как " pexpect " для Python. Я только что проверил это, чтобы подтвердить, запустив скрипт pexpect scp / ssh из cron, и мне удалось успешно скопировать файл из скрипта Python, запущенного в cron.

Пример кода:

#!/usr/bin/python

import pexpect

FILE="/path/to/file"
REMOTE_FILE=""
USER="user"
HOST="example.com"
PASS="mypass"
COMMAND="scp -oPubKeyAuthentication=no %s %s@%s:%s" % (FILE, USER, HOST, REMOTE_FILE)

child = pexpect.spawn(COMMAND)
child.expect('password:')
child.sendline(PASS)
child.expect(pexpect.EOF)
print child.before

Вместо передачи своего пароля используйте систему открытых / закрытых ключей.Добавьте открытый ключ для компьютера в список авторизованных ключей на всех компьютерах, к которым вы хотите подключиться.Используя этот метод, SSH может автоматически проверять ключи, и пароль не требуется.

Инструкции вы можете найти здесь: http://linuxproblem.org/art_9.html

Поскольку я только что более внимательно прочитал вопрос, возможно, вы захотите поискать другой SSH-клиент, который поддерживает аутентификацию по паролю без взаимодействия с пользователем.Мне быстрый поиск в Google намекнул, что они существуют (http://www.derkeiler.com/Newsgroups/comp.security.ssh/2004-12/0134.html)

Связанные с Stackoverflow вопросы:

В этой дискуссии рассказывается о том, что вы пытаетесь сделать:

http://cygwin.com/ml/cygwin/2004-02 /msg01449.html

Если администратор не может создать для вас локальный каталог, это не сработает.

SSH требует «прыжка веры» чтобы обезопасить первоначальное рукопожатие от будущего вмешательства. (Вы изначально доверяете ключу, который дает вам сервер)

Один из доступных в настоящее время, но малоизвестных подходов - это использование SSH-SRP. При этом используются взаимные знания пароля для аутентификации вас и предоставления ключей шифрования сеанса, необходимых для безопасного шифрования вашего сеанса SSH.

Это НАМНОГО более безопасно, чем первоначальный SSH "доверяй мне" и не требует длительного хранения ключей.

Не используйте ожидаемость, pexpect и т. п. для ввода пароля. Если вы это сделаете, ваш пароль должен быть где-то в незашифрованном виде, что на самом деле может быть менее безопасным, чем использование пары открытый / закрытый ключ без пароля. И это еще работа!

Прочитайте эту страницу из " SSH: Полное руководство " для обсуждения ваших вариантов: http://www.snailbook.com/faq/no-passphrase.auto. HTML

Вы неправильно поняли, как работает аутентификация с открытым ключом. Вам не нужен доступ к вашему удаленному домашнему каталогу, просто поместите локальный открытый ключ в удаленный файл authorized_keys . Есть Google, есть много руководств.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top