标签归档:linux

linux使用iptables做端口转发

把本机,ip1.1.1.1,端口9002,转发到 2.2.2.2的8080

echo “1” > /proc/sys/net/ipv4/ip_forward
sysctl -p
iptables -t nat -A PREROUTING -d 1.1.1.1 -p tcp –dport 9002 -j DNAT –to-destination 2.2.2.2:8080
iptables -t nat -A POSTROUTING -d 2.2.2.2 -p tcp –dport 8080 -j SNAT –to-source 1.1.1.1

L2TP 一键安装包的一个小bug

使用l2tp的一键安装包在linode上安装vpn发现一个错误,需要将
wget http://www.openswan.org/download/openswan-2.6.24.tar.gz
tar zxvf openswan-2.6.24.tar.gz
cd openswan-2.6.24
改为
wget –no-check-certificate http://www.openswan.org/download/openswan-2.6.37.tar.gz
tar zxvf openswan-2.6.37.tar.gz
cd openswan-2.6.37

其实也不能算bug,文件不在了而已,,另外可以分段执行看结果,或者看出错信息,找问题。

linux下使用imagemagick批量生成缩略图的python脚本

linux下使用imagemagick批量生成缩略图的python脚本。程序用了递归,可以查找目录下所有的图片按照一定的规则生成指定宽度的缩略图。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#批量resize当前目录下的图片,linux测试过。
#使用imagemagick

import os, sys

iswindows = 'win32' in sys.platform.lower() or 'win64' in sys.platform.lower()
isosx     = 'darwin' in sys.platform.lower()

def convert(dirname, size='400*400'):

    for filename in os.listdir(dirname):

        if "thumbs" in filename or "cache" in filename:
                continue
        filename = os.path.join(dirname, filename)

        if os.path.isdir(filename):
                convert(filename, size)
        elif filename.lower().endswith("jpg"):
                tname=filename.rsplit('/',1)
                thumb_filename= "%s%s%s" % (tname[0],"/thumbs/thumbs_",tname[1])
                cmd = "/usr/local/imagemagick/bin/convert \"%s\" -resize %s \"%s\"" % (filename, size, thumb_filename)
                print "process.", filename
                #print cmd
                os.system(cmd)
if __name__ == "__main__":

    if len(sys.argv) >= 2:
        size = sys.argv[1]
    else:
        size = "400"
	#convert 当前目录下的所有图片
    convert('.', size)

mysql linux 备份脚本

#!/bin/sh
# mysql data backup script
#
# use mysqldump --help,get more detail.
#
BakDir=/root/back/mysql
LogFile=/root/back/mysql/mysqlbak.log
DATE=`date +%Y%m%d%H%M%S`
echo " " >> $LogFile
echo " " >> $LogFile
echo "-------------------------------------------" >> $LogFile 
echo $(date +"%y-%m-%d %H:%M:%S") >> $LogFile 
echo "--------------------------" >> $LogFile 
cd $BakDir
DumpFile=$DATE.sql
GZDumpFile=$DATE.sql.tar.gz
/usr/local/bin/mysqldump -u user -pname  --database -h 127.0.0.1 db> $DumpFile
echo "Dump Done" >> $LogFile
tar czvf $GZDumpFile $DumpFile >> $LogFile 2>&1 
echo "[$GZDumpFile]Backup Success!" >> $LogFile 
rm -f $DumpFile 
#cd $BakDir/daily
cd $BakDir   
echo "Backup Done!"
echo "please Check $BakDir Directory!"
echo "copy it to your local disk or ftp to somewhere !!!"
find $BakDir -ctime +30 -exec rm {} \;
echo "delete file over 30 days"

其中user,name和db请根据自己的情况修改

 

增加一个可以每个数据库分开备份的脚本


mysql -uroot -p -N -e 'show databases' | while read dbname; do mysqldump -uroot --complete-insert "$dbname" > "$dbname".sql; done

vim tips

怎么重做和撤销,redo and undo
u:undo last change,撤销最后一次的修改
U:把当前行到初始状态
CTRL+r:redo the undone changes,重做redo的内容。
更多的可以查看
:help undo
“(TAB上边的点):回到光标跳转前的位置。
dd:删除一行。
5dd:删除光标处以下的五行。
按V键进入可视模式,选择要拷贝的内容,按yy拷贝选中的内容,在需要的地方按p拷贝内容到新光标处或新文件中。
i:进入插入模式。
v:进入可视模式。
Esc:回到基本模式
h,j,k,l:上下左右移动光标
vsp:左右分割窗口。
sp:上下分割窗口。
ctrl+w:在窗口中选择。
:q!:不保存退出。
x:保存退出。
w:只保存不退出。
x:删除一个字符。
u:撤消
CTRL+O:回跳。
CTRL+R:撤消刚才的撤消。
:help:帮助。
zz:退出帮助窗口。
3w :向前移动三个单词。
3b:向后移动三个单词。
CTRL+[:跳到光标单词处。
CTRL+T:跳回。
9k:上移九行。
:e 打开新文件(在多窗口操作中很有用)。
yaw:拷贝一个单词。
CTRL+B:把光标移到当前行的左边首部。
CTRL+E:把光标移到当前行的右边首部。
vim -r doc.txt:恢复文件到修改前。
:/查找单词
H:跳到第一行。
M:跳到中间。
L:跳到最后一行。
CTRL+d,u,f,b:下移半屏,上移半屏,下移一屏,上移一屏。
gg:到文件开始处
G:到文件尾部。
–:找到文件上次修改点。
CTRL+p,n:向上查询一个单词,向下查询一个单词。
zo:打开折叠。l键也可以。
zc:关闭折叠。
zr:全部打开折叠。
zm:全部关闭折叠。
zf:创建折叠。
zR:打开所有折叠(包括嵌套)
zM:关闭所有折叠(包括嵌套)
:!ls,查看目录表。
:`o,找到最后修改的文件。
wq,保存退出。
vim txt1 txt2 txt3 txt4,同时打开多个文件,
以下是同时打开多个文件时(建议用多窗口)
n,下一个文件,
n3,往下第三个文件。
first,第一个文件。
last,最后一个文件 。
:/s#kkk#ccc#g,把文件中的kkk替换为ccc

移动光标
上:k nk:向上移动n行 9999k或gg可以移到第一行 G移到最后一行
下:j nj:向下移动n行
左:h nh:向左移动n列
右:l nl:向右移动n列

w:光标以单词向前移动 nw:光标向前移动n个单词 光标到单词的第一个字母上
b:与w相反
e: 光标以单词向前移动 ne:光标向前移动n个单词 光标到单词的最后一个字母上
ge:与e相反

$:移动光标到行尾 n$:移动到第n行的行尾
0(Num):移动光标到行首
^:移动光标到行首第一个非空字符上去

f:移动光标到当前行的字符a上,nf移动光标到当前行的第n个a字符上
F:相反

%:移动到与制匹配的括号上去(),{},[],<>等。

nG:移动到第n行上 G:到最后一行

CTRL+G 得到当前光标在文件中的位置

向前翻页:CTRL+F
向下移动半屏:CTRL+G
向后翻页:CTRL+B

存盘:
:q! :不存盘退出
:e! :放弃修改文件内容,重新载入该文件编辑
:wq :存盘退出

dw:删除一个单词,需将光标移到单词的第一个字母上,按dw,如果光标在单词任意位置,用daw
dnw:删除n个单词
dne:也可,只是删除到单词尾
dnl:向右删除n个字母
dnh:向左删除n个字母
dnj:向下删除n行
dnk:向上删除n行
d$:删除当前光标到改行的行尾的字母
dd:删除一行
cnw[word]:将n个word改变为word
cc:改变整行
C$:改变到行尾

J: 删除换行符,将光标移到改行,按shift+j删除行尾的换行符,下一行接上来了.
u: 撤销前一次的操作
shif+u(U):撤销对该行的所有操作。

:set showmode :设置显示工作模式

o:在当前行的下面另起一行
O(shift+o):在当前行的上面另起一行

nk或nj:光标向上或向下移n行,n为数字
an!【ESC】:在行后面加n个感叹号(!)
nx:执行n次x(删除)操作

ZZ:保存当前文档并退出VIM

:help :查看帮助文档,在这之中,按CTRL+] 进入超连接,按CTRL+O 返回。
:help subject :看某一主题的帮助,ZZ 退出帮助

:set number / set nonumber :显示/不显示行号
:set ruler /set noruler:显示/不显示标尺

/pattern 正方向搜索一个字符模式
?pattern 反方向搜索一个字符模式
然后按n 继续向下找

把光标放到某个单词上面,然后按×号键,表示查找这个单词
查找整个单词:/\

:set hlsearch 高亮显示查找到的单词
:set nohlsearch 关闭改功能

m[a-z]:在文中做标记,标记号可为a-z的26个字母,用`a可以移动到标记a处

r:替换当前字符
nr字符:替换当前n个字符

查找替换:
way1:
/【word】 :查找某个word
cw【newword】:替换为新word
n: 继续查找
.: 执行替换

way2:
:s/string1/string2/g:在一行中将string1替换为string2,g表示执行 用c表示需要确认
:num1,num2 s/string1/string2/g:在行num1至num2中间将string1替换为string2
:1,$ s/string1/string2/g:在全文中将string1替换为string2

v:进入visual 模式
【ESC】退出
V:shift+v 进入行的visual 模式
CTRL+V:进如块操作模式用o和O改变选择的边的大小。

粘贴:p,这是粘贴用x或d删除的文本
复制:
ynw:复制n个单词
yy:复制一行
ynl:复制n个字符
y$:复制当前光标至行尾处
nyy:拷贝n行
完了用p粘贴

:split:分割一个窗口
:split file.c :为另一个文件file.c分隔窗口
:nsplit file.c: 为另一个文件file.c分隔窗口,并指定其行数
CTRL+W在窗口中切换
:close:关闭当前窗口

在所有行插入相同的内容如include<,操作方法如下: 将光标移到开始插入的位置,按CTRL+V进入VISUAL模式,选择好模块后 按I(shift+i),后插入要插入的文本,按[ESC]完成。 :read file.c 将文件file.c的内容插入到当前光标所在的下面 :0read file.c 将文件file.c的内容插入到当前文件的开始处(第0行) :nread file.c 将文件file.c的内容插入到当前文件的第n行后面 :read !cmd :将外部命令cmd的输出插如到当前光标所在的下面 :n1,n2 write temp.c 将本文件中的n1,到n2行写入temp.c这个文件中去 CTRL+L刷新屏幕 shift + < 左移一行 shift + > 右移一行

u: undo
CTRL+R: re-do
J: 合并一行
CTRL+p 自动完成功能
CTRL+g 查看当前文件全路径

q[a-z] 开始记录但前开始的操作为宏,名称可为【a-z】,然后用q终止录制宏。
用reg显示当前定义的所有的宏,用@[a-z]来在当前光标处执行宏[a-z].

http://blog.csdn.net/AbnerChai/archive/2005/09/03/470824.aspx
vi-vim-cheat-sheet.png

用RCS把httpd.conf版本管理起来

apache或者其他的配置文件经常会修改。每次改了什么有时候会忘掉。或者没有备份。
用RCS 版本控制系统,Revision Control System(很古老的UNIX应用程序)的ci,co来管理,很是方便。简单的就三个命令。
checkout出来httpd.conf
co -l httpd.conf
修改后,看看都修改了什么
rcsdiff httpd.conf
如果确认,并且好用,就checkin
ci -u -wjuhui httpd.conf
目录里会有一个 httpd.conf,v 文件,是文本文件,可以打开看看。

感谢asong。

freebsd linux如何更换默认的shell

linux等的shell很多,一个人不太可能全部都熟悉。我用bash比较多。有个新的环境是csh。没有ctrl+r的功能,不爽。想改成bash。
安装bash的方法不谈。
查看一下当前的shell

[phpbird@host3 ~]$ echo $SHELL
/usr/local/bin/bash

当然,这是修改后的。
修改缺省的shell可以修改 /etc/passwd
这个文件是用:分割的多行文件,找到需要修改的用户。把最后一行的shell路径替换掉就可以。当然如果不让登录,就修改成一个不存在的shell。
如果改错了,就会麻烦点了。

还有一个是用命令来
chsh
很优雅的方法
chsh -s /path/to/shell {user-name}
我这里就是
chsh -s /usr/local/bin/bash juhui
不是root用户,需要输入密码。

apache目录密码保护错误

apache的.htaccess有个可以保护目录的功能。当用户访问这个目录里资源的时候,会弹出对话框,让输入用户名和口令。在设置的时候有一些关必要条件。比如启用.htaccess文件等。
这2天在freebsd里面想这么做一次,但是遇到了问题,一直报错
configuration error: couldn’t check user. No user file?
后来经过调整,还有
configuration error: couldn’t check access. No groups file?

Invalid command ‘AuthUserFile’, perhaps misspelled or defined by a module not included in the server configuration
等错误信息。

后来经过n多个小时。。n>3,最后准备投降的时候,看到httpd.conf里面有一些注释掉名字里面有auth字样的module。一狠心,全去掉注释,好了!
又经过一番测试。
需要启用下面的三个module

LoadModule authn_file_module libexec/apache22/mod_authn_file.so
LoadModule authz_user_module libexec/apache22/mod_authz_user.so
LoadModule auth_basic_module libexec/apache22/mod_auth_basic.so

当然我用的是
AuthType Basic
.htaccess的内容如下

AuthType Basic
AuthName "admin"
AuthUserFile /usr/local/etc/apache22/.htpasswd
Require user admin

find grep perl配合查找替换内容

有时候需要对一个目录或者一批文件进行内容的替换。
可以用find配合sed或者perl来完成
查找当前目录下,把

 </title>

替换成

</title><meta http-equiv="Content-Type" content="text\/html; charset=utf-8" />
find ./ -type f -exec sed -i "s/<\/title>/<\/title><meta http-equiv=\"Content-Type\" content=\"text\/html; charset=utf-8\" \/>/g" {} \;

上边是在linux,好像centos也可以,但是FreeBSD上不行,懒得查语法了。搞了个find+perl的版本
把abc换成def

find ./ -type f | xargs perl -pi -e "s/abc/def/g"

FreeBSD不行,可能是shell不对。切换到bash,没报错了