python3套接字发送接收'字节'对象没有属性'读取'
Posted
技术标签:
【中文标题】python3套接字发送接收\'字节\'对象没有属性\'读取\'【英文标题】:python3 socket send recev 'bytes' object has no attribute 'read'python3套接字发送接收'字节'对象没有属性'读取' 【发布时间】:2020-11-16 17:41:15 【问题描述】:我有两个文件:client.py 和 server.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套接字发送接收'字节'对象没有属性'读取'的主要内容,如果未能解决你的问题,请参考以下文章