Я немного запутался, я установил открытые ключи между двумя серверами, и он вроде как отлично работает. Это работает, только если я использую ssh вручную с терминала. Когда я помещаю команду ssh в сценарий python, он запрашивает у меня пароль для входа. Сценарий использует rsync для синхронизации каталога с одного сервера на другой.
ручная команда ssh, которая работает, без запроса пароля, автоматический вход:
ssh -p 1234 garfonzo@123.456.789.123
В скрипте Python:
rsync --ignore-existing --delete --stats --progress -rp -e "ssh -p 1234" garfonzo@123.456.789.123:/directory/ /other/directory/
Что дает?
(очевидно, данные ssh поддельные)
ИЗМЕНИТЬ по запросу
@Zoredache - ставлю -vv
в скрипте (и -i, чтобы указать, где находится ключ, что фактически приблизило меня на один шаг), и он показал интересную группу строк:
debug1: Host '[123.456.789.123]:1234' is known and matches the RSA host key.
debug1: Found key in /root/.ssh/known_hosts:1
debug2: bits set: 515/1024
debug1: ssh_rsa_verify: signature correct
debug2: kex_derive_keys
debug2: set_newkeys: mode 1
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug2: set_newkeys: mode 0
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug2: service_accept: ssh-userauth
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug2: key: /home/garfonzo/.ssh/id_dsa.pub (0x7f125c489bd0)
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering public key: /home/garfonzo/.ssh/id_dsa.pub
debug2: we sent a publickey packet, wait for reply
debug1: Server accepts key: pkalg ssh-dss blen 434
debug2: input_userauth_pk_ok: fp 81:02:20:f0:62:16:30:15:4d:0b:2e:91:7c:ba:5c:05
debug1: PEM_read_PrivateKey failed
debug1: read PEM private key done: type <unknown>
Enter passphrase for key '/home/garfonzo/.ssh/id_dsa.pub':
debug2: no passphrase given, try next key
debug2: we did not send a packet, disable method
debug1: Next authentication method: password
Кажется, что он не знает, где хранится мой ключ на стороне клиента (возможно, проблема раньше), он запрашивает кодовую фразу. Проблема в том, что я не указал кодовую фразу, оставил поле пустым. Странно ... Может, новый набор ключей создам?
РЕДАКТИРОВАТЬ 2
@ckliborn - отличная идея! Я думаю, это могло показать, в чем моя проблема. Единственная строка, которая, как мне кажется, указывает на мою проблему, такова:
debug1: Found key in /home/garfonzo/.ssh/known_hosts:1
тогда как при запуске через скрипт та же строка выглядит так:
debug1: Found key in /root/.ssh/known_hosts:1
Итак, клиент ищет ключ не в том месте. Когда я указываю местоположение ключа, он запрашивает парольную фразу, которую я не установил. Арг!
?Смущенный?
В сценарии python вы пытались явно указать местоположение файла идентификации, который вы хотите использовать, с флагом «-i»?
Пример:
rsync --ignore-existing --delete --stats --progress -rp -e "ssh -i /home/user/.ssh/keyfile -p 1234" garfonzo@123.456.789
Попробуйте добавить новый хост в ваш файл ~ / .ssh / config, не забудьте внести изменения:
Host somehostname
Hostname 169.1.1.254
User garfonzo
IdentityFile /home/garfonzo/.ssh/id_rsa
PubkeyAuthentication yes
Если у вашего ключа есть кодовая фраза, а она должна быть, вам необходимо получить ~ / ssh-agent.
http://www.ibm.com/developerworks/library/l-keyc2/
Если вы пропустили парольную фразу для своего ключа, следуйте приведенному выше адиву и передайте аргумент «-i».
Ваш скрипт python работает с #!/usr/bin/env python
или ты просто делаешь прямую #!/usr/bin/python
или похожие. Кроме того, вы можете попробовать удалить -e "ssh -p 1234"
и просто используя --port 1234
вместо.
Проверьте своего пользователя ... Похоже, что сценарий запускается от имени пользователя root, а тестирование выполняется от имени пользователя. Ты используешь su
или sudo
или вы входите в систему как root? Как запускается ваш сценарий? Есть ли у него какие-то права root?