有了这个就再也不用羡慕人家的PS1帅气了
xmodem协议及其python实现
python 之 django学习笔记
- 创建管理员账号:
1python manage.py createsuperuser - 也可以手动添加:
python manage.py shell123456from django.contrib.auth.models import Useruser=User()user.username="admin"user.is_superuser=Trueuser.set_password('admin')user.save()
python web开发框架
Python web开发框架:
Django 、Flask、Tornado、Bottle、Twisted
Tornado: http://www.tornadoweb.org/en/stable/
Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed.
Twisted: https://pypi.python.org/pypi/Twisted/ http://twistedmatrix.com/trac/
An asynchronous networking framework written in Python
twisted/tornado 更是一个server,框架部分只是方便使用该server而附带的,不是重点;你可以选择使用tornado server + Django框架, 而对于Bottle框架而言,是允许指定使用哪种server的,支持的server有:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
server_names = { 'cgi': CGIServer, 'flup': FlupFCGIServer, 'wsgiref': WSGIRefServer, 'waitress': WaitressServer, 'cherrypy': CherryPyServer, 'paste': PasteServer, 'fapws3': FapwsServer, 'tornado': TornadoServer, 'gae': AppEngineServer, 'twisted': TwistedServer, 'diesel': DieselServer, 'meinheld': MeinheldServer, 'gunicorn': GunicornServer, 'eventlet': EventletServer, 'gevent': GeventServer, 'geventSocketIO':GeventSocketIOServer, 'rocket': RocketServer, 'bjoern' : BjoernServer, 'auto': AutoServer, } |
Bottle默认使用的server为: 如下:
1 2 3 |
def run(app=None, server='wsgiref', host='127.0.0.1', port=8080, interval=1, reloader=False, quiet=False, plugins=None, debug=None, **kargs): |
所以,有些技术不是同一个层面的,不能相提并论,非此即彼;
Django or Flask:
https://www.zhihu.com/question/33538127
http://bottlepy.org/docs/dev/index.html
关于webssh的实现
webssh的关键点:
- 选择websocket协议,http不适合
- webssh server端需要能:
- select websocket的输入,一旦有输入,就转发到ssh server
- select ssh server的输出,一旦有输出,就转发到websocket
- 要实现上面两点:
- 要么自己实现websocket server,因为:
- select websocket的输入是websocket server的事情,而select ssh server 的输出是应用逻辑的事情,无法在同一个select上检查这两个fd的事件
- 要么websocket server端语言支持多线程
- 要么自己实现websocket server,因为:
- 对于PHP语言,我们实现自己的websocket server比较麻烦,同时,PHP也不支持多线程,所以PHP实现webssh很难
- 对于Python语言,因为Python支持多线程,所以,这事儿就好办,jumpserver里面的webssh就是通过多线程实现的
文件打开之“文本模式”与“二进制模式”
php 中关于 fopen函数的说明中,mode参数没有正式提到二进制模式(b),但是在参数说明的列表下面有关于二进制打开方式的说明,并且提到可以使用”b” 来指定二进制模式,这里的二进制模式和文本模式的差别仅仅在于 \r\n 与 \n 之间的差别,和文件编码没有关系。
python中关于“文本模式”和“二进制模式”的差别则在于文件的编码
spring bean 顺序问题
问题:
配置类中明确定义了DataSource bean,但是在另一个类中Autowired的一个jdbcTemplate怎么都装配失败,调试发现,DataSource Bean定义的太晚了,如果提前到jdbcTemplate定义的那个类中就没问题了
另外的解决办法: 其实我们完全可以在配置类上 :
1 |
@EnableAutoConfiguration |
这样的话,只需要在 application.properties 中定义如下即可:
1 2 3 |
spring.datasource.url=jdbc:mysql://172.16.22.37:3306/test spring.datasource.data-username=phpor spring.datasource.data-password=phpor-password |
logstash-output-syslog 之 facility定义问题
问题:
当我们在logstash-output-syslog中配置facility为local6的时候,实际上走的是local4;而定义facility为local7的时候,实际上走的是local5,但是,定义为daemon的时候,确实是daemon
原因:
- 参考源码: https://github.com/phpor/logstash-output-syslog/blob/master/lib/logstash/outputs/syslog.rb 关于facility的定义有一个数组:
123456789101112131415161718192021222324FACILITY_LABELS = ["kernel","user-level","mail","daemon","security/authorization","syslogd","line printer","network news","uucp","clock","ftp","ntp","log audit","log alert","local0","local1","local2","local3","local4","local5","local6","local7",]
而rfc中的定义如下: https://tools.ietf.org/html/rfc3164#section-4.1.1
123456789101112Numerical FacilityCode0 kernel messages1 user-level messages2 mail system3 system daemons<strong> 4 security/authorization messages (note 1)</strong><span class="grey">Lonvick Informational [Page 8]</span>1234567891011121314151617181920212223<a id="page-9" class="invisible" href="https://tools.ietf.org/html/rfc3164#page-9" name="page-9"> </a><span class="grey"><a href="https://tools.ietf.org/html/rfc3164">RFC 3164</a> The BSD syslog Protocol August 2001</span>5 messages generated internally by syslogd6 line printer subsystem7 network news subsystem8 UUCP subsystem<strong> 9 clock daemon (note 2)</strong><strong> 10 </strong> <strong>security/authorization messages (note 1)</strong>11 FTP daemon12 NTP subsystem13 log audit (note 1)14 log alert (note 1)<strong> 15 clock daemon (note 2)</strong>16 local use 0 (local0)17 local use 1 (local1)18 local use 2 (local2)19 local use 3 (local3)20 local use 4 (local4)21 local use 5 (local5)22 local use 6 (local6)23 local use 7 (local7)
我们发现,4和10的定义是重复的,9和15的定义是重复的; 而插件源码中把这两个重复的条目就简单去掉了,于是就导致facility-code就对不上了 - 解决办法: 把重复的两项补回去就可以了
给容器设置网络
- 通过pipework给容器添加、配置、期望网络(这个就不说了)
- 如果在不重启容器的情况下,禁用容器的网络,然后在需要的时候在启动呢?
- 禁用容器网络: ifdown eth0
- 启用容器网络: ifup eth0
- 如果容器中没有ifup、ifdown、甚至没有ip命令呢?
- 通过nsenter -t pid-of-container -n (进入容器网络名字空间,但是文件系统还是宿主机的)
- 执行ip相关命令:
123ip link set eth0 upip addr add 172.16.0.3/24 dev eth0ip route add default via 172.16.0.1
注意: 这里使用的是ip命令,而不是ifconfig、ifup之类的,因为ip命令不参考本地文件系统中的相关配置,而后者会参考本地文件系统相关网络配置;因为我们需要ip命令,所以使用的是宿主机的文件系统,而不是容器的文件系统,所以在这里设置容器网卡的时候,不能使用ifconfig、ifup之类
- 在宿主机上使用ip netns exec 也能达到和使用nsenter相同的效果,但是似乎没有发现一个比较好的办法根据pid找到网络名字空间,所以还是nsenter更方便些
paramiko模块学习
第一步:安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# pip install paramiko Collecting paramiko Downloading paramiko-2.2.1-py2.py3-none-any.whl (176kB) 100% |████████████████████████████████| 184kB 10kB/s Collecting cryptography>=1.1 (from paramiko) Downloading cryptography-2.0.3-cp27-cp27mu-manylinux1_x86_64.whl (2.2MB) 100% |████████████████████████████████| 2.2MB 5.1kB/s Collecting bcrypt>=3.1.3 (from paramiko) Downloading bcrypt-3.1.3-cp27-cp27mu-manylinux1_x86_64.whl (57kB) 100% |████████████████████████████████| 61kB 3.1kB/s Collecting pyasn1>=0.1.7 (from paramiko) ^@ Downloading pyasn1-0.3.2-py2.py3-none-any.whl (63kB) 100% |████████████████████████████████| 71kB 1.3kB/s Collecting pynacl>=1.0.1 (from paramiko) Downloading PyNaCl-1.1.2-cp27-cp27mu-manylinux1_x86_64.whl (539kB) 100% |████████████████████████████████| 542kB 4.4kB/s Collecting idna>=2.1 (from cryptography>=1.1->paramiko) Downloading idna-2.6-py2.py3-none-any.whl (56kB) 100% |████████████████████████████████| 61kB 4.5kB/s Collecting six>=1.4.1 (from cryptography>=1.1->paramiko) Downloading six-1.10.0-py2.py3-none-any.whl Collecting ipaddress (from cryptography>=1.1->paramiko) Downloading ipaddress-1.0.18-py2-none-any.whl Collecting asn1crypto>=0.21.0 (from cryptography>=1.1->paramiko) Downloading asn1crypto-0.22.0-py2.py3-none-any.whl (97kB) 100% |████████████████████████████████| 102kB 4.2kB/s Collecting enum34 (from cryptography>=1.1->paramiko) Downloading enum34-1.1.6-py2-none-any.whl Collecting cffi>=1.7 (from cryptography>=1.1->paramiko) Downloading cffi-1.10.0-cp27-cp27mu-manylinux1_x86_64.whl (392kB) 100% |████████████████████████████████| 399kB 4.2kB/s Collecting pycparser (from cffi>=1.7->cryptography>=1.1->paramiko) Downloading pycparser-2.18.tar.gz (245kB) 100% |████████████████████████████████| 256kB 6.0kB/s Installing collected packages: idna, six, ipaddress, asn1crypto, enum34, pycparser, cffi, cryptography, bcrypt, pyasn1, pynacl, paramiko Running setup.py install for pycparser ... done Successfully installed asn1crypto-0.22.0 bcrypt-3.1.3 cffi-1.10.0 cryptography-2.0.3 enum34-1.1.6 idna-2.6 ipaddress-1.0.18 paramiko-2.2.1 pyasn1-0.3.2 pycparser-2.18 pynacl-1.1.2 six-1.10.0 You are using pip version 8.1.2, however version 9.0.1 is available. You should consider upgrading via the 'pip install --upgrade pip' command. |