使用Python和Twisted通过telnet进行HTTP请求

6 投票
1 回答
1404 浏览
提问于 2025-04-17 01:51

我想做的是这样的:

通过网页浏览器连接到远程服务器(server1),然后通过telnet连接到需要认证的squid代理(server2),这个连接是在80端口上进行的。

我写了一个小的Python脚本,使用了Twisted(在这里:

#! /usr/bin/python
from twisted.internet import reactor, protocol
from twisted.web import http
from telnetlib import Telnet
import getpass
from sys import stdout

class datareceiver(protocol.Protocol):
    def dataReceived(self,data):
        self.telnet_con.write(data)
        stdout.write( self.telnet_con.read_all() )

    def connectionMade(data):
        stdout.write("\nA connection was made to this server\n")

def main():
    server1 = "10.1.1.1"
    #user = raw_input("Enter your remote account: ")
    password = getpass.getpass()
    tn = Telnet(server1)

    if password:
        tn.read_until("Password: ")
        tn.write(password + "\n")

    #This is server2
    tn.write("telnet 10.1.1.10 80 \n")


    #serverfac = protocol.Factory()
    serverfac = http.HTTPFactory()
    datareceiver.telnet_con = tn
    serverfac.protocol = datareceiver
    reactor.listenTCP(9229,serverfac)

    reactor.run()
    tn.write("exit\n")

    print tn.read_all()

if __name__ == "__main__":
    main()

但是后来我意识到我这样做是不对的,我的命令行界面收到了来自squid的所有回复,而不是浏览器的回复。

有人能简单说一下正确的做法吗?我是不是应该用其他的东西来代替Twisted?

1 个回答

1

我觉得你可以看看 twisted.web.server.Sitetwisted.web.resource.Resource 这两个链接。还有,因为你在使用 Twisted,可能还需要用到 twisted.protocols.telnet.Telnet 来处理 telnet 连接,不然你的应用就不能做到异步处理。

你也可以看看 这篇博客这里的这个回答,可能会对你有帮助。

希望这些对你有帮助!

撰写回答