2017-03-06 6 views
0

私は仕事に取り組んでいます。今、私はそれを実行しているコマンドへのアクセスを与えるローカルマシン上のポートを開くためのスクリプト(この1つ)をセットアップしようとしています。私はそれに接続するためにNetcatを使用しています。今すぐnetcatに接続できるようになり、1つのコマンドを入力すると出力と停止が得られます。 whileループの外側で "conn、addr = s.accept()"を動かすと、私は何度も何度もコマンドを何度もやり直すことができます。しかし、私が "cd .."を実行してディレクトリを戻そうとすると、それは私に許されません。私は何かが欠けているかどうかはわかりませんでした。 cd ..が動作しないのはなぜソケットを使ってPythonサーバーにコマンドを繰り返すには?

host = '' 
port = 12345 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
print("Socket has been created.") 

try: 
    s.bind((host, port)) 
except socket.error: 
    print("Bind failed.") 
    sys.exit() 

print("Socket bind complete.") 

s.listen(5) 
print("Socket is now listening.") 

while 1: 
    conn, addr = s.accept() 
    print("Connected with {0}:{1}".format(addr[0], addr[1])) 
    data = conn.recv(1024) 
    string_data = data.decode('utf-8') 

    proc = subprocess.Popen(string_data, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, 
         stdin=subprocess.PIPE) 
    stdout_value = proc.stdout.read() + proc.stderr.read() 
    conn.sendall(stdout_value) 

    #conn.close() 
    #s.close() 

答えて

0

cdは、シェルの現在の作業ディレクトリ(CWD)を変更した内部シェルがあることであり、その唯一の効果そのシェルプロセス。各コマンドのシェルを起動すると、最後のシェルからのCWDは次のシェルに影響しません。

シェルを一度起動して話してください。これがtelnetとsshの動作です。または、自分自身でCWDを追跡し、シェルを起動することなくcdを処理します。もう1つのオプションは、すべてのコマンドをラップし、各印刷を$CWDにしてから、subprocess.Popenオプションのcwd=オプションでその値を次のシェルに渡すことです。

+0

シェルを一度起動して話をしたいと思います。しかし、これを行う方法がわかりません。正しい方向に私を置くことができるヒント? – sqlsqlsql

関連する問題