2014-02-06 3 views
4

Я пытаюсь подключиться через SSH к туннелю компьютера через другой компьютер, используя paramiko в Python, но у меня возникают некоторые странные проблемы. Мой конфигурационный файл в /.ssh/config выглядит следующим образом:paramiko.Proxycommand не удается установить сокет

Host remoteA 
HostName 169.254.1.1 
User root 
IdentityFile ~/.ssh/id_dss.openssh.remoteA 
ForwardX11 no 
StrictHostKeyChecking no 
ForwardAgent yes 
UserKnownHostsFile /dev/null 

Host remoteB 
User root 
IdentityFile ~/.ssh/id_dss.openssh.remoteB 
ForwardX11 no 
StrictHostKeyChecking no 
UserKnownHostsFile /dev/null 
ProxyCommand ssh -W 169.254.1.2:22 remoteA 

И мой питон такой код:

from paramiko import SSHClient, SSHConfig, SSHException 
import getpass 
import paramiko 


def getSSHConnection(hostName): 
    config = SSHConfig() 


    user = getpass.getuser() 
    config.parse(open('C:/Users/' + user +'/.ssh/config')) 
    host=config.lookup(hostName) 


    # setup SSH client 
    client = SSHClient() 
    client.load_system_host_keys() 
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 

    #Check for proxy settings 
    try: 
     print host ['proxycommand'] 
     proxy = paramiko.ProxyCommand(host['proxycommand']) 
    except: 
     proxy = None 
    #Setup the SSH connection 
    try: 
     if (proxy is None): 
      client.connect(host['hostname'],22, username=host['user'],key_filename=host['identityfile']) 
     else: 
      client.connect(host['hostname'],22, username=host['user'], key_filename=host['identityfile'], sock=proxy) 
    except SSHException, ex: 
     print ex 

    return client 





ssh_client = getSSHConnection('remoteA') 

# run a command 
print "\nRun a command" 
cmd = 'ps aux' 
stdin, stdout, stderr = ssh_client.exec_command(cmd) 

print stdout.read() 

ssh_client = getSSHConnection('remoteB') 

# run a command 
print "\nRun a command" 
cmd = 'ps aux' 
stdin, stdout, stderr = ssh_client.exec_command(cmd) 

print stdout.read() 

Сначала при подключении к remoteA это работает отлично, но потом при подключении к remoteB он выходит из строя в уровень: proxy = paramiko.ProxyCommand(host['proxycommand']).

File "C:\Python27\lib\site-packages\paramiko\client.py", line 291, in connect 
    for (family, socktype, proto, canonname, sockaddr) in socket.getaddrinfo(hostname, port,   socket.AF_UNSPEC, socket.SOCK_STREAM): 
socket.gaierror: [Errno 11004] getaddrinfo failed 

В Cygwin, я могу подключиться, используя команду ssh remoteB, так что я знаю, что конфигурационный файл должен быть в порядке.

Если это делает никакой разницы, я бегу это на Windows 7.

+1

Так что мне удалось обойти мои проблемы, сделав вместо этого порт вперед. – jimmy

ответ

2

Таким образом, вместо того, чтобы использовать ProxyCommand я использовал перенаправление портов, чтобы решить мою проблему.

def getForwardedSSHPort(self, tunnnelHostName): 
    forwarderClient = self.getSSHConnection(tunnnelHostName, None) 
    transport = forwarderClient.get_transport() 
    dest_addr = ('169.254.1.2', 22) 
    local_addr = ('127.0.0.1', 10022) 
    channel = transport.open_channel('direct-tcpip', dest_addr, local_addr) 

    remoteClient = self.getSSHConnection(tunnnelHostName, channel) 
6

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

Я использую команду прокси как этот

proxy = paramiko.ProxyCommand("ssh -o StrictHostKeyChecking=no jumphostIP nc targethostIP 22") 

я нашел в этой вики очень полезный http://en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts Просто использовать фактические значения вместо % h и% p, как я сделал.

+0

Это, безусловно, стоит проверить в будущем. В этом случае я не могу ничего установить на хост-хосте, и на самом деле я действительно доволен своим текущим решением. – jimmy

Смежные вопросы