Moin!
Ситуация: подключитесь к пункту назначения.host через jump.host и запустите команду на destination.host, которая подключается в фоновом режиме к другому.host (на этом хосте необходим мой ssh-ключ).
Схема: client → jump.host → destination.host --- remote_command с ключом ssh, необходимым на другом хосте → another.host
#!/usr/bin/python
import paramiko
jumpHost=paramiko.SSHClient()
sshKey = paramiko.RSAKey.from_private_key_file('path.to.key/file', password = 'the.passphrase')
jumpHost.set_missing_host_key_policy(paramiko.AutoAddPolicy())
jumpHost.connect('jump.hostname',username='foo', pkey = sshKey)
jumpHostTransport = jumpHost.get_transport()
dest_addr = ('destination.hostname', 22)
local_addr = ('jump.hostname', 22)
jumpHostChannel = jumpHostTransport.open_channel("direct-tcpip", dest_addr, local_addr)
destHost=paramiko.SSHClient()
destHost.set_missing_host_key_policy(paramiko.AutoAddPolicy())
destHost.connect('destination.hostname', username='foo', sock=jumpHostChannel, pkey=sshKey)
destHostAgentSession = destHost.get_transport().open_session()
paramiko.agent.AgentRequestHandler(destHostAgentSession)
stdin, stderr, stdout = destHost.exec_command("my.command.which.connects.to.another.host")
print(stdout.read())
print(stderr.read())
destHost.close()
jumpHost.close()
Вышеприведенный код работает хорошо, если вы запускаете "локальные" команды на destination.host - например, uname, whoami, hostname, ls и т.д. Но если я запустил команду, которая соединяется в фоновом режиме с другим хостом, где мой ssh ключ необходим, код, поднятый в ошибке:
raise AuthenticationException ("Не удается подключиться к агенту SSH") paramiko.ssh_exception.AuthenticationException: невозможно подключиться к агенту SSH
Если я подключаюсь через Putty в той же цепочке, он работает хорошо.
Может ли кто-нибудь дать мне подсказку, чтобы решить мою проблему?
спасибо заранее.
Успение: ваши ключи работают через хост-хост и хост назначения.
Создание локального агента в этом случае будет работать. Вы можете вручную создать его с помощью оболочки сначала и проверить его через iPython.
eval 'ssh-agent'; ssh-add <my-key-file-path>
Программно это можно сделать -
# Using shell=True is not a great idea because it is a security risk.
# Refer this post - https://security.openstack.org/guidelines/dg_avoid-shell-true.html
subprocess.check_output("eval 'ssh-agent'; ssh-add <my-key-file-path>", shell=True)
Я пытаюсь сделать что-то подобное и наткнулся на этот пост, я обновлю, если найду лучшее решение.