2017-03-06 47 views
0

我被困在一个我正在尝试使用的项目上。现在我正试图设置一个脚本(这一个)在本地机器上打开一个端口,这将使我能够访问它上面的运行命令。我正在使用Netcat连接到它。现在它可以让我连接到netcat,然后我可以输入1个命令,它会给我输出和停止。当我在while循环之外移动“conn,addr = s.accept()”时,我能够反复运行命令,并且在某些情况下应该像它应该那样工作。但是当我尝试运行“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 ..不工作是cd是内部的一个外壳,改变了外壳的当前工作目录(CWD),只有效应shell进程。当你为每个命令启动一个shell时,来自上一个shell的CWD对下一个shell没有影响。

可以启动一次shell并与之通话。这是telnet和ssh所做的。或者自己跟踪CWD,并在不调用shell的情况下处理cd。另一个选项是将每个命令打包并将每个打印$CWD都打印到您的程序中,然后通过subprocess.Popen函数的cwd=选项将该值传递给下一个shell。

+0

我想启动一次shell并与之通话。但不知道如何做到这一点。任何可以让我朝着正确方向的提示? – sqlsqlsql