用iptables防止暴力破解ftp密码

最近一直有个傻逼黑客暴力破解公司的FTP服务器,虽然我有信心他50年内绝对猜不出密码,但看到日志里一大堆的登录信息还是挺烦的,于是便想用iptables屏蔽它,手工屏蔽肯定是不现实的,人家手上一堆的肉鸡呢,封完一个ip人家换一个ip就行了。解决方法就是写个脚本来分析系统日志,然后识别出属于暴利破解的ip,然后添加到iptables的屏蔽列表中。网上虽然有很多现成的脚本,但都是针对英文系统的,而我公司的系统里面日志是中文的,并不能匹配,只好稍加改变。
show代码:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
grep "pure-ftpd.*[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}.*WARNING" /var/log/messages | awk '{print $5,$6}' | sed "s/^.*pure-ftpd.*(.*@\(.*\)).*$/\1/g" | sort | uniq -c > /tmp/pureftpban.tmp
cat /tmp/pureftpban.tmp | while read line
do
    COUNT1=`echo ${line}|awk '{print $1}'`
    IP1=`echo ${line}|awk '{print $2}'`
    if [ $COUNT1 -gt 10 ] && [ -z "`iptables -vnL INPUT|grep $IP1`" ]
    then
    iptables -I INPUT -s $IP1 -m state --state NEW,RELATED,ESTABLISHED -j DROP
    fi
done

以上代码保存到/root/checksys.sh,并添加可执行权限。
然后用vim编辑/etc/crontab

1
vim /etc/crontab

添加如下内容:

1
*/3 * * * * root /root/checksys.sh

保存并退出。系统就会每隔3分钟检测是否有人在暴力破解ftp密码,如果次数超过10次,就屏蔽之。
世界终于清静了……

手机通过wifi控制电脑上的foobar2000

必须先感叹一句,GO语言太强了,自带的库很丰富,语法够简洁,即使没接触过GO,稍微学习一下就能用几十行代码做出个简单的web服务器。

由于foobar2000可以通过命令行进行操作,比如:

1
foobar2000.exe /command:Next

就是切换到下一曲。利用这个特性,就能很轻易的实现远程操控foobar2000。

下面是GO语言的代码,文件名为foobar2k_web.go:

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
package main
 
import (
    "os/exec"
    "fmt"
    "io"
    "net/http"
    "os"
)
 
var service_port   = ":9527"
var service_path  = "/foobar2k"
var foobar2k_path = "d:\\bin\\foobar2000\\foobar2000.exe"
var fbcmd_map     = map[string]string{"prev":"Previous","next":"Next","vdown":"Down","vup":"Up","playpause":"Play or pause"}
 
func FB2KServer(w http.ResponseWriter, req  *http.Request) {
    io.WriteString(w, "<html>")
    io.WriteString(w, "<head>")
    io.WriteString(w, "<title>foobar2000远程控制</title>")
	io.WriteString(w, "<style type=\"text/css\">div.bt {width:100px;height:100px;float:left;text-align:center;line-height:100px;background-color:green;}div.bt a{font-size:72px;color:white;font-weight:bold;text-decoration:none;}</style>")
    io.WriteString(w, "</head>")
    io.WriteString(w, "<body>")
	io.WriteString(w, "<div style=\"width:500px;height:100px;margin:100px auto;\">")
    io.WriteString(w, "<div class=\"bt\"><a target=\"_self\" href=\""+service_path+"?fbcmd=prev\">《</a></div>")
    io.WriteString(w, "<div class=\"bt\"><a target=\"_self\" href=\""+service_path+"?fbcmd=next\">》</a></div>")
    io.WriteString(w, "<div class=\"bt\"><a target=\"_self\" href=\""+service_path+"?fbcmd=playpause\">||</a></div>")
    io.WriteString(w, "<div class=\"bt\"><a target=\"_self\" href=\""+service_path+"?fbcmd=vdown\">◣</a></div>")
    io.WriteString(w, "<div class=\"bt\"><a target=\"_self\" href=\""+service_path+"?fbcmd=vup\">◢</a></div>")
    io.WriteString(w, "</div>")
    io.WriteString(w, "</body>")
    io.WriteString(w, "</html>")
    var fbcmd = req.FormValue("fbcmd")
    cmd := exec.Command(foobar2k_path,"/command:"+fbcmd_map[fbcmd])
    cmd.Start()
}
 
func main() {
    http.HandleFunc(service_path,FB2KServer)
    fmt.Printf("started!");
    err := http.ListenAndServe(service_port ,nil)
    if err != nil {
        fmt.Printf("ERR:=%s\n",err)
        os.Exit(-1)
    }
}

其中service_port定义的是端口号,service_path定义的是服务的路径,foobar2k_path定义的是foobar2000在电脑上的绝对路径,fbcmd_map定义的是foobar2000支持的操作命令,这里只定义了下一曲、上一曲、播放/暂停等常用命令。

用go编译后生成foobar2k_web.exe,双击运行后会弹出个控制台窗口,显示”started!”。



然后用手机连接wifi,访问 http://电脑端的ip:端口号/路径 ,比如我的电脑端的ip地址是192.168.1.3,定义的端口号是9527,定义的路径是/foobar2k,那么就可以访问 http://192.168.1.3:9527/foobar2k ,不出意外的话在手机上就能看到如下界面:



点击手机上的按钮,foobar2000就会做出相应动作,假如foobar2000还没有启动的话,则会自动启动。

目前的程序功能还很简陋,要好用点还得再完善一下,比如定义的端口号、foobar2000路径都放到配置文件里,操作界面美化等。

vim的Google翻译插件

由于经常需要在vim里看一些英文帮助文档,又没有长年累月的运行一个翻译软件的习惯,所以还是写了个插件来搞定,用了python,所以windows下得确保安装了python。

使用方法有几种:

1.将光标移动到需要翻译的英文单词上,按<leader>e2c(把中文翻译成英文就是<leader>c2e,下面就不多说了)。

2.选中需要翻译的英文,按<leader>e2c。

3.输入

1
:E2C 想要翻译的英文

优点:因为是调用Google进行翻译,所以Google能翻译多少种语言,插件就能翻译多少种语言,不过默认只map了英译中和中译英的快捷键,其他的得自己定义了。

缺点:连不了网就死翘翘了。

快捷键定义方法举例:

1
nmap <silent> <leader>e2c :echo Google_Translate('en','zh-CN',expand('<cword>'))<CR>

en是原文的语言,zh-CN是要翻译的语言。

下载地址:http://code.google.com/p/jiazhoulvke/downloads/detail?name=googletranslate.vim

代码:

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
" googletranslate.vim: 利用Google翻译在vim中进行翻译
" Author:       jiazhoulvke
" Blog:         http://jiazhoulvke.com
" Date:         2012-4-10
" Version:      1.0
"-------------------------------------------------
" Google_Translate: 谷歌翻译{{{1
function! Google_Translate(lan1,lan2,word)
python << EOM
#coding=utf-8
import vim,urllib,urllib2
word = vim.eval("a:word")
word=word.replace('\n','')
rword = urllib.urlencode({'text':word})
lan1 = vim.eval("a:lan1")
lan2 = vim.eval("a:lan2")
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.15 Safari/536.5'
}
url = 'http://translate.google.com/translate_a/t?client=firefox-a&langpair='+lan1+'%7c'+lan2+'&ie=UTF-8&oe=UTF-8&'+rword
req = urllib2.Request(
    url = url,
    headers = headers
)
resultstr=''
gtresult = urllib2.urlopen(req)
if gtresult.getcode()==200:
    gtresultstr=gtresult.read()
    po=eval(gtresultstr)
    resultstr=''
    for poi in po['sentences']:
        resultstr+=poi['trans']
    if po.has_key('dict'):
        if len(po['dict'])>0:
            if po['dict'][0].has_key('terms'):
                tr=','.join(po['dict'][0]['terms'])
                resultstr+='\n'+word+':'+tr
vim.command('let resultstr = "%s"' % resultstr)
EOM
return resultstr
endfunction
 
"-------------------------------------------------
" Google_Translate_Selected_String: 翻译选中文本{{{1
function! Google_Translate_Selected_String(lan1,lan2)
    normal `<
    normal v
    normal `>
    silent normal "ty
    return Google_Translate(a:lan1,a:lan2,@t)
endfunction
 
"-------------------------------------------------
" Key_and_command_bind: 按键及命令绑定{{{1
if !hasmapto('<leader>e2c','n')
    nmap <silent> <leader>e2c :echo Google_Translate('en','zh-CN',expand('<cword>'))<CR>
endif
if !hasmapto('<leader>c2e','n')
    nmap <silent> <leader>c2e :echo Google_Translate('zh-CN','en',expand('<cword>'))<CR>
endif
if !hasmapto('<leader>e2c','v')
    vmap <silent> <leader>e2c <ESC>:echo Google_Translate_Selected_String('en','zh-CN')<CR>
endif
if !hasmapto('<leader>c2e','v')
    vmap <silent> <leader>c2e <ESC>:echo Google_Translate_Selected_String('zh-CN','en')<CR>
endif
if !exists(":E2C")
    command! -nargs=+ E2C :echo Google_Translate("en","zh-CN",<q-args>)
endif
if !exists(":C2E")
    command! -nargs=+ C2E :echo Google_Translate("zh-CN","en",<q-args>)
endif
"-------------------------------------------------
" Modelines: {{{1
" vim: ts=4 nowrap fdm=marker foldcolumn=1 ft=vim

关于vim显示的问题

一、过长的行显示不全

当一行字过长时,vim总是无法正常显示,会显示很多“@”符号,很久以前我以为是vim的一个bug,后来问了高手才知道是设置问题,在配置文件里面加上一句

1
set display=lastline

问题就解决了。

二、代码高亮不正常

当一个文件里的代码很长时,往往会出现这种问题:当你移动光标查看代码时,本来高亮显示的代码全部变成白色,严重影响阅读。滚动一下光标到上一页,又突然正常了,又是vim默认设置的问题。这个在帮助文档里有说明,输入

1
:h 06.2

看最后一段:

在自下往上滚屏的过程中颜色显示不对。
Vim 在分析文本的时候不对整个文件进行处理,它只分析你要显示的部分。这
样能省不少时间,但也会因此带来错误。一个简单的修正方法是敲 CTRL-L。
或者往回滚动一下再回来。要彻底解决这个问题,请参见 |:syn-sync|。有些
语法定义文件有办法自己找到前面的内容,这可以参见相应的语法定义文件。
例如,|tex.vim| 中可以查到 Tex 语法定义。

下面这句就能解决:

1
syntax sync fromstart

关于pathogen安装vba包的问题

在之前的一篇文章中我推荐了几款vim比较实用的插件,其中第一款就是pathogen,是的,虽然只有短短两百来行的代码,但就像我给它的评分一样:Life Changing。
为了解决文件混乱的问题vim搞出了vba这种格式,想法很好,但实际应用中效果却不能尽如人意。因为并非所有的插件发布者都会把插件打包成vba格式,很多都只是简单的压缩成zip或者tar.gz之类的压缩包,假如插件只有一个vim文件的话连压缩都不用了……
而使用pathogen的话,则每个插件都会拥有一个自己的文件夹,这样要删除某个插件直接找到这个插件所在的文件夹,然后删掉它就行了。
好吧,前面说了一大堆废话来凑字数,就是为了引出下面的正题。
现在很多插件都只发布vba包,之前我不知道该怎么解压,用了一种很二的方法:先按照正常的方法安装这个vba包,然后在bundle目录里新建一个目录,再把刚才安装的那些文件移进去……我忘了有伟大的”:h”。……
用”:h vba”可以看到相关帮助,其实只需要几步就能安装:
1.先创建相应的文件夹。其中的plugin_name是实际的插件名

1
mkdir ~/.vim/bundle/plugin_name

2.用vim打开需要安装的vba包。

1
vim someplugin.vba

3.在vim中执行下面的代码:

1
:UseVimball ~/.vim/bundle/plugin_name

作为一个蛋疼得必须要治的人,我写了小插件,貌似会更方便一点:

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
"--------------------------------------------------
" pathogen_install_vba.vim
" Author:       jiazhoulvke
" Email:        jiazhoulvke [AT] gmail.com
" Blog:         http://jiazhoulvke.com
" Version:      0.1
"--------------------------------------------------
 
if &cp || exists("g:loaded_pathogen_install_vba")
    finish
endif
let g:loaded_pathogen_install_vba="v0.1"
 
command! PathogenInstallVBA :call Pathogen_Install_VBA()
 
function! Pathogen_Install_VBA()
    let jzlk_extname=expand("%:e")
    if jzlk_extname!="vba"
        echo '这个文件不是vba安装包哦。'
    else
        let vba_dir_name=input("插件文件夹名: ")
        if has("win32")
            let vba_dir_path=$VIM . "\\vimfiles\\bundle\\" . vba_dir_name
            call system("md " . vba_dir_path)
        else
            let vba_dir_path="~/.vim/bundle/" . vba_dir_name
            call system("mkdir ". vba_dir_path)
        endif
        execute 'UseVimball ' . vba_dir_path
    endif
endfunction

安装这个插件,然后以后碰到vba格式的插件,载入后vim里输入:PathogenInstallVBA,会提示输入文件夹名,输入后回车,OK。

新年快乐

好久没写博客了,上一篇还是去年的7月5号。自从我的妹子离开之后就没有心情写东西了,再后来心情恢复后,又因为觉得所学所感都是些较肤浅的小知识小技巧,不好意思发上来,虽然上这个博客的人屈指可数,但总要对得起读者啊。其实仔细想想,如今别人微博上晒午餐晒心情,凭什么我自己的博客还不能写点自己想写的东西?虽是些高手鄙夷的小知识,但说不定对刚入门的朋友也有些许帮助啊,所以,以后会经常晒心得晒体会,争取一个月至少发一篇文章,也算对得起花钱买的域名和空间了(虽然也没花几个钱)。当然也不会为了写博客而写博客,不是我个人觉得有用的东西,就不会发出来。关注点依然是vim和编程,谁叫我是码农呢。
最后祝所有景德镇民新年快乐,翻墙顺利。

Vim插件推荐

1.pathogen(http://www.vim.org/scripts/script.php?script_id=2332)
pathogen是用来管理插件的插件。vim的插件是混在一起的,这在插件少的时候没什么问题,但当插件数量达到两位数时,问题就出来了——当我们下载试用某个插件,发现并不适合自己或者此插件和自己原来的插件有某些冲突时,你会发现很难清理掉刚刚安装的插件,因为有的插件有多达上百个文件,分布在不同的文件夹中。如果此插件是个vba包,那倒没什么问题,它可以像你在系统里安装的软件一样,通过一句命令清除掉,但问题是有些插件就是一个压缩包而已,并没有安装记录。这时pathogen就派上用场了,它会把每个插件放到各自的文件夹中,不需要用的时候直接删掉这个文件夹就行了,实在是很方便。

2.fencview(http://www.vim.org/scripts/script.php?script_id=1708)
这个插件的功能就是识别文件编码,对国人来说很有用。安装后可以在菜单项里找到识别编码的选项,不过用vim到一定程度的人,应该都不会还保留着菜单栏的吧?我的vimrc里加了一句:

1
    nmap <leader>fenc <ESC>:FencAutoDetect<CR>

需要识别的时候通过快捷键就能识别了。还可以设置自动识别编码:

1
    let g:fencview_auto_patterns='*.txt,*.htm{l\=},*.php,*.c,*.py'

3.neocomplcache(http://www.vim.org/scripts/script.php?script_id=2620)
vim的补全插件里我最喜欢的一个。不像其他补全插件实时查找,而是在缓存中查找,用起来感觉很快。我的配置:

1
2
3
4
5
6
7
8
9
10
11
12
    let g:neocomplcache_enable_at_startup=1
    let g:neocomplcache_enable_smart_case=1
    let g:neocomplcache_enable_camel_case_completion=1
    let g:neocomplcache_enable_underbar_completion=1
    let g:neocomplcache_min_syntax_length=3
    let g:neocomplcache_manual_completion_start_length=3
    let g:neocomplcache_enable_ignore_case=1
    let g:neocomplcache_lock_buffer_name_pattern='\*ku\*'
    let g:neocomplcache_max_list=100
    let g:neocomplcache_enable_auto_select = 1
    imap <expr><c-y> neocomplcache#close_popup()
    imap <expr><C-e> neocomplcache#cancel_popup()

4.taglist(http://www.vim.org/scripts/script.php?script_id=273)
类似于一些IDE,会在左边显示一个函数、变量列表(当然通过配置也可以显示在右边),需要跳转到指定的函数时直接在函数名上面按回车即可。此插件需要ctags的支持。
我的配置:

1
    map <silent><F6> <ESC>:TlistToggle<CR>

5.nerdtree(http://www.vim.org/scripts/script.php?script_id=1658)
vim里的文件管理器,以前我用的是winmanager,但这个nerdtree更好用。
我的配置:

1
    nmap <silent><F8> <ESC>:NERDTreeToggle<CR>

6.tabbar(http://www.vim.org/scripts/script.php?script_id=1338)
类似于以前常用的minibufexpl,可以在顶部显示出已打开的buffer的列表,就像现在浏览器上的标签栏一样。tabbar比起minibufexpl更强大的功能是,它可以通过alt+数字直接在各个buffer中切换,还可以通过ctrl+tab轮换。

7.mark(http://www.vim.org/scripts/script.php?script_id=2666,旧版:http://www.vim.org/scripts/script.php?script_id=1238)
此插件的功能很简单,将光标移动到你需要高亮显示的关键字上面,比如test,按下<leader>m,则该文件中的所有test都会高亮显示。也许你会说,vim搜索的时候不是也可以高亮吗?是的,但是它只能高亮一个关键字,而mark可以同时高亮多个关键字,并且每个关键字都有不同的颜色(当你标记的关键字多的时候看起来非常漂亮),这在阅读一些代码时非常好用。

8.project(http://www.vim.org/scripts/script.php?script_id=69)
用来管理项目的插件。手头有一些比较大的项目需要管理时,这个插件就显得非常有用。

9.zencoding(http://www.vim.org/scripts/script.php?script_id=2981)
一个可以快速编写html代码的插件。比如输入 html:xt ,然后按 <C-y>, ,就会生成一大段的html代码,类似于snip,但在某些方面来说比snip更灵活更智能一点,具体不太好说,要用过才能体会。

10.vimpress(http://www.vim.org/scripts/script.php?script_id=3510,旧版:http://www.vim.org/scripts/script.php?script_id=1953)
直接在vim里发表、管理你的wordpress博客

解决了一个很纠结的Vim按键映射问题

vim里默认的复制粘贴系统剪贴板内容的按键非常的蛋疼,”+y(复制)和”+gP(粘贴)这种按键,光看就觉得别扭,于是一些人就把默认的剪贴板设置为系统剪贴板,有些人则是直接导入vim自带的那个windows按键配置文件,我以前也是一直用这个办法,但很快发现了一个弊端:C-V是用来进入列选择模式的,虽然可以用C-Q代替,但如果使用终端下的vim的话,C-Q通常是不起作用的(在vim输入:h ctrl-Q有解释)。于是我尝试着用<leader>vv这样的组合键来代替C-V,但用了一段时间,连我自己都受不了了,最终还是改回了C-V。然后突然想到,终端里不能按C-Q,那就给它映射个别的按键呗,于是:
nmap vv <C-Q>
脑袋总算转过弯了……

vim用的图片热点链接生成工具

上次的vim调色板给我很大的启发,利用这种调用图形程序的方式,完全可以将很多原本不能或者很难实现的功能轻易实现,比如这次我需要做一个图片的热点链接(就是在一张图片上划分出N块区域,每块区域都能使用不同的链接),当然不可能还在vim里手工写坐标,那也太逆天了,所以只好无奈的打开N年没用过Dreamweaver,这让我心有不甘,太不装B了!而且Dreamweaver的启动速度也慢得让人蛋疼。这就是我写这个小程序的原因。

本来是想用gtk开发,无奈目前gtk还刚刚入门呢,所以先用我相对比较拿手的C#来开发(开发工具是vs2008 express),等以后再写个gtk版的。

c#的代码比较分散,就不贴上来了,程序和源文件我都打包传到了我的googlecode上。直接下载链接:http://jiazhoulvke.googlecode.com/files/ImageMap%20for%20vim.7z

下载,解压,复制imagemap.vim到vim的plugin文件夹中,复制imagemap.exe到gvim.exe所在的目录(或者复制到windows系统文件夹下,如c:\windows),确保已经安装了蛋疼的.net framework(程序用的版本是2.0),在一个空行里输入一个图片名称,必须是有效的,然后在插入模式下按Alt+M(要改快捷键可以到imagemap.vim中改最后一行的代码),只要图片路径正确,会弹出一个窗口,直接用鼠标拖选一块区域,然后输入链接的属性,就成功添加了一个热点,添加了所有的热点后直接点关闭按钮,生成的代码就出现在vim里了。

下面是截图:

vim里的调色板

今天无意中看到了一篇文章《colorpicker: 给 Vim 加一个调色板!》,才知道原来vim里也能调用调色板,唉,火星了。

colorpicker需要一段vim代码和一个gtk程序的配合,作者给出了gtk程序的代码,但没有windows下的可执行程序,正好我前不久刚刚搭建了一个windows下的gtk开发环境,于是就派上用场啦。写了一个makefile,一次性编译通过,嘿嘿!

文件下载地址:
googlecode:http://jiazhoulvke.googlecode.com/files/colorpicker_for_vim.7z

压缩包下载下来后,解压,将plugin文件夹里的colorpicker.vim复制到vim里的相应目录中,再把colorpicker文件夹中的colorpicker.exe复制到系统目录中,比如c:\windows。不过我比较喜欢把程序放到vim的安装目录里面,比如c:\program files\vim\vim73,vim一样可以访问到,而且更加绿色环保。

现在一切搞定了,打开vim,按Alt+C,就会弹出一个调色板了,hoho~~

update:回去看了一下依云同学(colorpicker作者)博客的更新,才想起用windows的人基本都没装过gtk运行库的,失策啊,没这玩意是用不了colorpicker,赶紧的,去下载个gtk运行库吧!http://gtk-win.sourceforge.net

无觅相关文章插件,快速提升流量