我正在运行perl脚本,通过TOR network读取许多不同网站的数据。但是其中一些网站已将一些TOR出口节点列入黑名单,并发送http-status 403而不是预期的响应。在这种情况下,我想发送一个命令到我的本地TOR进程来改变它的电路/身份。
这引出了我的第一个(次要重要)问题:
在讨论TOR时,电路«和»身份«是否相同?
但我更重要的问题是:
如何从perl脚本向本地运行的TOR进程发送»更改身份«命令?
(据我所知,此命令为signal newnym
,但我该如何发送?)
I asked this question already on TOR-StackExchange,被告知要执行系统调用
pkill -SIGHUP tor
应该强制TOR重新加载其配置文件,然后建立一个新电路,但这不起作用。我想这是因为我的socks-connection仍然是开放的,甚至在-SIGHUP继续使用相同的身份仍然打开连接之后。 (只是猜测)
我认为迫使TOR重新加载其配置文件只是为了创建一个新电路是一种过载。我认为必须有一个更优雅的解决方案,比如
signal newnym
)如何用perl编写这三个步骤?
在阅读我读过的一些文档时,您必须在某些配置文件中启用控制端口的使用,并且必须使用密码。请告诉我如何做到这一切! - Thanx
答案 0 :(得分:3)
在浏览了manny不同的文档后,我找到了一个解决方案:
if (my $socket = new IO::Socket::INET(
'PeerHost' => '127.0.0.1',
'PeerPort' => '9051',
'Proto' => 'tcp')) {
my @requ = ('authenticate ""','SIGNAL NEWNYM','QUIT');
foreach my $requ (@requ) {
print $socket $requ."\n";
my $dummy = <$socket>;
}
$socket->close();
print "OK: New circuit established\n";
} else {
print "ERROR: couldn't connect with socket\n";
}
说明:
my $socket = new IO::Socket::INET(
'PeerHost' => '127.0.0.1',
'PeerPort' => '9051',
'Proto' => 'tcp')
创建一个新的套接字对象。如果这确实有效,则返回套接字,否则 undef 。
我在 if -Statement中嵌入了这个语句。如果可以创建套接字,则执行第一个块,第二个块打印错误消息。
在 if -Block中,我通过套接字将这三个commants发送到TOR:
1执行null-authentification
2做我真正想要的:这个命令告诉TOR建立一个新的电路
3退出对话
最后我关闭套接字并打印一条消息。
我不分析TOR的回应,但我必须阅读它(使用$dummy = <$socket>;
)。如果TOR真的以“250”回答三次,可以检查,如果不是,则做出反应。但我决定希望它始终有效。
答案 1 :(得分:0)
如果您不严格要求Perl是Perl,那么一线外壳也可以解决问题:
根据您的身份验证方式(可能是data / tor中的control_auth_cookie文件),您可以发布此单行代码(并通过执行此操作还检查您是否有新的外部ip来确保),例如:
printf "AUTHENTICATE \"$(cat <<location of your control_auth_cookie file>>)\"\r\nSIGNAL NEWNYM\r\n" | nc localhost 9151; curl --socks5-host localhost:9150 http://myexternalip.com/raw
您需要将9151
调整为设置中的实际服务端口号。