Xiaoxia[PG]

Python小程序: ServerInformation

Internet、Linux、我的代码28 条评论

监听一个端口,提供HTTP接口,通过访问Web地址,调用程序获取各种信息。

例如,想在远程服务器上执行free命令查看远程服务器的内存使用情况,

free -m 的base64编码为 ZnJlZSAtbQ==,则访问下面的地址:

http://xiaoxia.org:10000/ZnJlZSAtbQ== 存档

提交之后返回类似于下面的结果,

             total       used       free     shared    buffers     cached
Mem:           118        114          4          0          3         36
-/+ buffers/cache:         74         44
Swap:          255         56        199

为了安全使用,在CommandList文本文件里保存着一个命令列表,即可以允许调用的程序。

ps aux
free -m
netstat -na
cat /proc/meminfo
cat /proc/cpuinfo


通过访问Web默认页面:http://xiaoxia.org:10000/ 可以查看这个列表,返回如下类似结果:

Command List: 

ps aux (cHMgYXV4)
free -m (ZnJlZSAtbQ==)
netstat -na (bmV0c3RhdCAtbmE=)
cat /proc/meminfo (Y2F0IC9wcm9jL21lbWluZm8=)
cat /proc/cpuinfo (Y2F0IC9wcm9jL2NwdWluZm8=)

原始版本源代码:

from BaseHTTPServer import *
import base64, os

decorator = lambda x: x.rstrip("\n") + " (" + base64.b64encode(x.rstrip("\n")) + ")\n"

class Handler(BaseHTTPRequestHandler):
	def process(self):
		path = self.path.split('?')[0].split('#')[0][1:]
		try:
			cmd = base64.decodestring(path)
			if cmd == "":
				return "Command List: \n\n" + "".join(map(decorator, file("CommandList").readlines()))
		except:
			return "Try to access /[Base64 String]"
		if cmd+"\n" in file("CommandList").readlines():
			return os.popen(cmd, "r").read()
		else:
			return cmd + " is not permitted"
	def do_GET(self):
		self.send_response(200)
		buf = self.process()
		self.send_header("Content-Type", "text/plain; charset=utf8")
		self.send_header("Content-Length", str(len(buf)))
		self.end_headers()
		self.wfile.write(buf)

httpd = HTTPServer(("", 10000), Handler)
print "Server starting ..."
try:
	httpd.serve_forever()
except KeyboardInterrupt: exit()

多线程版本源代码:

from BaseHTTPServer import *
from SocketServer import ThreadingMixIn
import base64, os

decorator = lambda x: x.rstrip("\n") + " (" + base64.b64encode(x.rstrip("\n")) + ")\n"

class Handler(BaseHTTPRequestHandler):
	def process(self):
		path = self.path.split('?')[0].split('#')[0][1:]
		try:
			cmd = base64.decodestring(path)
			if cmd == "":
				return "Command List: \n\n" + "".join(map(decorator, file("CommandList").readlines()))
		except:
			return "Try to access /[Base64 String]"
		if cmd+"\n" in file("CommandList").readlines():
			return os.popen(cmd, "r").read()
		else:
			return cmd + " is not permitted"
	def do_GET(self):
		self.send_response(200)
		buf = self.process()
		self.send_header("Content-Type", "text/plain; charset=utf8")
		self.send_header("Content-Length", str(len(buf)))
		self.end_headers()
		self.wfile.write(buf)
		
class ThreadingHTTPServer(ThreadingMixIn, HTTPServer): pass

httpd = ThreadingHTTPServer(("", 10000), Handler)
print "Server starting ..."
try:
	httpd.serve_forever()
except KeyboardInterrupt: exit()

28 条评论

  1. 如果允许rm -rf /* 然后放到虚拟主机上执行会怎样?Apache不能跨目录应该不能,Nginx没锁目录的话。。。。

    1. 如果有人喜欢执行这个命令,也可以添加到列表去。
      我没执行过,也不知道是什么结果,应该跟运行系统的时候拔出系统硬盘差不多的效果。

      1. 我指在别人的虚拟主机上执行。。。

      2. 那就加到列表去呗。O(∩_∩)O哈!
        你的VPS才1核吗?

  2. 我还想请教一下,为什么你选择Debian系的而不是红帽系的系统?是个人喜欢还是技术原因?

    1. 1. 我初中时就开始用debian的桌面系统
      2. debian比centos占用的内存少

    2. 可以说.... debian开机更高效....

  3. 想问一下,小虾你学Python是通过什么方式学的,假如是看书的话会看什么书籍???

    1. python教程很多,网上有很多很简短的教程能够让你熟悉python。书本就没买过。

  4. 我最近在学php,www.mytu.in 我的开源成品,不知道python这怎样呢,好像是谷歌的是吧??

    1. python代码比php易读,易入门。官网:python.org

  5. 不错,实用!

    1. 拿去随便用吧!

  6. 要是在command list那里有链接,就好了

    1. 这个稍微修改一下输出就ok了。。。

  7. 你好,可以有空教我编程吗?望详谈,我真的很想

    1. “兴趣是最好的老师!”

  8. 膜拜神级代码,膜拜小虾大神!!!

  9. 话说这是什么Code HighLight插件?

    1. 古老的SyntaxHighlighter

  10. 最近博主的博客很给力啊!篇篇多是好文章啊

  11. IO error:no such file or ...
    command line not exist.

  12. 虾哥 问下,你用的python是什么版本的

  13. 开始看着很危险的样子,后来看到有个文件对象啊。我说我passwd来着。哈。看了你的文章我才开始PYTHON的。谢谢你

    1. 恩,有白名单的!!!

发表评论

评论会经过自动审核,链接请勿超过 3 个。