paramiko не разговаривает с ssh-agent. такое же поведение в ткани

Сначала я попытался заставить ткань работать, но она продолжала запрашивать пароль.

Поэтому я пытаюсь уменьшить проблему. Возможно, было бы неплохо просто создать SSH-соединение из Python. Я обнаружил, что ткань использует parmiko для обработки SSH. Хм. Хорошо, давайте попробуем заставить пример работать.

Вот что я написал.

from ssh import *
import os 

print "SSH-AGENT VARS"

print "SSH_AGENT_PID: %s " % os.environ['SSH_AGENT_PID']
print "SSH_AUTH_SOCK: %s " % os.environ['SSH_AUTH_SOCK']

a = Agent()
keys=a.get_keys()
print keys.count("192.168.1.10")


client = SSHClient()
client.load_system_host_keys()
client.connect('192.168.1.10')

В результате появляются следующие сообщения об ошибках:

% ./ssh_test.py
SSH-AGENT VARS
SSH_AGENT_PID: 26557 
SSH_AUTH_SOCK: /tmp/ssh-pZHBElj26556/agent.26556 
0
Traceback (most recent call last):
  File "./ssh_test.py", line 18, in <module>
    client.connect('192.168.1.10')
  File "/usr/local/lib/python2.7/dist-packages/ssh/client.py", line 332, in connect
    self._auth(username, password, pkey, key_filenames, allow_agent, look_for_keys)
  File "/usr/local/lib/python2.7/dist-packages/ssh/client.py", line 493, in _auth
    raise saved_exception
ssh.PasswordRequiredException: Private key file is encrypted

ssh-agent работает в моем сеансе, я могу подключиться к этому ящику по SSH, никаких проблем, он не запрашивает пароль или что-то еще.

Я предполагаю, что paramiko не может подключиться к работающему ssh-агенту по какой-то странной причине.

У кого-нибудь еще была такая проблема? Я использую Убунту 11.10

Кажется, я помню, как некоторое время назад пытался использовать Fabric и столкнулся с похожими проблемами, возможно, он какое-то время был сломан?

Я подключаюсь, просто используя имя хоста в качестве аргумента. Это согласно документации.

http://www.lag.net/paramiko/docs/paramiko.SSHClient-class.html

connect(self, hostname, port=22, username=None, password=None, pkey=None, key_filename=None, timeout=None, allow_agent=True, look_for_keys=True, compress=False)

person Bryan Hunt    schedule 23.03.2012    source источник
comment
Я также использую ткань в Ubuntu 11.10 без каких-либо проблем. Похоже, что либо ткань не обращается к тому же ключевому файлу, что и консольный ssh, либо вы используете неправильный логин. Вы не забыли установить env.user = 'my_user' в свой fabfile?   -  person Not_a_Golfer    schedule 26.03.2012
comment
Пробовал, та же проблема. Я предполагаю, что проблема заключается в парамико, а не в ткани. Заставить парамико работать первым было бы хорошим шагом. Вот почему я создал небольшой тестовый скрипт выше.   -  person Bryan Hunt    schedule 26.03.2012
comment
Пробовали ли вы создать ветку нового ключа RSA, убедиться, что у него нет парольной фразы, установить его на сервер и использовать вместо него?   -  person Not_a_Golfer    schedule 26.03.2012
comment
У моего ключа RSA есть кодовая фраза, но, как видно из фрагмента, я использую ssh-agent, с которым он может общаться, но не может использовать закрытый ключ. Rsync, и друзья могут получить закрытый ключ через ssh-agent, поэтому я ожидаю, что paramiko сможет сделать то же самое ·   -  person Bryan Hunt    schedule 26.03.2012
comment
Забавно, что это исключение даже не указано в документах.   -  person Lev Levitsky    schedule 26.03.2012
comment
Вы пробовали client.connect('192.168.1.10', password='your_passphrase')? У меня есть ощущение, что это может помочь.   -  person Lev Levitsky    schedule 26.03.2012
comment
@LevLevitsky на самом деле это есть в документах: lag.net/paramiko /docs/paramiko.PKey-class.html#from_private_key "if the private key file is encrypted, and password is None"   -  person Not_a_Golfer    schedule 27.03.2012
comment
Точно, я просто не хотел публиковать много текста, пока не узнал, что это работает :)   -  person Lev Levitsky    schedule 27.03.2012
comment
Что ж, ОП не спешит его тестировать, поэтому я разместил его как ответ :)   -  person Lev Levitsky    schedule 27.03.2012
comment
Но ssh-агент работает и аутентифицируется в моей консоли. Я могу подключиться к серверу по ssh без ввода пароля. Мой вопрос в том, как добиться этого с помощью paramiko. Я не хочу вставлять пароль в код, это свело бы на нет всю цель упражнения.   -  person Bryan Hunt    schedule 27.03.2012


Ответы (5)


Итак, из кода paramiko и вашего, когда вы делаете a.get_keys(), это должно возвращать список. Я бы посмотрел, что он возвращает. И он не вернет что-то, что вы можете так сосчитать, поскольку он возвращает фактические биты зашифрованного ключа. Но в любом случае, поскольку вы перешли на ssh, и это работает, давайте перейдем к Fabric.

Вы можете получить больше журналов, включив его для ssh lib, выполнив:

import ssh
ssh.util.log_to_file("paramiko.log", 10)

В вашем фабрике. Это поднимет все журналы и покажет больше того, что делает сам paramiko/ssh, что может помочь вам в дальнейшей отладке проблемы.

person Morgan    schedule 28.03.2012
comment
Эй, чувак, хороший намек. Я собираюсь поместить дополнительную информацию в исходную публикацию. Оказывается, он игнорирует указанного пользователя. - person Bryan Hunt; 28.03.2012

Итак, первое, что я обнаружил, это то, что Paramiko устарела и не поддерживается.

Теперь он известен как пакет ssh, по крайней мере, в Ubuntu, и у него другой сопровождающий (bitprophet).

Вот пример сеанса с его использованием:

$ ./ssh_demo.py
Hostname: 192.168.1.10
*** Host key OK.
Username [bryan]: root
Trying ssh-agent key eee5638f390e1698898984b10adfa9317 ... success!
*** Here we go!

Linux top.secret.com 2.9.37-1-amd64 #1 SMP Thu Nov 3 03:41:26 UTC 2011 x86_64
┌┌(root@top)-(10:44am-:-03/27)┌-¨-¨¨˙

Это не отвечает на вопрос, почему ткань не проходит аутентификацию против ssh-агента, как правильно подумали. Так что вопрос остается открытым.

Обновлять:

Благодаря подсказке Моргана я немного продвинулся в решении этой проблемы. Как он и предложил, я включил ведение журнала ssh, добавив следующее в начало файла fabfile.py.

from fabric.api import *
import ssh
ssh.util.log_to_file("paramiko.log", 10)

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

На сервере:

tail -f /var/log/auth.log 
Mar 28 11:12:36 xxxxxxxxxxx sshd[17652]: Invalid user bryan from xxx.xxx.xxx.xxx

Локально:

tail -f paramiko.log    
DEB [20120328-11:39:29.038] thr=1   ssh.transport: starting thread (client mode): 0x8dfc66cL
INF [20120328-11:39:29.066] thr=1   ssh.transport: Connected (version 2.0, client OpenSSH_5.5p1)
DEB [20120328-11:39:29.093] thr=1   ssh.transport: kex algos:['diffie-hellman-group-exchange-sha256', 'diffie-hellman-group-exchange-sha1', 'diffie-hellman-group14-sha1', 'diffie-hellman-group1-sha1'] server key:['ssh-rsa', 'ssh-dss'] client encrypt:['aes128-ctr', 'aes192-ctr', 'aes256-ctr', 'arcfour256', 'arcfour128', 'aes128-cbc', '3des-cbc', 'blowfish-cbc', 'cast128-cbc', 'aes192-cbc', 'aes256-cbc', 'arcfour', '[email protected]'] server encrypt:['aes128-ctr', 'aes192-ctr', 'aes256-ctr', 'arcfour256', 'arcfour128', 'aes128-cbc', '3des-cbc', 'blowfish-cbc', 'cast128-cbc', 'aes192-cbc', 'aes256-cbc', 'arcfour', '[email protected]'] client mac:['hmac-md5', 'hmac-sha1', '[email protected]', 'hmac-ripemd160', '[email protected]', 'hmac-sha1-96', 'hmac-md5-96'] server mac:['hmac-md5', 'hmac-sha1', '[email protected]', 'hmac-ripemd160', '[email protected]', 'hmac-sha1-96', 'hmac-md5-96'] client compress:['none', '[email protected]'] server compress:['none', '[email protected]'] client lang:[''] server lang:[''] kex follows?False
DEB [20120328-11:39:29.093] thr=1   ssh.transport: Ciphers agreed: local=aes128-ctr, remote=aes128-ctr
DEB [20120328-11:39:29.093] thr=1   ssh.transport: using kex diffie-hellman-group1-sha1; server key type ssh-rsa; cipher: local aes128-ctr, remote aes128-ctr; mac: local hmac-sha1, remote hmac-sha1; compression: local none, remote none
DEB [20120328-11:39:29.183] thr=1   ssh.transport: Switch to new keys ...
DEB [20120328-11:39:29.224] thr=2   ssh.transport: Trying SSH agent key cda5638f390e166864444b1093b91017
DEB [20120328-11:39:29.272] thr=1   ssh.transport: userauth is OK
INF [20120328-11:39:53.310] thr=1   ssh.transport: Authentication (publickey) failed.
DEB [20120328-11:41:29.076] thr=1   ssh.transport: EOF in transport thread

Хм, странно, я запустил команду как: fab diskfree -H xxx.xxx.xxx.xxx -u root

Но что это?

$ cat ./fabfile.py
from fabric.api import *
import ssh
ssh.util.log_to_file("paramiko.log", 10)

env.user = 'bryan'

def host_type():
 run('uname -s')

def diskfree():
 run('df -h') 

Хм

env.user = 'bryan'

Может ли это быть корнем проблемы? Могут ли сообщения об ошибках ssh просто вводить меня в заблуждение?

Я удалил строку, и это сработало, так что, наверное, это ответ.

person Bryan Hunt    schedule 27.03.2012
comment
у вас может быть строка конфигурации в вашем .ssh/config, о которой вы забыли или полагали, что она соблюдается, но мне нравится ошибаться из-за осторожности и оставлять пользователей там или, в одном из случаев, кодировать их в хосты списки со списками. Рад, что эта подсказка позволила вам разобраться в проблеме. - person Morgan; 28.03.2012
comment
SSH сейчас не поддерживается, они рекомендуют использовать paramiko. github.com/bitprophet/ssh - person Yaroslav Nikitenko; 09.06.2019

Я бы попытался указать фразу-пароль в качестве аргумента ключевого слова password для connect().

Как указано в документации для SSHCLient.connect(), он использует любой PKey он может быть найден в системе, если не указан конкретный один. Методы класса from_private_key() и from_private_key_file() (я не уверен, какой из них называется, возможно, оба) принять необязательный аргумент password. Документы говорят,

Если закрытый ключ зашифрован, а пароль не равен None, данный пароль будет использоваться для расшифровки ключа (в противном случае генерируется исключение PasswordRequiredException).

... что, вероятно, происходит в вашем случае.

person Lev Levitsky    schedule 26.03.2012
comment
Но ssh-агент работает и аутентифицируется в моей консоли. Я могу подключиться к серверу по ssh без ввода пароля. Мой вопрос в том, как добиться этого с помощью paramiko. Я не хочу вставлять пароль в код, это свело бы на нет всю цель упражнения. - person Bryan Hunt; 27.03.2012

у меня была эта проблема, и что сработало для меня, что запускает SSH_AGENT:

eval $(ssh-agent)

и добавив SSH_KEY:

ssh-add ~/.ssh/id_rsa
person Elad L.    schedule 04.06.2019

Возможно, вам нужно запустить, чтобы добавить ключ к агенту.

$ ssh-add ~/.ssh/id_dsa 

https://groups.google.com/forum/?fromgroups=#!topic/ansible-project/yRSMmlqKsAA

person Maelvon    schedule 22.12.2012
comment
я думаю, это то, что вы имели в виду: ssh-add ~/.ssh/id_rsa - person Elad L.; 04.06.2019