官网在这里,英语好的直接去看官网文档吧,我是英语渣只能翻译个大概;另外注意本文翻译时间,可能你看到的时候官网已经更新了。


flask-socketio赋予了flask程序支持服务端和客户端间双向低延迟通讯的能力,客户端可以使用 SocketIO 库或任何支持与服务端建立长链接的兼容库。

安装

可以直接使用pip安装:

1
pip install flask-socketio

依赖

自从1.0版开始,这个扩展完全兼容了python2.7和python3.3+版本。异步服务的支持基于下面3个选择中的一个:

  • eventlet 是3个选项中性能最高的,同时支持长轮循(long-polling)和WebSocket。
  • gevent 是在以前版本中使用的框架,支持长轮循,如果想支持WebSocket的话需要同时安装gevent-websocket 库。使用gevent和gevent-websocket结合性能也不错,但略低于eventlet。
  • flask 基于Werkzeug的开发服务也能用,不过性能上不如上面2个选项,所以它应该只用于开发时使用。这个选项只支持长轮循。
    本扩展将自动检测哪些异步框架被安装,默认首选eventlet,其次是gevent,最后是flask自带的开发服务。
    对于客户端来说,可以使用官方的Socket.Io来建立于服务端的链接,也有使用swift和c++写成的客户端。非官方的客户端也能工作,只要它实现了Socket.IO 协议。

目前的局限

目前flask-socketio只能同时运行在单个进程中(这里应该指的是一个进程中仅能存在一个实例的意思,而非只能开启一个进程吧…),解决这个限制的工作正在进行中。
(关于升级变化、以及从老版本迁移到新版的注意事项我就不翻译了,因为没用过老版本)

阅读全文

centos7安装Metasploit框架

发布在 Centos

Metasploit应该不用多说了吧?Kali自带、Win和Mac都提供了现成的安装包,不过我莫名的对apt系不感冒,这里记录一下在centos7上安装metasploit框架的步骤,理论上yum系的都应该通用。
首先执行

1
2
3
curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > msfinstall
chmod 755 msfinstall
./msfinstall

然后安装postgresql:

1
2
yum install postgresql
yum install postgresql-server

安装完成后先别启动服务,这里有个 关键的步骤 就是修改验证方式,编辑/var/lib/pgsql/data/pg_hba.conf文件,添加一行

1
2
host    "msf_database"	"msf_user"      127.0.0.1/32          md5
host all all 127.0.0.1/32 ident

保存后初始化数据库并启动服务,这里我直接就是root权限:

1
2
3
4
5
6
7
8
9
10
postgresql-setup initdb
systemctl start postgresql.service
su postgres
createuser msf_user -P
Enter password for new role: yourmsfpassword
Enter it again: yourmsfpassword
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
createdb --owner=msf_user msf_database

然后切换回root用户,执行msfconsole:

1
2
3
4
5
6
7
8
9
10
msf> db_status
[*] postgresql selected, no connection
msf> db_connect msf_user:yourmsfpassword@127.0.0.1:5432/msf_database
NOTICE: CREATE TABLE will create implicit sequence "hosts_id_seq" for serial column "hosts.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "hosts_pkey" for table "hosts"
[..]
NOTICE: CREATE TABLE will create implicit sequence "mod_refs_id_seq" for serial column "mod_refs.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "mod_refs_pkey" for table "mod_refs"
msf > db_status
[*] postgresql connected to msf_database

然后就可以愉快的玩耍了。这里还有个地方需要注意的就是如果用上面的办法安装后执行了msfupdate,更新完成后再执行msfconsole会提示找不到命令,不知为什么/usr/bin目录下的链接被删除了,上面的安装方法将程序安装到了/opt/metasploit-framework/,所有的命令都在/opt/metasploit-framework/bin目录,可以自己重建链接。

另外,如果觉得每次进入msfconsole都要重新链接一次数据库麻烦的话,可以使用alias命令:

1
alias msfconsole='msfconsole -d db_connect -y /opt/framework/config/database.yml'

自己修改对应路径即可。

或者把database.yml放到~/.msf4目录中。

评论和分享

python脚本模拟tail命令

发布在 Python

今天有个需求,需要实时监控nginx日志中某些ip的访问情况。如果ip较少的话,直接使用tail、grep以及管道配合即可。不过需要监控100个左右的ip并进行相应处理的话,除了自己写脚本还真没想到别的办法。

首先引出Python中自带的2个函数:

  1. file.seek(off, whence=0) 从文件中移动off个操作标记(文件指针),正往结束方向移动,负往开始方向移动。如果设定了whence参数,就以whence设定的起始位为准,0代表从头开始,1代表当前位置,2代表文件最末尾位置。
  2. file.tell() 返回文件指针的当前位置。

那么思路就比较清晰了,写一个死循环,循环内记录指针位置并赋值给seek函数:

1
2
3
4
5
6
7
8
9
10
with open("test.txt") as f:
f.seek(0,2) #把指针置尾
while 1:
cp = f.tell() #获取当前位置
#print cp
line = f.readline()
if line:
print line
else:
f.seek(cp)#将指针移动到本次循环的位置

一个简单的模拟tail命令的脚本就完成了,然后在github上发现这么一个程序,原理上都一样,不过作者对其进行了更好的封装:https://github.com/kasun/python-tail

另外在python2.7中while 1的效率比while True的高。

评论和分享

fedora21无缝升级到23

发布在 Linux

今天看到消息说在12月1号后,fedora将停止对21及以前版本的yum源中软件的更新、新增,作为一个“尝鲜爱好者”当然必须使用最新版的软件了,于是决定对fedora进行升级,目前版本是21,直接升级到23。注意,本文只适用于21,22进行升级,而20及以前的版本命令是fedup而非dnf。

首先执行:

1
2
sudo dnf update
sudo dnf system-upgrade download --releasever 23

经过漫长的等待后:

1
sudo dnf system-upgrade reboot

重启后会自动进入升级页面,等待即可。

更新完成,所有的配置、软件都还在,直接使用就好了。不过在23版本中,dnf命令替代了yum命令,基本的安装啊、更新啊、删除啊就是把yum换成了dnf,这里就不多说了。感觉比较有用的新命令就是:

  1. dnf repolist 显示本机中的软件源
  2. dnf repolist all 显示所有软件源
  3. dnf list 显示所有可用的和已经安装的软件包
  4. dnf list installed 显示已经安装的软件包
  5. dnf list available 显示所有可用的软件包
  6. dnf update 升级系统,感觉这个命令充满了apt的味道…
  7. dnf autoremove 删除那些没用的包
  8. dnf clean all 删除无用的缓存文件

不过也移除了一些Yum命令,比如–skip-broken、 deplist,而且目前没有替代方案。

评论和分享

django性能分析

发布在 Django

一般情况我们使用django-debug-toolbar就能够看到每个步骤的耗时等信息,不过如果需要调试某个接口就不那么直观了,这种情况下我们可以使用下面的中间件来解决问题:

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# Orignal version taken from http://www.djangosnippets.org/snippets/186/
# Original author: udfalkso
# Modified by: Shwagroo Team and Gun.io
import sys
import os
import re
import hotshot, hotshot.stats
import tempfile
import StringIO
from django.conf import settings
words_re = re.compile( r'\s+' )
group_prefix_re = [
re.compile( "^.*/django/[^/]+" ),
re.compile( "^(.*)/[^/]+$" ), # extract module path
re.compile( ".*" ), # catch strange entries
]
class ProfileMiddleware(object):
"""
Displays hotshot profiling for any view.
http://yoursite.com/yourview/?prof
Add the "prof" key to query string by appending ?prof (or &prof=)
and you'll see the profiling results in your browser.
It's set up to only be available in django's debug mode, is available for superuser otherwise,
but you really shouldn't add this middleware to any production configuration.
WARNING: It uses hotshot profiler which is not thread safe.
"""
def process_request(self, request):
if (settings.DEBUG or request.user.is_superuser) and 'prof' in request.GET:
self.tmpfile = tempfile.mktemp()
self.prof = hotshot.Profile(self.tmpfile)
def process_view(self, request, callback, callback_args, callback_kwargs):
if (settings.DEBUG or request.user.is_superuser) and 'prof' in request.GET:
return self.prof.runcall(callback, request, *callback_args, **callback_kwargs)
def get_group(self, file):
for g in group_prefix_re:
name = g.findall( file )
if name:
return name[0]
def get_summary(self, results_dict, sum):
list = [ (item[1], item[0]) for item in results_dict.items() ]
list.sort( reverse = True )
list = list[:40]
res = " tottime\n"
for item in list:
res += "%4.1f%% %7.3f %s\n" % ( 100*item[0]/sum if sum else 0, item[0], item[1] )
return res
def summary_for_files(self, stats_str):
stats_str = stats_str.split("\n")[5:]
mystats = {}
mygroups = {}
sum = 0
for s in stats_str:
fields = words_re.split(s);
if len(fields) == 7:
time = float(fields[2])
sum += time
file = fields[6].split(":")[0]
if not file in mystats:
mystats[file] = 0
mystats[file] += time
group = self.get_group(file)
if not group in mygroups:
mygroups[ group ] = 0
mygroups[ group ] += time
return "<pre>" + \
" ---- By file ----\n\n" + self.get_summary(mystats,sum) + "\n" + \
" ---- By group ---\n\n" + self.get_summary(mygroups,sum) + \
"</pre>"
def process_response(self, request, response):
if (settings.DEBUG or request.user.is_superuser) and 'prof' in request.GET:
self.prof.close()
out = StringIO.StringIO()
old_stdout = sys.stdout
sys.stdout = out
stats = hotshot.stats.load(self.tmpfile)
stats.sort_stats('time', 'calls')
stats.print_stats()
sys.stdout = old_stdout
stats_str = out.getvalue()
if response and response.content and stats_str:
response.content = "<pre>" + stats_str + "</pre>"
response.content = "\n".join(response.content.split("\n")[:40])
response.content += self.summary_for_files(stats_str)
os.unlink(self.tmpfile)
return response

把这个文件保存为middleware.py,然后在settings.py中的MIDDLEWARE_CLASSES添加刚才写好的中间件
'yourproject.yourapp.middleware.ProfileMiddleware',
添加完成后,在原本要访问的url后添加’?prof’就可以看到性能分析结果了:

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
<pre>         202188 function calls (182154 primitive calls) in 2.948 seconds
Ordered by: internal time, call count
ncalls tottime percall cumtime percall filename:lineno(function)
302 2.444 0.008 2.454 0.008 /home/xsy/.virtualenvs/calc/lib/python2.7/site-packages/MySQLdb/cursors.py:277(_do_query)
2 0.086 0.043 0.104 0.052 /home/xsy/.virtualenvs/calc/lib/python2.7/site-packages/MySQLdb/connections.py:62(__init__)
2 0.017 0.009 0.017 0.009 /home/xsy/.virtualenvs/calc/lib/python2.7/site-packages/MySQLdb/connections.py:287(set_character_set)
2 0.016 0.008 0.016 0.008 /home/xsy/.virtualenvs/calc/lib/python2.7/site-packages/django/db/backends/mysql/base.py:299(_set_autocommit)
302 0.008 0.000 2.488 0.008 /home/xsy/.virtualenvs/calc/lib/python2.7/site-packages/django/db/backends/utils.py:76(execute)
19410 0.008 0.000 0.008 0.000 /usr/lib64/python2.7/copy.py:267(_keep_alive)
10237 0.008 0.000 0.008 0.000 /usr/lib64/python2.7/json/encoder.py:33(encode_basestring)
600 0.008 0.000 0.012 0.000 /home/xsy/.virtualenvs/calc/lib/python2.7/site-packages/django/db/models/sql/query.py:246(clone)
6 0.007 0.001 0.007 0.001 /usr/lib64/python2.7/urlparse.py:336(unquote)
500 0.007 0.000 2.712 0.005 /home/xsy/.virtualenvs/calc/lib/python2.7/site-packages/django/db/models/query.py:229(iterator)
1152 0.005 0.000 0.029 0.000 /usr/lib64/python2.7/copy.py:253(_deepcopy_dict)
1 0.005 0.005 0.014 0.014 /usr/lib64/python2.7/json/encoder.py:212(iterencode)
302 0.005 0.000 0.010 0.000 /home/xsy/.virtualenvs/calc/lib/python2.7/site-packages/MySQLdb/cursors.py:117(_do_get_result)
300 0.005 0.000 0.121 0.000 /home/xsy/.virtualenvs/calc/lib/python2.7/site-packages/django/db/models/sql/compiler.py:351(as_sql)
300 0.004 0.000 0.033 0.000 /home/xsy/.virtualenvs/calc/lib/python2.7/site-packages/django/db/models/sql/query.py:1114(build_filter)
302 0.004 0.000 0.004 0.000 /home/xsy/.virtualenvs/calc/lib/python2.7/site-packages/MySQLdb/cursors.py:313(_get_result)
1 0.003 0.003 0.017 0.017 /usr/lib64/python2.7/json/encoder.py:186(encode)
1300 0.003 0.000 0.004 0.000 /home/xsy/.virtualenvs/calc/lib/python2.7/site-packages/django/db/backends/mysql/operations.py:176(get_db_converters)
600 0.003 0.000 0.006 0.000 /home/xsy/.virtualenvs/calc/lib/python2.7/site-packages/django/db/models/sql/query.py:1334(names_to_path)
300 0.003 0.000 0.004 0.000 /home/xsy/.virtualenvs/calc/lib/python2.7/site-packages/django/db/models/sql/query.py:110(__init__)
302 0.003 0.000 0.003 0.000 /home/xsy/.virtualenvs/calc/lib/python2.7/site-packages/MySQLdb/cursors.py:82(_warning_check)
200 0.003 0.000 0.004 0.000 /home/xsy/.virtualenvs/calc/lib/python2.7/site-packages/django/db/models/base.py:388(__init__)
302 0.003 0.000 2.469 0.008 /home/xsy/.virtualenvs/calc/lib/python2.7/site-packages/MySQLdb/cursors.py:139(execute)
300 0.003 0.000 0.022 0.000 /home/xsy/.virtualenvs/calc/lib/python2.7/site-packages/django/db/models/sql/compiler.py:155(get_select)
300 0.003 0.000 0.007 0.000 /home/xsy/.virtualenvs/calc/lib/python2.7/site-packages/django/db/models/sql/compiler.py:472(get_default_columns)
908 0.003 0.000 0.003 0.000 /home/xsy/.virtualenvs/calc/lib64/python2.7/encodings/utf_8.py:15(decode)
3500 0.003 0.000 0.005 0.000 /home/xsy/.virtualenvs/calc/lib/python2.7/site-packages/django/db/models/sql/compiler.py:325(quote_name_unless_alias)
<pre> ---- By file ----

简单解释下主要的信息,ncalls是函数调用的次数,percall指调用一次所需时间,cumtime是运行时占用的总时间。比如percall时间很短而cumtime时间很长,则代表循环次数过多了,试着从算法角度进行优化;如果从输出中看到大量时间消耗和“sql”有关的,则试着从数据库相关代码优化;如果看见大量时间消耗和”template”有关,则尝试从模板渲染处着手优化。

评论和分享

MacOS读写ntfs格式硬盘

发布在 Mac

系统OS X 10.11,之前就有发现ntfs格式的移动硬盘在mac上只能读不能写,通俗点说就是不能保存文件。

总体而言解决方法不外乎4种:

  1. 硬盘在Mac上格式化成ExFAT这种通用格式
  2. 安装第三方插件,比如Paragon NTFS for MAC(收费)
  3. 安装osxfuse+ntfs-3g(命令行)
  4. 修改配置文件打开原生支持方法

首先硬盘里有东西就把第一种方式排除了,缺钱也不想用破解版的第二种也排除,虽说mac也是类unix系统不过看网上改的文件内容也不是特别明白原理排除,所以使用第三种方式吧。

首先安装这2个东西:

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
40
41
42
43
44
45
46
47
48
49
[x@bogon ~ ]$ brew install Caskroom/cask/osxfuse
==> Installing brew-cask from caskroom/homebrew-cask
==> Cloning https://github.com/caskroom/homebrew-cask.git
Cloning into '/Library/Caches/Homebrew/brew-cask--git'...
remote: Counting objects: 3193, done.
remote: Compressing objects: 100% (3117/3117), done.
remote: Total 3193 (delta 84), reused 712 (delta 59), pack-reused 0
Receiving objects: 100% (3193/3193), 5.81 MiB | 18.00 KiB/s, done.
Resolving deltas: 100% (84/84), done.
Checking connectivity... done.
Note: checking out 'c216698c730540185ba88f14722fe8b74174eb0d'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b new_branch_name
==> Checking out tag v0.57.0
? /usr/local/Cellar/brew-cask/0.57.0: 2921 files, 12M, built in 4.9 minutes
==> brew cask install Caskroom/cask/osxfuse
==> We need to make Caskroom for the first time at /opt/homebrew-cask/Caskroom
==> We'll set permissions properly so we won't need sudo in the future
Password:
==> Caveats
You must reboot for the installation of osxfuse to take effect.
==> Downloading http://downloads.sourceforge.net/project/osxfuse/osxfuse-2.8.1/osxfuse-2.8.1.dmg
######################################################################## 100.0%
==> Running installer for osxfuse; your password may be necessary.
==> Package installers may write to any location; options such as --appdir are ignored.
==> installer: Package name is FUSE for OS X (OSXFUSE)
==> installer: Installing at base path /
==> installer: The install was successful.
? osxfuse staged at '/opt/homebrew-cask/Caskroom/osxfuse/2.8.1' (6 files, 8.5M)
[x@bogon ~ ]$ brew install homebrew/fuse/ntfs-3g
==> Tapping homebrew/fuse
Cloning into '/usr/local/Library/Taps/homebrew/homebrew-fuse'...
remote: Counting objects: 31, done.
remote: Compressing objects: 100% (31/31), done.
remote: Total 31 (delta 0), reused 23 (delta 0), pack-reused 0
Unpacking objects: 100% (31/31), done.
Checking connectivity... done.
Tapped 26 formulae (80 files, 324K)
==> Installing ntfs-3g from homebrew/homebrew-fuse
==> Downloading https://tuxera.com/opensource/ntfs-3g_ntfsprogs-2015.3.14.tgz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/ntfs-3g/2015.3.14 --exec-prefix=/usr/local/Cellar/ntfs-3g/2015.3.14 --m
==> make
==> make install
? /usr/local/Cellar/ntfs-3g/2015.3.14: 87 files, 2.0M, built in 78 seconds

安装完成后使用cmd+r重启进入恢复模式,这里就不截图了,在恢复模式下打开终端输入
csrutil disable

然后正常重启,再打开终端

1
2
sudo mv /sbin/mount_ntfs /sbin/mount_ntfs.bak
sudo ln -s /usr/local/sbin/mount_ntfs /sbin/mount_ntfs

有点unix基础的应该都明白,不详细说了。修改完成后再进入恢复模式,打开终端输入
csrutil enable
再正常重启即可。

修改后将移动硬盘连接在finder中是不显示图标的了,不过默认就挂载在/Volumes目录下,或者打开磁盘工具,右键点击选择“在finder中打开”也可以。

如果想恢复,依然是按照上面的步骤,把mount_ntfs.bak改回原名即可。

评论和分享

suds库使用小记

发布在 Python

虽说接触过的大部分接口都是以restfullapi的形式返回json数据,但最近有些接口是soap的,如果只是需要一个python的soap客户端的话,suds库是十分不错的一个选择,文档

使用pip安装即可,最基础的使用方法如下,示例来源官网:

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
from suds.client import Client
url = 'http://localhost:7080/webservices/WebServiceTestBean?wsdl'
client = Client(url)
print client
Suds - version: 0.3.3 build: (beta) R397-20081121
Service (WebServiceTestBeanService) tns="http://test.server.enterprise.rhq.org/"
Prefixes (1):
ns0 = "http://test.server.enterprise.rhq.org/"
Ports (1):
(Soap)
Methods:
addPerson(Person person, )
echo(xs:string arg0, )
getList(xs:string str, xs:int length, )
getPercentBodyFat(xs:string name, xs:int height, xs:int weight)
getPersonByName(Name name, )
hello()
testExceptions()
testListArg(xs:string[] list, )
testVoid()
updatePerson(AnotherPerson person, name name, )
Types (23):
Person
Name
Phone
AnotherPerson

其中methods就是实现各个功能的方法,types则定义了数据类型:

1
2
result = client.service.getPercentBodyFat('jeff', 68, 170)
print result

比如string,int等简单类型就不多说了,如果想知道Person类型是什么,则可以使用:

1
2
person = client.factory.create('Person')
print person

来查看具体细节:

1
2
3
4
5
6
7
8
9
10
(Person)=
{
phone = []
age = NONE
name(Name) =
{
last = NONE
first = NONE
}
}

同理phone,name都是一种类型,可以使用ractory.create方法进行创建并赋值:

1
2
3
4
5
6
7
8
9
10
phone = client.factory.create('Phone')
phone.npa = 202
phone.nxx = 555
phone.number = 1212
name = client.factory.create('Name')
name.first = 'Elmer'
name.last = 'Fudd'
person.name = name
person.age = 35
person.phone = [phone]

然后就可以调用相关的方法了:client.service.addPerson(person)

有些接口还需要设置soap:Header属性,使用client.set_options(soapheaders=(userid,password))

这里需要注意的就是如果header中有多个节点的话,要使用一个元组添加而不是调用多次set_options函数.

再比较有用的就是如果想看suds构造出的xml信息的话,使用

1
2
3
import logging
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)

就可以了,如果还想看更详细的信息,比如请求头,状态码等,还可以使用
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
至于更高级的用法,比如安全认证,xml信息修改注入,多server调用等文档描述的也很详细.

其实soap接口的本质就是向某个url以post方式提交一个xml格式的字符串,当然http头信息也需要相应变化,比如:

1
2
3
4
headers = {"Content-Type": "text/xml; charset=utf-8",
"SOAPAction": "http://www.xxxx.com/service/xxxx",
"Host": "www.xxxx.com"
}

可以使用requests以及urllib2等库发送请求,得到结果使用正则或lxml进行处理.

之前我由于某些原因不想使用suds就是这么做的,这种方法有2点需要注意:

  1. 构造xml字符串的编码问题,以及特殊符号转意:’&’转成’&amp;‘,”<”转成”&lt;
  2. 某些函数必须进行顺序调用(比如必须先调用登录函数才能调用查询函数…),注意把上一个调用结果的cookie带入到下一个调用中,建议使用requests库的session进行自动处理

评论和分享

最近使用requests库进行操作时总出现如下警告:

1
InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.

虽然不影响程序执行,不过看着一个警告还是心理不舒服.

解决办法很简单,安装几个包即可pip install pyopenssl ndg-httpsclient pyasn1

安装过程中可能出现某些头文件不存在的错误,比如

1
2
openssl/aes.h: No such file or directory
fatal error: ffi.h: No such file or directory

安装对应的dev包即可,比如ubuntu下就是
sudo apt-get install libffi-dev libssl-dev

评论和分享

上周刚刚从dota2的坑中跳出来,这周就又跳入了mincraft的大坑中。作为买不起官网服务的穷人,自己玩单机也未免过于孤单。虽然网上有很多现成的“私服”,不过又不想受别人限制,那就自己搭建一个呗!

首先安装jdk,fedora执行:
sudo yum install java-1.8.0-openjdk.x86_64
ubuntu则是:
suso apt-get install openjdk-7-jre-headless
安装完成后可以执行java命令看是否成功,然后下载minecraft的服务端:

1
wget https://s3.amazonaws.com/Minecraft.Download/versions/1.8.8/minecraft_server.1.8.8.jar

这步最好新建一个目录,因为运行程序后会在当前目录生成一些文件。

运行:java -Xmx1024M -Xms1024M -d64 -jar minecraft_server.1.8.8.jar nogui
这里官网提示可用内存至少在1G以上,我自己添加了-d参数因为我的系统是64位的。

1
2
3
4
5
6
7
8
root@localhost:/var/local/mine# java -Xmx1024M -Xms1024M -jar minecraft_server.1.8.8.jar nogui
[02:37:30] [Server thread/INFO]: Starting minecraft server version 1.8.8
[02:37:30] [Server thread/INFO]: Loading properties
[02:37:30] [Server thread/WARN]: server.properties does not exist
[02:37:30] [Server thread/INFO]: Generating new properties file
[02:37:30] [Server thread/WARN]: Failed to load eula.txt
[02:37:30] [Server thread/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
[02:37:30] [Server thread/INFO]: Stopping server

第一次运行后会出现这个错误,编辑当前目录下生成的eula.txt,把eula设置为true即可。

修改保存后再次运行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@localhost:/var/local/mine# java -Xmx1024M -Xms1024M -jar minecraft_server.1.8.8.jar nogui
[02:37:49] [Server thread/INFO]: Starting minecraft server version 1.8.8
[02:37:49] [Server thread/INFO]: Loading properties
[02:37:49] [Server thread/INFO]: Default game type: SURVIVAL
[02:37:49] [Server thread/INFO]: Generating keypair
[02:37:49] [Server thread/INFO]: Starting Minecraft server on *:25565
[02:37:49] [Server thread/INFO]: Using epoll channel type
[02:37:49] [Server thread/INFO]: Preparing level "world"
[02:37:50] [Server thread/INFO]: Preparing start region for level 0
[02:37:51] [Server thread/INFO]: Preparing spawn area: 4%
[02:37:52] [Server thread/INFO]: Preparing spawn area: 10%
[02:37:53] [Server thread/INFO]: Preparing spawn area: 18%
[02:37:54] [Server thread/INFO]: Preparing spawn area: 31%
[02:37:55] [Server thread/INFO]: Preparing spawn area: 43%
[02:37:56] [Server thread/INFO]: Preparing spawn area: 57%
[02:37:57] [Server thread/INFO]: Preparing spawn area: 70%
[02:37:58] [Server thread/INFO]: Preparing spawn area: 86%
[02:37:59] [Server thread/INFO]: Preparing spawn area: 99%
[02:37:59] [Server thread/INFO]: Done (9.702s)! For help, type "help" or "?"

这里服务就成功启动了,但注意,这里服务端是正版的,如果使用的是盗版客户端,比如HMCL,选择多人游戏并添加服务器地址后是无法链接的,需要修改配置文件server.properties,把其中online-mode的值改成false,之后再次启动服务器即可链接。

评论和分享

fedora21使用ipv6访问google

发布在 Linux

有传言ss、goagent作者被喝茶,不知真假,不过github上的项目确实被删除了,照这趋势大中华局域网指日可待啊。

项目删除并不代表不能使用,如果你有好的ss、goagent服务端fq依然是没太大问题的。不过我最近用ss自己搭建的服务端经常出现时不时就断线的情况,不知道是不是GFW又升级了?作为一个google重度用户,这实在是难以忍受,而且某些情况下又不能直接使用vpn,之前有研究过使用ipv6访问google,但那时候各种fq方法都还不会受到严重干扰,也就没深入了解。ipv6访问google并不是神码新鲜玩意,几年之前就说有朝一日ipv6将取代ipv4,不过喊了几年也没什么动静。原理和废话不多说,想使用ipv6访问google,fedora21默认已经启用了ipv6支持,ubuntu还需要设置一下,具体操作自行百度。然后需要安装miredo:
sudo yum install miredo

然后 使用root权限 执行:/usr/local/sbin/miredo

执行后会发现多出一个虚拟网卡:

1
2
3
4
5
6
7
8
teredo    Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00...
inet6 addr: 2001:0:8ac3:9ddd:0:7ffa:ad80:3464/32 Scope:...
inet6 addr: fe80::5445:5245:444f/64 Scope:Link
UP POINTOPOINT RUNNING NOARP MTU:1280 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:468 (468.0 b) TX bytes:560 (560.0 b)

如果向修改网卡名则编辑/etc/miredo/miredo.conf即可,当然懒的话就用默认的。

然后可以用命令测试是否生效:

1
2
3
4
5
6
7
8
ping6 ipv6.google.com
PING ipv6.google.com(google.com) 56 data bytes
64 bytes from google.com: icmp_seq=1 ttl=59 time=753 ms
64 bytes from google.com: icmp_seq=2 ttl=59 time=331 ms
64 bytes from google.com: icmp_seq=3 ttl=59 time=334 ms
64 bytes from google.com: icmp_seq=4 ttl=59 time=354 ms
^C
--- ipv6.google.com ping statistics ---

此时不用代理访问https://ipv6.google.com/即可打开。

如果想访问其他网站呢?这就需要hosts文件了,这里不普及hosts是什么了,给个地址https://code.google.com/p/ipv6-hosts/,这个地址貌似很久没更新了,可以去https://github.com/lennylxx/ipv6-hosts 瞧瞧。

如果想知道某个网站是否支持ipv6,我知道3个办法:

  1. http://ipv6-test.com/validate.php
  2. nslookup -q=aaaa xxxx.com
  3. dig @2001:470:20::2 xxxx.com AAAA

上面的2、3原理是一样的,如果支持的话把得到的地址写入hosts中即可。

评论和分享

作者的图片

Roy

微信公众号:hi-roy


野生程序猿


China