2013-07-16 16 views
7

Chciałbym móc wysyłać dane przez Tora, gdy używam ssh ze skryptów Pythona. Tor działa zgodnie z oczekiwaniami, gdy korzystam z klienta OpenSSH, aby ręcznie ssh przekazać do hosta. To jest mój plik konfiguracyjny ssh. Używam połączyć-proxy z ProxyCommand na trasie połączenia przez Tora (ponownie, to działa prawidłowo za pomocą standardowego klienta OpenSSH):Python ssh używający proxy Tora

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

mam ten skrypt testowy Python:

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() 

Ten skrypt robi ssh do hosta, jednak nie używa ProxyCommand w pliku konfiguracyjnym ssh, więc nie kieruje ruchu przez Tor. Próbowałem już kilku różnych konfiguracji, ale nie mogę tego zrobić. Wszelkie pomysły, jak to zrobić?

Odpowiedz

13

Musisz utworzyć ProxyCommand (obiekt gniazdo-like) i przekazać go do 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. Uwaga: parametr timeout. Dobrym pomysłem jest określenie go, jeśli wykonujesz jakąś automatyzację.

+0

Czy próbowałeś uruchomić ten kod? Czy to działało, kiedy go wypróbowałeś? –

+0

Tak. Ale mylę się przez ssh: 'ProxyCommand ssh [email protected] nc% h% p' – twil

+0

To działa. Brakowało mi części o tym, że nie używam paraproxy. Nie działa z tym zaimportowanym. Próbowałem cię upomnieć, ale przypadkowo cię zawiodłem. Ale akceptuję tę odpowiedź. Dziękuję Ci. –