【发布时间】: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()
【问题讨论】:
标签: python sockets subprocess send