我对sock.recv()
为什么返回在特定端口上运行的服务的名称感到困惑。这就是我的意思。
当您使用python编码并连接到服务器时,通常可以在while True
循环中执行此操作,以接收另一台计算机发送的任何内容。但是,当您一次自发执行recv()
到运行192.168.55.3
的{{1}}上的服务器port 22
时,ssh
返回名称sock.recv(1024)
之类的应用程序
我不了解其背后的机制,希望有人能解释。
我确实做了一些研究,但找不到很多。
ssh version xxx
它返回类似sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((interface, port))
sock.connect((host, host_port))
print(sock.recv(100))
答案 0 :(得分:2)
在某些网络协议中,一旦建立连接,服务器就会向客户端发送消息。该消息可能会标识协议的版本,运行该服务的软件的名称,计算机的名称以及运行的操作系统等。
消息的目的可以从使客户端决定是否连接到正确的服务器并能够与之通信,到简单的虚荣/广告。
执行此操作的协议包括SSH,SMTP和FTP。尝试连接到不同的端口,您会得到非常不同的结果
答案 1 :(得分:1)
每RFC 4253: The Secure Shell (SSH) Transport Layer Protocol, Section 4: "Connection Setup":
SSH可在任何8位干净的二进制透明传输上运行。基础传输应该防止传输错误,因为此类错误会导致SSH连接终止。客户端启动连接。
4.1。通过TCP / IP使用
通过TCP / IP使用时,服务器通常会在端口22上监听连接。该端口号已在IANA上注册,并已正式分配给SSH。
4.2。协议版本交换
建立连接后,双方必须发送一个标识字符串。该标识字符串必须为
SSH-protoversion-softwareversion SP注释CR LF
由于在这组文档中定义的协议为2.0版,因此“协议”必须为“ 2.0”。 “注释”字符串是可选的。如果包含“注释”字符串,则“空格”字符(在上面表示为SP,ASCII 32)必须分隔“软件版本”和“注释”字符串。标识必须由单个回车符(CR)和单个换行符(LF)字符(分别为ASCII 13和10)终止。希望维护Ylonen&Lonvick标准跟踪[页4] RFC 4253 SSH传输层协议于2006年1月与该协议的较早的未记录版本兼容的实现者,由于上述原因,可能希望处理标识字符串而不必期望回车符的存在在本文档的第5节中。空字符不得发送。字符串的最大长度为255个字符,包括回车符和换行符。
Diffie-Hellman密钥交换中使用了回车符和换行符之前的标识字符串的一部分(请参见第8节)。
服务器可以在发送版本字符串之前发送其他数据行。每条线应以回车和换行终止。这样的行绝不能以“ SSH-”开头,并且应该以ISO-10646 UTF-8 [RFC3629]进行编码(未指定语言)。客户必须能够处理这样的线路。这样的行可以被静默忽略,或者可以显示给客户端用户。如果显示它们,则应使用[SSH-ARCH]中讨论的控制字符过滤。此功能的主要用途是允许TCP包装程序在断开连接之前显示错误消息。
'protoversion'和'softwareversion'字符串都必须由可打印的US-ASCII字符组成,但空格字符和减号(-)除外。 “ softwareversion”字符串主要用于触发兼容性扩展并指示实现的功能。 “注释”字符串应包含其他信息,这些信息可能对解决用户问题很有用。因此,有效标识字符串的示例是
SSH-2.0-billsSSH_3.6.3q3
此标识字符串不包含可选的“注释”字符串,因此在“ softwareversion”字符串之后立即由CR和LF终止。
密钥交换将在发送此标识符后立即开始。标识字符串之后的所有数据包都应使用二进制数据包协议,该协议将在第6节中进行描述。
您看到的是打印出来的是服务器的标识字符串:
SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1
位置:
2.0
OpenSSH_4.7p1
Debian-8ubuntu1