Агент Python 3 Paramiko SSH переадресовывать через хост с удаленной командой на третьем хосте

1

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 в той же цепочке, он работает хорошо.

Может ли кто-нибудь дать мне подсказку, чтобы решить мою проблему?

спасибо заранее.

Теги:
python-3.x
ssh
ssh-tunnel
paramiko

1 ответ

0

Успение: ваши ключи работают через хост-хост и хост назначения.

Создание локального агента в этом случае будет работать. Вы можете вручную создать его с помощью оболочки сначала и проверить его через 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)

Я пытаюсь сделать что-то подобное и наткнулся на этот пост, я обновлю, если найду лучшее решение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню