gpt4 book ai didi

python - 通过客户端/服务器的Python子进程更改目录

转载 作者:行者123 更新时间:2023-12-03 11:55:32 25 4
gpt4 key购买 nike

我试图通过现有客户端上的套接字库远程更改cwd,但是每次我发送实际的命令“cd ..”时,我都会遇到麻烦。

服务器:

import socket, subprocess, os, sys

s = socket.socket()

host = socket.gethostname()
ip = socket.gethostbyname(host)
port = 8080

s.bind((ip,port))
s.listen(5)

c, a = s.accept()

fr = c.recv(10000)

cwd = fr

print("IP: "+str(a[0])+":"+str(a[1])+"\tCONNECTED")

while True:
cmd = raw_input("\n"+cwd+"> ")
if cmd != "":
c.sendall(cmd)
data = c.recv(1024)
print("\n"+data)

if cmd == "cd ..":
c.sendall(cmd)
cwd = c.recv(1024)

客户:
import socket, subprocess, os, sys



i = 1



cwd = os.getcwd()

while 1:
s = socket.socket()
host = socket.gethostname()
ip = socket.gethostbyname(host)
port = 8080

try:
s.settimeout(5)
s.connect((ip,port))
s.settimeout(None)
s.sendall(cwd)

i = 1

while i == 1:
cmd = s.recv(10000)
if cmd != "over":
sp = subprocess.Popen(cmd, shell=True, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
out = sp.stdout.read()+"_________________________________"
msg = out + sp.stderr.read()
s.sendall(msg)
if cmd == "over":
s.close()
i = 0

if cmd == "cd ..":
j = 0
k = 0
for i in cwd:
if i == '/':
k = j
j = j + 1
cd = cwd[0:k]
subprocess.Popen('echo', shell=True, cwd=cd)
s.sendall(cd)

print(cd)


except socket.error:
continue

这是我得到的错误:
Traceback (most recent call last):
File "PycharmProjects/server-client/test_hq.py", line 25, in <module>
c.sendall(cmd)
File "/usr/lib/python2.7/socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 104] Connection reset by peer

我不知道是什么问题...

最佳答案

这应该更接近您想要的内容,一次接收和发送比重复发送和接收相同的命令要简单得多:

Client.py:

import socket, subprocess, os, sys

cwd = os.getcwd()

def make_socket():
s = socket.socket()
host = socket.gethostname()
ip = socket.gethostbyname(host)
port = 8080
s.settimeout(5)
s.connect((ip, port))
s.settimeout(None)
s.sendall(cwd)
return s

while True:
s = make_socket()
try:
while True:
cmd = s.recv(10000)
if cmd == "cd ..":
# os.chdir("..") # uncomment to actually change directory
cd = cwd.rsplit(os.sep(), 1)[0]
subprocess.Popen('echo', shell=True, cwd=cd)
s.sendall(cd)
elif cmd != "over":
sp = subprocess.Popen(cmd, shell=True, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
stdin=subprocess.PIPE)
out = sp.stdout.read() + "_________________________________"
msg = out + sp.stderr.read()
s.sendall(msg)
else:
print("closed")
s.close()
sys.exit(0)
except socket.error as e:
print(e)
break

server.py:
import socket, subprocess, os, sys

s = socket.socket()

host = socket.gethostname()
ip = socket.gethostbyname(host)
port = 8080

s.bind((ip,port))
s.listen(5)

c, a = s.accept()

fr = c.recv(10000)

cwd = fr

print("IP: "+str(a[0])+":"+str(a[1])+"\tCONNECTED")

while True:
cmd = raw_input("\n"+cwd+"> ")
if cmd == "cd ..":
print("sending 2")
c.sendall(cmd)
# os.chdir("..") # uncomment to change dir
cwd = c.recv(10000)
elif cmd != "":
print("sending 1")
c.sendall(cmd)
data = c.recv(10000)
print("\n"+data)

如果要处理关闭服务器端套接字和sys.exit(0)的客户端,则应在服务器端捕获socket.error,以避免管道错误。
try:
while True:
print(os.getcwd(),44444)
cmd = raw_input("\n"+cwd+"> ")
if cmd != "" and cmd != "cd ..":
print("sending 1")
c.sendall(cmd)
data = c.recv(10000)
print("\n"+data)
if cmd == "cd ..":
print("sending 2")
c.sendall(cmd)
# os.chdir("..") # uncomment to change dir
cwd = c.recv(10000)
except socket.error as e:
print("Exception caught for {}".format(e.strerror))

如果您想根据errno做不同的事情,可以在以下方面进行比较:
if e.errno == errno.EPIPE:,例如折断的管道等。

所有errno都在 errno docs中列出

关于python - 通过客户端/服务器的Python子进程更改目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31357762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com