架设你自己的堡垒机 — GateOne

GateOne是一款基于HTML5的开源终端模拟器/SSH客户端,同时内置强大的插件功能。它自带的插件使其成为一款令人惊艳的SSH客户端,但是,它可以用于运行任何终端应用。用户可以将GateOne嵌入其他应用程序从而提供各类终端访问界面,它也支持各类基于Web的管理界面……后面的大家自己看吧~~

GateOne是实用python开发的,它的安装也非常的简单,下载GateOne源码到服务器,并解压缩之后:

sudo python setup.py install

期间,系统会提示GateOne运行所必要的包,直接用pip来进行安装就可以了。

安装之后,会自动在/etc/init.d下生成自启动文件gateone,启动、停止、重启的命令如下:

service gateone start
service gateone stop
service gateone restart

GateOne的配置文件,默认存放于/etc/gateone/conf.d目录下,有三个文件:

10server.conf、20authentication.conf、50terminal.conf

10server.conf中,可以设置web页面的端口、协议等信息,默认开启ssl,通过https协议访问:

https://127.0.0.1:443

Respberry Pi的GPIO针脚说明以及其电平操作

可以通过树莓派自带的GPIO针脚控制诸如继电器或是其它控制器,来实现基础的“物联网”,来达到控制家中电器的目的。

关于GPIO针脚的说明介绍如下图:

从树莓派官方下载回来的Respbian自带的python环境中,内置了RPi.GPIO包,是对树莓派的GPIO针脚的操作库。

对其进行二次封装,简化了控制针脚电平的功能操作。

代码 GPIO.py :

#!/usr/bin/env python
#coding=utf-8

import RPi.GPIO

RPi.GPIO.setwarnings(False)
RPi.GPIO.setmode(RPi.GPIO.BOARD)

class GPIO:

	OUT = RPi.GPIO.OUT
	IN = RPi.GPIO.IN

	LOW = RPi.GPIO.LOW
	HIGH = RPi.GPIO.HIGH

	def set_high(self, G_PORT):
		try:
			RPi.GPIO.setup(G_PORT, self.OUT)
			if RPi.GPIO.input(G_PORT) == self.LOW:
				RPi.GPIO.output(G_PORT, self.HIGH)
			state = RPi.GPIO.input(G_PORT)
			RPi.GPIO.cleanup()

			return True, state
		except:
			return False, -1

	def set_low(self, G_PORT):
		try:
			RPi.GPIO.setup(G_PORT, self.OUT)
			if RPi.GPIO.input(G_PORT) == self.HIGH:
				RPi.GPIO.output(G_PORT, self.LOW)
				RPi.GPIO.setup(G_PORT, self.IN)
			state = RPi.GPIO.input(G_PORT)
			RPi.GPIO.cleanup()

			return True, state
		except:
			return False, -1

	def trigger(self, G_PORT):
		try:
			RPi.GPIO.setup(G_PORT, self.OUT)
			if RPi.GPIO.input(G_PORT) == self.LOW:
				result, state = self.set_high(G_PORT)
			else:
				result, state = self.set_low(G_PORT)
			RPi.GPIO.cleanup()

			return result, state
		except:
			return False, -1

	def get_state(self, G_PORT):
		try:
			RPi.GPIO.setup(G_PORT, self.OUT)
			state = RPi.GPIO.input(G_PORT)
			RPi.GPIO.cleanup()

			return True, state
		except:
			return False, -1

if __name__ == '__main__':
	gpio = GPIO()

	# 设置高电平
	gpio.set_high(7)

	# 设置低电平
	gpio.set_low(7)

	# 切换高低电平
	gpio.trigger(7)

	# 获取针脚当前电平状态
	gpio.get_state(7)

树莓派+Prowl 监控PPPOE的IP地址变更

前段时间买的树莓派用着一直很爽,不爽的动态DNS解析,这两天总是出现莫名其妙的问题。经过仔细排查与联系客服后,最终还是解决了问题。

但是在解决问题的过程中,因为白天要到公司,所以当DNS动态解析失败时,无法准确获得家里的公网IP地址。也就是说当DNS动态解析失败时,根本就无法从公网对家里的TP-LINK路由器进行远程管理。

So,动手写了下面这个脚本,与crontab来配合执行,实现了PPPOE拨号宽带IP地址变更后,将新IP地址推送到Prowl手机客户端的功能(有了家里路由器的新IP,就可以直接进行远程管理了)。

Prowl是一个Growl的iOS客户端,允许用户从Mac、Windows或其他应用程序向iPhone、iPad或iPod Touch进行消息推送。

脚本中未对各类型的异常进行处理,如有需要,请自行添加。另外,如果不希望使用Prowl,也可以稍微改一下脚本,向支持Push mail的邮箱中发送邮件,也可以达到实时提醒的目的。

代码 ip_push.py:

#!/usr/bin/env python
#coding=utf-8

import os, urllib, urllib2, cPickle

prowl_api_key = 'your_prowl_api_key'

strfilepath = os.path.dirname(os.path.realpath(__file__))

def get_ip():
	_api_addr = 'http://pv.sohu.com/cityjson?ie=utf-8'
	_request = urllib2.Request(_api_addr)
	_res = urllib2.urlopen(_request).readline()
	exec(_res[4:])
	return returnCitySN['cip']

def push_message(content, url):
	_api_addr = 'http://api.prowlapp.com/publicapi/add'
	_data = {
		'apikey':prowl_api_key,
		'application':'服务器IP地址更新',
		'url':url,
		'description':content,
	}
	_request = urllib2.Request(_api_addr)
	return urllib2.urlopen(_request, urllib.urlencode(_data)).read()

def check_up_update(ip_address):
	storefile = strfilepath + '/ip_push.dat'
	if os.path.exists(storefile):
		fp = open(storefile)
		old_ip_address = cPickle.load(fp)
		fp.close()
	else:
		old_ip_address = ''

	if ip_address != old_ip_address:
		fp = open(storefile, 'w')
		cPickle.dump(ip_address, fp)
		fp.close()
		return True
	else:
		return False

if __name__ == '__main__':
	ip_address = get_ip()
	if check_up_update(ip_address):
		message = '新的服务器IP地址更新为:' + ip_address
		url = 'http://' + ip_address + ':8080'
		print(message)
		print(push_message(message, url))

在树莓派的系统环境中编辑crontab:

crontab -e

添加下面行,每分钟执行脚本一次(依个人情况需要):

*/1 * * * * /scripts/ip_push.py

使用Python分析命令行传递的参数

用Python开发脚本程序的过程中,难免会使用到参数,可以通过下面方式对参数进行处理。

处理的过程中,需要用到内置的库getopt来进行分析:

import sys, getopt
opts = getopt.getopt(sys.argv[1:], '', ['date='])
for key, value in opts[0]:
	print key
	print value

参数可以通过下面两种方式传递:

$ ./script.py --date=2013-01-14
$ ./script.py --date 2013-01-14

Python下MySQLdb库的使用

Python下MySQLdb库的项目地址是:http://sourceforge.net/projects/mysql-python/

连接:

conn=MySQLdb.connect(host="localhost",user="root",passwd="",db="test",charset="utf8")
cursor = conn.cursor()

写入:

sql = "insert into user(name,created) values(%s,%s)"
param = ("aaa",int(time.time()))
n = cursor.execute(sql,param)
conn.commit()
print n

注:executemany 的param可以传入一个序列,批量执行

更新:

sql = "update user set name=%s where id=3"
param = ("bbb")
n = cursor.execute(sql,param)
print n

查询:

n = cursor.execute("select * from user")
for row in cursor.fetchall():
for r in row:
	print r

删除:

sql = "delete from user where name=%s"
param =("aaa")
n = cursor.execute(sql,param)
print n

关闭:

cursor.close()
conn.close()

用python建立socket服务器

给朋友写了个脚本,用到了socket服务器,翻到之前写的代码,拿到这里记录一下。

直接贴代码:

#!/usr/bin/env python
from SocketServer import ThreadingTCPServer as TCP
from SocketServer import StreamRequestHandler as SRH
from time import ctime

host = ''
port = 12345
addr = (host, port)

class MyRequestHandler(SRH):
def handle(self):
	while True:
		input = self.rfile.readline()
		if not input.strip():
			break
		self.wfile.write('input content is : %s' % input)

tcpServ = TCP(addr, MyRequestHandler)
tcpServ.serve_forever()

 

代码仅实现了最基本的socket服务器端接收请求。

10个实用的Django建议

Django 作为一个杰出的Python开源框架,或许得不到和其它流行框架如Rails这样多的赞美,但是它和其他框架一样精炼,非常注重DRY(Don’t Repeat Yourself)原则、组件的重用性,通过自动化过程使编码更简洁。

如果在Django项目中能够灵活使用某些方法和技巧的话,它将大大加快软件开发的速度同时避免很多头疼的事。作者在下面列举了几点,这些方法由浅入深,可以帮助任何级别的程序员更加熟练的使用Django。

1、 在配置中使用相对路径

某些原因使得项目可能常常会被来回的迁移。如果没有事先规划好这种可能性的话这绝对是一个棘手的问题。Rob Hudson 有一个极好的技巧能够确保你的Django项目在部署过程中能够轻松的来回迁移。仅仅只要编写几行代码在你的配置文件(settings.py)中。

import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

TEMPLATE_DIRS = (
    BASE_DIR + '/templates',
)

阅读更多