在Linux上使用perl进行TOR的新身份

时间:2015-10-21 10:28:35

标签: perl tor

我正在运行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重新加载其配置文件只是为了创建一个新电路是一种过载。我认为必须有一个更优雅的解决方案,比如

  1. 创建与TOR控制端口的连接
  2. 发送»更改身份«(signal newnym
  3. 关闭连接
  4. 如何用perl编写这三个步骤?

    在阅读我读过的一些文档时,您必须在某些配置文件中启用控制端口的使用,并且必须使用密码。请告诉我如何做到这一切! - Thanx

2 个答案:

答案 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. 验证“”
  2. SIGNAL NEWNYM
  3. QUIT
  4. 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调整为设置中的实际服务端口号。