2013-07-16 12 views
7

Ich möchte in der Lage sein, Daten über Tor zu senden, wenn ich SSH aus Python-Skripten verwenden. Tor funktioniert wie erwartet, wenn ich einen OpenSSH-Client verwende, um den Host manuell mit ssh zu verbinden. Das ist meine SSH-Konfigurationsdatei. Ich benutze connect-Proxy mit Proxycommand zu routen die Verbindungen über Tor (wieder, das funktioniert gut über einen Standard-OpenSSH-Client):Python ssh mit Tor-Proxy

host host 
user user 
hostname host.domain.com 
CheckHostIP no 
Compression yes 
Protocol 2 
ProxyCommand connect-proxy -S localhost:9050 %h %p 

ich diese Python-Testskript haben:

import paraproxy 
import paramiko 

conf = paramiko.SSHConfig() 
conf.parse(open('/home/user/.ssh/config')) 
host = conf.lookup('host') 
print host 

client = paramiko.SSHClient() 
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
client.connect(host["hostname"], username=host["user"], password='test') 
client.close() 

Dieses Skript tut ssh an den Host, verwendet jedoch nicht den ProxyCommand in der ssh-config-Datei, so dass Traffic nicht durch Tor geleitet wird. Ich habe ein paar verschiedene Konfigurationen ausprobiert, aber ich kann es nicht funktionieren lassen. Irgendwelche Ideen, wie das funktioniert?

Antwort

13

Sie benötigen ProxyCommand (ein pfannenartigen Objekt) zu erstellen und zu client.connect()

import paramiko 

conf = paramiko.SSHConfig() 
conf.parse(open('/home/user/.ssh/config')) 
host = conf.lookup('host') 
print host 

proxy = paramiko.ProxyCommand(host['proxycommand']) 

client = paramiko.SSHClient() 
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
client.connect(host["hostname"], username=host["user"], password='test', sock=proxy) 
client.close() 

Docs for connect() method passieren. Hinweis timeout Parameter. Es ist immer eine gute Idee, es zu spezifizieren, wenn Sie etwas Automatisierung machen.

+0

Haben Sie tatsächlich versucht, diesen Code auszuführen? Hat es funktioniert, als du es ausprobiert hast? –

+0

Ja. Aber ich poxying über ssh: 'ProxyCommand ssh [email protected] nc% h% p' – twil

+0

Das funktioniert. Ich habe den Teil über das Fehlen von Paraproxy verpasst. Es funktioniert nicht mit dem importierten. Ich habe versucht, dich zu überreden, aber ich habe dich versehentlich abgelehnt. Aber ich akzeptiere diese Antwort. Vielen Dank. –