linux上使用perl的TOR新标识

linux上使用perl的TOR新标识,perl,tor,Perl,Tor,我正在运行一个perl脚本,通过。但其中一些站点已将一些TOR出口节点列入黑名单,并发送http状态403,而不是预期的响应。在这种情况下,我想向本地TOR进程发送一个命令,以更改其电路/标识 这就引出了我的第一个(次要重要)问题: 当谈到TOR时,»电路«和»标识«的意思是否相同 但我更重要的问题是: 如何从perl脚本向本地运行的TOR进程发送»change identity«命令 (据我所知,这个命令是signal newnym,但我如何发送它呢?) ,并被告知执行系统调用 pkill -

我正在运行一个perl脚本,通过。但其中一些站点已将一些TOR出口节点列入黑名单,并发送http状态403,而不是预期的响应。在这种情况下,我想向本地TOR进程发送一个命令,以更改其电路/标识

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

当谈到TOR时,»电路«和»标识«的意思是否相同

但我更重要的问题是:

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

(据我所知,这个命令是
signal newnym
,但我如何发送它呢?)

,并被告知执行系统调用

pkill -SIGHUP tor  
这将迫使TOR重新加载其配置文件,然后建立一个新回路,但这不起作用。我猜这是因为我的socks连接仍然是开放的,tor即使在SIGHUP之后仍然使用相同的身份来连接仍然是开放的。(只是猜测)

我认为这是一种过载,迫使TOR重新加载配置文件只是为了创建一个新的电路。我想一定有更优雅的解决方案,比如

  • 创建到TOR控制端口的连接
  • 发送»更改标识«(
    信号新名称
  • 密切联系
  • 如何用perl编写这三个步骤


    在阅读我读过的一些文档时,您必须在一些配置文件中启用控制端口的使用,并且必须使用密码。请告诉我怎么做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:

  • 验证“”
  • 信号新名称
  • 退出
  • 1执行空身份验证
    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:

  • 验证“”
  • 信号新名称
  • 退出
  • 1执行空身份验证
    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