python3套接字发送接收'字节'对象没有属性'读取'

Posted

技术标签:

【中文标题】python3套接字发送接收\'字节\'对象没有属性\'读取\'【英文标题】:python3 socket send recev 'bytes' object has no attribute 'read'python3套接字发送接收'字节'对象没有属性'读取' 【发布时间】:2020-11-16 17:41:15 【问题描述】:

我有两个文件:client.pyserver.py,它们在运行时通过套接字连接。 当我从服务器向客户端发送命令时,例如一个简单的ls,我使用一个名为subprocess.Popen 的函数(在客户端)在shell 中执行它。但是,错误字节 object has no attribute 'read' 在我看来。

除了子进程模块还有其他方法可以执行命令吗?

我是否通过以下调用正确运行子进程:

command = subprocess.Popen (args, shell = True, stdout = subprocess.PIPE, stderr = subprocess.PIPE)

下面我附上两个程序的代码。

服务器代码如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import socket

def main():
    try:
        servidor = socket.socket()
        servidor.bind(('localhost',7777))
        servidor.listen(1)

        while True:
            client, direccion = servidor.accept()
            print('[+] Conexion de: '.format(direccion))

            while True:
                comando = input("<server>: ")
                client.send(comando.encode())
                result = client.recv(4096)
                print(result.decode())
    except Exception as e:
        print (e)

if __name__ == '__main__' :
    try:
        main()
    except KeyboardInterrupt:
        exit()

客户端代码如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import socket
import subprocess
import shlex


def main():
    try:
        client = socket.socket()
        client.connect(('localhost', 7777))

        while True:
            datos = client.recv(4096)
            args = shlex.split(datos)
            comando = subprocess.Popen(args, shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
            
            if comando.stderr.read() != "":
                client.send("[-] Error de comando")
            else:
                cliente.send(comando.stdout.read())
    except Exception as e: 
        print (e)

if __name__ == '__main__' :
    try:    
        main()
    except KeyboardInterrupt:
        exit()

【问题讨论】:

【参考方案1】:
   args = shlex.split(datos)

datos 的类型为 bytes,但 shlex.split 需要 str

   args = shlex.split(datos.encode())

【讨论】:

首先要感谢的是提供的响应 当我运行以下行时:args = shlex.split (data.encode ()) 出现以下错误消息:'bytes' object has no attribute 'encode' 一段客户端代码:data = client.recv (4096) args = shlex.split (data.encode ()) command = subprocess.Popen (args, shell = True, stdout = subprocess.PIPE, stderr = subprocess.PIPE) 非常感谢@Uku

以上是关于python3套接字发送接收'字节'对象没有属性'读取'的主要内容,如果未能解决你的问题,请参考以下文章

从套接字连接发送和接收字节

Python3.x基础学习-UDP和TCP用法

如何在套接字通道中发送和接收序列化对象

Protobuf 和非阻塞消息发送/接收

C++ Winsock 结构发送/接收

关于通过(unix-)套接字发送/接收大量数据的另一个困惑