linux上使用perl的TOR新标识
我正在运行一个perl脚本,通过。但其中一些站点已将一些TOR出口节点列入黑名单,并发送http状态403,而不是预期的响应。在这种情况下,我想向本地TOR进程发送一个命令,以更改其电路/标识 这就引出了我的第一个(次要重要)问题: 当谈到TOR时,»电路«和»标识«的意思是否相同 但我更重要的问题是: 如何从perl脚本向本地运行的TOR进程发送»change identity«命令 (据我所知,这个命令是linux上使用perl的TOR新标识,perl,tor,Perl,Tor,我正在运行一个perl脚本,通过。但其中一些站点已将一些TOR出口节点列入黑名单,并发送http状态403,而不是预期的响应。在这种情况下,我想向本地TOR进程发送一个命令,以更改其电路/标识 这就引出了我的第一个(次要重要)问题: 当谈到TOR时,»电路«和»标识«的意思是否相同 但我更重要的问题是: 如何从perl脚本向本地运行的TOR进程发送»change identity«命令 (据我所知,这个命令是signal newnym,但我如何发送它呢?) ,并被告知执行系统调用 pkill -
signal newnym
,但我如何发送它呢?)
,并被告知执行系统调用
pkill -SIGHUP tor
这将迫使TOR重新加载其配置文件,然后建立一个新回路,但这不起作用。我猜这是因为我的socks连接仍然是开放的,tor即使在SIGHUP之后仍然使用相同的身份来连接仍然是开放的。(只是猜测)
我认为这是一种过载,迫使TOR重新加载配置文件只是为了创建一个新的电路。我想一定有更优雅的解决方案,比如
信号新名称
)在阅读我读过的一些文档时,您必须在一些配置文件中启用控制端口的使用,并且必须使用密码。请告诉我怎么做Thanx在浏览了许多不同的文档之后,我找到了一个解决方案:
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";
}
创建一个新的套接字对象。如果这确实有效,它将返回套接字,否则将返回undef
我将此语句嵌入到if语句中。如果可以创建套接字,将执行其第一个块,第二个块将打印错误消息
在if块中,我通过套接字将这三个命令发送到TOR:
2实现了我真正想要的:这个命令告诉TOR建立一个新电路。
3.结束对话 最后,我关闭插座并打印一条消息
我不分析TOR的响应,但我必须阅读它(使用
$dummy=;
)。人们可以检查TOR是否真的用“250”回答了三次,如果不是,就做出反应。但我决定希望它能一直起作用。在浏览了曼尼的不同文档后,我找到了一个解决方案:
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";
}
创建一个新的套接字对象。如果这确实有效,它将返回套接字,否则将返回undef
我将此语句嵌入到if语句中。如果可以创建套接字,将执行其第一个块,第二个块将打印错误消息
在if块中,我通过套接字将这三个命令发送到TOR:
2实现了我真正想要的:这个命令告诉TOR建立一个新电路。
3.结束对话 最后,我关闭插座并打印一条消息
我不分析TOR的响应,但我必须阅读它(使用
$dummy=;
)。人们可以检查TOR是否真的用“250”回答了三次,如果不是,就做出反应。但是我决定希望它总是有效的。如果您不严格要求它是Perl,shell one衬里也可以做到这一点:
根据您的身份验证方式(可能是data/tor中的control\u auth\u cookie-file),您可以发布这一行(这样做还可以检查您是否获得了新的外部ip,以确保),例如:
printf“AUTHENTICATE\”$(cat)\“\r\n签名新名称\r\n”\124NC本地主机9151;curl--socks5主机本地主机:9150http://myexternalip.com/raw
您需要将
9151
调整到设置中的实际服务端口号。如果您不严格要求它是Perl,shell one liner也可以:
根据您的身份验证方式(可能是data/tor中的control\u auth\u cookie-file),您可以发布这一行(这样做还可以检查您是否获得了新的外部ip,以确保),例如:
printf“AUTHENTICATE\”$(cat)\“\r\n签名新名称\r\n”\124NC本地主机9151;curl--socks5主机本地主机:9150http://myexternalip.com/raw
您需要根据设置中的实际服务端口号调整
9151
。第一个问题可能更适合TOR社区。我相信它在那里会很受欢迎。下面描述的算法的实际Perl问题可能非常特定于领域,甚至有点宽泛。我不打算结束投票,因为我认为这是一个主题,但我也不是很有信心在这里有很多帮助。祝你好运。:)第一个问题可能更适合TOR社区。我相信它在那里会很受欢迎。下面描述的算法的实际Perl问题可能非常特定于领域,甚至有点宽泛。我不打算结束投票,因为我认为这是一个主题,但我也不是很有信心在这里有很多帮助。祝你好运。:)您选择了正确的方法,要以编程方式执行此操作,您必须打开到控制端口的连接,并像以前一样发出SIGNAL NEWNYM
命令。您选择了正确的方法,要以编程方式执行此操作,您必须打开到控制端口的连接,并像以前一样发出SIGNAL NEWNYM
命令。
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