Автоматизируйте SSH без использования аутентификации с открытым ключом или ожидайте (1) - PullRequest
3 голосов
/ 07 ноября 2008

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

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

Ответы [ 7 ]

7 голосов
/ 12 декабря 2008

ожидание не может быть и речи, потому что я хотел бы запустить его как задание 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
2 голосов
/ 23 декабря 2013

Использование sshpass.

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

sshpass -fpassword.txt ssh username@hostname

(взято из ответа на аналогичный вопрос )

1 голос
/ 07 ноября 2008

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

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

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

Вопросы по Stackoverflow:

0 голосов
/ 13 июля 2009

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

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

0 голосов
/ 30 ноября 2008

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

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

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

0 голосов
/ 07 ноября 2008

Эта дискуссия говорит о том, что вы пытаетесь сделать:

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

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

0 голосов
/ 07 ноября 2008

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

...