黑帽Python TCP客户端

黑帽Python TCP客户端,python,hackage,Python,Hackage,我正在阅读Black Hat Python书籍,虽然它是在2015年编写的,但其中一些代码似乎有点过时。例如,print语句不使用括号。但是,我似乎无法让下面的脚本运行,并且不断出现错误 # TCP Client Tool import socket target_host = "www.google.com" target_port = 80 # creates a socket object. AF_INET parameter specifies IPv4 addr/host

我正在阅读Black Hat Python书籍,虽然它是在2015年编写的,但其中一些代码似乎有点过时。例如,print语句不使用括号。但是,我似乎无法让下面的脚本运行,并且不断出现错误

    # TCP Client Tool

import socket

target_host = "www.google.com"
target_port = 80

# creates a socket object. AF_INET parameter specifies IPv4 addr/host. SOCK_STREAM is TCP specific, not UDP.
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# connect the client
client.connect((target_host, target_port))

# sending some data
client.send("GET / HTTP/1.1\r\nHost: google.com\r\n\r\n\")

# receive some data
response = client.recv(4096)

print(response)
我得到的错误只是读取,文件,第15行 client.sendGET/HTTP/1.1\r\n主机:google.com\r\n\r\n\ ^

在前面加一个\进行转义,这意味着python不知道字符串在这里结束。您可以注意到,在您的帖子中,该行后面的所有代码都被着色,就像它是一个字符串一样

client.send还需要类似字节的对象,而不是字符串。您可以通过在字符串前放置b来指定:

client.sendbGET/HTTP/1.1\r\n主机:google.com\r\n\r\n 在此之后,脚本工作正常

您将通过在前面放置\来转义,这意味着python不知道字符串在这里结束。您可以注意到,在您的帖子中,该行后面的所有代码都被着色,就像它是一个字符串一样

client.send还需要类似字节的对象,而不是字符串。您可以通过在字符串前放置b来指定:

client.sendbGET/HTTP/1.1\r\n主机:google.com\r\n\r\n 在那之后,脚本工作得很好

我想已经完全回答了问题,解决问题所需的所有细节都在那里。然而,由于这是一个从书中学习的练习,其他人可能会来这里,而在的答案中所发生的事情的细节有点简短,我将进一步展开

串 简而言之,Python和许多其他语言一样,都有所谓的“放在某物前面”的意思——后面的任何东西都有特殊的含义。两个例子:

示例1:行打断新行 这将导致python将n解释为一个特殊字符,而不是字母n,这表明这里应该有一个新行,这一切都要归功于\n位于字母n前面\r也是一条新线,但在旧时代,它相当于移动——而不仅仅是移动一条线

示例2:引号在字符串中转义

print("I want to print this quote: \" in my string")

在这个例子中,因为我们使用引号字符来启动和结束字符串,在中间添加它会破坏字符串,希望这对你来说是清楚的。为了继续在文本中间添加引号,我们需要再次在引用之前添加一个转义序列字符,这就告诉Python不要将引用作为引用分析,而是简单地将其添加到字符串中。除此之外还有一种选择,那就是:

print('I want to print this quote: " in my string')
这是因为整个字符串的开头和结尾都是'而不是',这使Python能够准确地猜测实际整个字符串的解析开始和结束-这使它100%确信本例中的引号只是字符串的另一部分。这些转义序列还有更多的例子

字节与字符串 为了更好地理解这种差异,我们将首先了解Python和您使用的终端是如何交互的。我假设您正在从cmd.exe、powershell.exe或在Linux中运行python脚本,比如xterm或其他。基本终端,即

终端将尝试解析发送到其输出缓冲区的任何内容,并将其表示给您。您可以通过执行以下操作进行测试:

print('\xc3\xa5\xc3\xa4\xc3\xb6') # Most Linux systems
print('\xe5\xe4\xf6') # Most Windows systems
理论上,上面的其中一个打印应该让您只打印一组字节,终端知道如何将其渲染为åäö。甚至你的浏览器也只是为你做了一些有趣的事情,这也是他们解决表情符号问题的方法,每个人都同意某些字节组合应该变成我想我已经完全回答了这个问题,解决这个问题所需的所有细节都在那里。然而,由于这是一个从书中学习的练习,其他人可能会来这里,而在的答案中所发生的事情的细节有点简短,我将进一步展开

串 简而言之,Python和许多其他语言一样,都有所谓的“放在某物前面”的意思——后面的任何东西都有特殊的含义。两个例子:

示例1:行打断新行 这将导致python将n解释为一个特殊字符,而不是字母n,这表明这里应该有一个新行,这一切都要归功于\n位于字母n前面\r也是一条新线,但在旧时代,它相当于移动——而不仅仅是移动一条线

示例2:引号在字符串中转义

print("I want to print this quote: \" in my string")

在这个例子中,因为我们使用引号字符来启动和结束字符串,在中间添加它会破坏字符串,希望这对你来说是清楚的。为了继续在文本中间添加引号,我们需要再次在引用之前添加一个转义序列字符,这就告诉Python不要将引用作为引用分析,而是简单地将其添加到字符串中。除此之外还有一种选择,那就是:

print('I want to print this quote: " in my string')
这是因为整个字符串的开头和结尾都是'而不是',这使得Python能够准确地 s解析实际整个字符串的开始和停止-这使它100%确信本例中的引号只是字符串的另一部分。这些转义序列还有更多的例子

字节与字符串 为了更好地理解这种差异,我们将首先了解Python和您使用的终端是如何交互的。我假设您正在从cmd.exe、powershell.exe或在Linux中运行python脚本,比如xterm或其他。基本终端,即

终端将尝试解析发送到其输出缓冲区的任何内容,并将其表示给您。您可以通过执行以下操作进行测试:

print('\xc3\xa5\xc3\xa4\xc3\xb6') # Most Linux systems
print('\xe5\xe4\xf6') # Most Windows systems

理论上,上面的其中一个打印应该让您只打印一组字节,终端知道如何将其渲染为åäö。甚至你的浏览器也只是为了你的乐趣而这么做了。注意,这也是他们解决表情符号问题的方法。每个人都同意某些字节组合应该是这样的。看起来你的客户端中有太多反斜杠。发送请求。你逃过了关门。试试:client.sendGET/HTTP/1.1\r\n帖子:google.com\r\n\r\n提醒:那本书是用Python2写的。从2019年12月31日开始。因此,如果您对Python的基础知识没有很好的掌握,那么从这本书开始就很难。因为在很多地方字符串和字节之间会有一些转换问题。例如,所有套接字请求都需要将字节对象传入和传出套接字。所以socket.sendGET。。。实际上应该是socket.sendbytesGET…,例如“UTF-8”。@谢谢您的输入!所以我只需要在前面指定字节,否则它会将其作为字符串读取?字节是一个字符串,只是不使用非常简单的编解码器进行编码terms@Steppenwolf1917做这件事没有简单的方法,但我在下面尽了最大的努力。这是一个很长的文本,但这是因为它描述了字符串编码字节对象和字节数据流的基本概念。以及它们存在的原因以及何时使用它们。看起来您的客户端中有太多反斜杠。发送请求。你逃过了关门。试试:client.sendGET/HTTP/1.1\r\n帖子:google.com\r\n\r\n提醒:那本书是用Python2写的。从2019年12月31日开始。因此,如果您对Python的基础知识没有很好的掌握,那么从这本书开始就很难。因为在很多地方字符串和字节之间会有一些转换问题。例如,所有套接字请求都需要将字节对象传入和传出套接字。所以socket.sendGET。。。实际上应该是socket.sendbytesGET…,例如“UTF-8”。@谢谢您的输入!所以我只需要在前面指定字节,否则它会将其作为字符串读取?字节是一个字符串,只是不使用非常简单的编解码器进行编码terms@Steppenwolf1917做这件事没有简单的方法,但我在下面尽了最大的努力。这是一个很长的文本,但这是因为它描述了字符串编码字节对象和字节数据流的基本概念。感谢您的反馈,非常感谢!对于类似字节的对象,如果不是字符串,我需要什么样的输入?@StephenWalf1917我在下面写了一个描述,说明何时以及为什么要使用它们,为什么字符串需要转换为类似字节的对象,以及当你把它简化为同一个对象时为什么它们是相同的,只是字符串上的不同抽象层。谢谢你的反馈,非常感谢!对于类似字节的对象,如果不是字符串的话,我需要什么样的输入?@StephenWalf1917我在下面写了一个描述,说明了什么时候以及为什么要使用它们,为什么字符串需要转换成类似字节的对象,以及当你把它简化为同一个对象时为什么它们是相同的,只是字符串上的不同抽象层。