2016-04-26 5 views
0

По сути, мне нужно получить доступ к компьютеру, скажем, машине A, доступ к которой возможен только через внутреннюю сеть моей компании. Раньше я мог настроить перенаправление портов tcprelay для этого, но этот конвейер был отключен из-за некоторых потенциальных недостатков безопасности.Как сделать SSH для обработки через средний хост с помощью Paramiko?

Скажем, моя компания общая сеть на [email protected] и конкретной машине я хочу работать с находится в [email protected]

Оба счета имеют пароль «пароль»

с помощью команд терминала и оболочки, я могу просто сесть там, используя одну единственную команду: https://askubuntu.com/a/311457

или ступенчато, было бы:

[on my account] ssh [email protected] 
[on my account] enter password 
[on company network] ssh machine @10.0.0.3 
[on company network] enter password again 

И я бы вошел в систему, с которой мне нужно общаться.

Однако, после взлома весь день, я не мог заставить это работать с Парамико. Я попытался настроить соединение, а затем выдал client.exec_command(), но просто не могу получить дескриптор для конкретной машины. Остальные мои сценарии полагаются на наличие клиента paramiko, который может получать команды и возвращать ответы, поэтому для меня было бы очень тяжелым накладным для распространения всех изменений, если бы я переключился на ткань или подпроцесс.

Ближайший я получил был:

ssh.connect(’10.0.0.1', username=‘company', password=‘password’) 
chan = ssh.get_transport().open_session() 
chan.get_pty() 
chan.exec_command(‘ssh [email protected]’) 
print chan.recv(1024) 

, который вернул «ввести пароль» незамедлительное, но работает chan.send(‘password’) только заканчивается зависанием.

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

Если кто-нибудь может дать некоторые советы, я бы очень признателен.

Спасибо!

+0

Возможный дубликат: http://stackoverflow.com/questions/1911690/nested-ssh-session-with-paramiko – sberry

ответ

0

Альтернативный способ - не вводить пароль при входе в систему на другом компьютере. Это можно сделать с помощью ssh-keygen.

  1. Войти на первую машину (А) с пользователем «первого»: $ SSH-серийник -t RSA -> Не вводите ключевую фразу при запросе -> Примечание вниз по линии «Ваш открытый ключ был сохранен в /home/first/.ssh/ " -> Этот файл является открытым ключом машины 'A'

  2. Теперь войдите во вторую машину (B), используя ssh. Затем проверьте папку ~/.ssh. Если нет папки, создайте ее. Создайте файл с именем «authorized_keys» под ~/.ssh/authorized_keys

  3. Скопируйте содержимое файла с первого пользователя в файл «authorized_keys». файл с «id_rsa.pub» от «» первого входа пользователя (под /home/first/.ssh/id_rsa.pub)

  4. Теперь вы можете войти на вторую машину из первых без ввода пароля через ваш скрипт ,

0

Я работал над проектом, где он должен был войти в систему, используя имя пользователя/пароль через SSH, а затем повторить то же самое с другим хостом. По какой-то причине у меня не было контроля над списками ACL, и SSH-ключи не были разрешены. Вам нужно будет добавить paramiko_expect. Вот как я получил его на работу:

import paramiko 
from paramiko_expect import SSHClientInteraction 

user1 = 'admin' 
pass1 = 'admin' 
user2 = 'root' 
pass2 = 'root' 

# not needed for this example, but included for reference 
user_prompt = '.*\$ ' 

# will match root user prompt 
root_prompt = '.*$ ' 

# will match Password: or password: 
pass_prompt = '.*assword: ' 

# SSH to host1 
ssh_client = paramiko.SSHClient() 
ssh_client.set_missing_host_key_policy(
    paramiko.AutoAddPolicy()) 
ssh_client.connect(hostname='host1', username=user1, password=pass1) 

# Interact with SSH client 
with SSHClientInteraction(ssh_client, display=True) as interact: 
    # Send the command to SSH as root to the final host 
    interact.send('ssh {}@host2'.format(user2) 
    # Expect the password prompt 
    interact.expect(pass_prompt) 
    # Send the root password 
    interact.send(pass2) 
    # Expect the root prompt 
    interact.expect(root_prompt) 

ssh_client.close() 

Одно предостережение: если host1 никогда не подключен к host2 с помощью SSH он будет получать предупреждение о хозяине проверки ключей и тайм-аут. Вы можете изменить конфигурацию на host1 или просто SSH до host1, затем от host1 SSH до host2 и введите yes и нажмите enter.