【问题标题】:new identity for TOR using perl on linux在 Linux 上使用 perl 的 TOR 新身份
【发布时间】:2016-01-20 07:26:11
【问题描述】:

我正在运行一个 perl 脚本来通过 TOR network 读取许多不同网站的数据。但是其中一些站点已将某些 TOR 出口节点列入黑名单,并发送 http-status 403 而不是预期的响应。在这种情况下,我想向本地 TOR 进程发送命令以更改其电路/身份。

这引出了我的第一个(次要重要)问题:

在谈到 TOR 时,»circuit« 和 »identity« 是否相同?

但我更重要的问题是:

如何从 perl 脚本向本地运行的 TOR 进程发送 »change identity« 命令?

(据我所知,这个命令是signal newnym,但是我要怎么发送呢?)

I asked this question already on TOR-StackExchange,并被告知执行系统调用

pkill -SIGHUP tor  

这应该强制 TOR 重新加载其配置文件,然后建立一个新电路,但这不起作用。我想这是因为我的 socks-connection 仍然是打开的,并且即使在 -SIGHUP 继续使用相同的身份进行仍然打开的连接之后。 (只是猜测)

而且我认为强制 TOR 重新加载其配置文件只是为了创建新电路是某种过载。我认为必须有一个更优雅的解决方案,比如

  1. 创建到 TOR 控制端口的连接
  2. 发送»更改身份« (signal newnym)
  3. 关闭连接

这三个步骤用perl怎么写?

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

【问题讨论】:

  • 第一个问题可能更适合 TOR 社区。我相信它会在那里很受欢迎。下面描述的算法的实际 Perl 问题可能非常特定于领域,甚至有点宽泛。我不打算投票,因为我认为这是主题,但我对这里的很多帮助也不是很有信心。祝你好运。 :)

标签: perl tor


【解决方案1】:

在浏览了许多不同的文档后,我找到了一个解决方案:

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 语句中。如果可以创建套接字,它将执行它的第一个块,第二个块打印一条错误消息。

if-Block 中,我通过套接字将这三个命令发送到 TOR:

  1. 验证“”
  2. SIGNAL NEWNYM
  3. 退出

1 执行空验证
2 做我真正想要的:这个命令告诉 TOR 建立一个新的电路。
3 退出对话

最后我关闭套接字并打印一条消息。

我不分析 TOR 的回复,但我必须阅读它($dummy = &lt;$socket&gt;;)。可以检查一下 TOR 是否真的用“250”回答了三遍,如果不是,则做出反应。但我决定希望它始终有效。

【讨论】:

  • 您选择了正确的方法,要以编程方式执行此操作,您必须打开与控制端口的连接并像您一样发出SIGNAL NEWNYM 命令。
【解决方案2】:

如果您不严格要求它是 Perl,那么 shell 单线也可以解决问题:

根据您的身份验证方式(可能是 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 调整为您设置中的实际服务端口号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 2011-04-28
    相关资源
    最近更新 更多