OpenSSH与SSH2的public key转换

最近需要在两台机器之间做public key认证,可是忙了半天发现认证总是失败,于是使用-v和debug模式分别运行ssh和sshd,通过输出发现是server的机器不认client发过来的pubkey。接着又折腾了一番才搞清楚原来这两台机器装的是不同版本的ssh,一个是OpenSSH(Ubuntu),一个是SSH2(SLES)。

对于SSH2,其pubkey的写法是,在~/.ssh2/authorization中写如下一行:

1
Key xxx.xx

其中xxx.xx即为client的pubkey文件名。

另外,这个pubkey需要是SSH2的格式,而OpenSSH的机器ssh-keygen默认生成的是OpenSSH的格式,需要这样转换一下:

1
ssh-keygen -ef id_rsa.pub > for-ssh2.pub

MySQL时间处理函数整理

最近时不时地需要写一些数据查询的sql脚本,其中经常用到各种时间处理函数,每次都打开MySQL手册查阅,甚是麻烦。现将其整理一下。

在数据库里存放时间的方法一般可分为字符串、timestamp、datetime和bigint(unix timestamp 经典的“1970-01-01 0:00 UTC”。而我们用到的时间处理函数无非就是在这些类型中转换,或者提取某一个字段(比如月、日等)。

其实timestamp和datetime可以看成是有特定格式的字符串,两者的使用方法基本一样(时间范围不同)。下面就都用timestamp来举例。

如果要从一个非标准格式的字符串转换成timestamp的话,可以使用str_to_date,比如str_to_date(str, “%d/%m/%Y %H:%i:%s”);反过来,若将timestamp格式化成其他格式,可使用date_format(date, “%d/%m/%Y %H:%i:%s”)。

如果要从timestamp转换成距离UTC 1970年1月1日0点0分的秒数的话,可使用unix_timestamp(date),省略参数表示当前时间;反过来操作的话使用from_unixtime(seconds)

要注意的是,Java中的System.currentTimeMillis()得到的时间含义与此(unix timestamp)相同,但是单位是毫秒。

若要提取时间的某一个字段,则可以使用date_format,在格式中仅写某个值。

下面看一些例子。

假设我们需要将字符串”5/25/2010 13.34.33”转换成Java中System.currentTimeMillis()等效的值。首先,该字符串不是timestamp标准格式,所以需要先使用str_to_date转换一下。然后可使用unix_timestamp转换成秒数,最后变成毫秒数。也就是:

1
unix_timestamp(str_to_date("5/25/2010 13.34.33", "%d/%m/%Y %H.%i.%s")) * 1000

再比如说,数据库里面payment表的time字段记录的是时间毫秒数,而现在需要按月统计支付金额(amount),那么可以这么做:

1
select date_format(from_unixtime(time/1000),"%Y/%m") as mon, sum(amount) from payment group by mon

当然,这只是一种粗略的方法,实际上可能还需要考虑时区的影响。

MySQL中时间相关函数还有很多,这里只是举了一些常用的例子。详细的函数列表和用法可参考官方手册:

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

禁用Linux控制台的自动黑屏

一般来说,可以通过如下命令来禁用(必须从控制台输入):
setterm -powersave off -powerdown 0 -blank 0

如果想从ssh session来设置的话,可执行如下命令:
sudo sh -c ‘setterm -blank 0 -powersave off -powerdown 0 < /dev/console > /dev/console 2>&1’

这一点对于服务器来说比较有用,因为服务器的控制台一般不会去操作的,都是通过远程登录。这样万一出现个kernel panic,屏幕是黑的,啥信息都得不到了。

使用iptables实现透明代理

最近有这么个需求,即从某台机器(A)无法访问到服务器B的p0端口,因此需要从另一台机器C的p1端口中转一下。
当然网上有很多代理的方法,包括代理软件、ssh隧道等,但是应用程序不支持代理,因此必须使用透明代理,即在A的应用中将C设置为服务器,C将所有到达其p1端口的包转发给B的p0端口,然后B的所有回复都由C转发回A。当然,C必须做地址转换,使得A认为自己在与C通信,B也认为自己在与C通信。
这么看来这个需求其实和NAT很类似,唯一不同的是这里的A、B和C的地址都是global地址。
研究了一下,其实可以使用类似NAT的方法来做,即在C上配置2个SNAT和1个DNAT,A和B都不用配置。
其中A发往C的包使用DNAT转换,C发往A和B的包使用SNAT转换。具体配置如下:

-A PREROUTING -s ! b.ip -d c.ip -p tcp -m tcp –dport p1 -j DNAT –to b.ip:p0

-A POSTROUTING -s ! b.ip -d b.ip -p tcp -m tcp –dport p0 -j SNAT –to c.ip

-A POSTROUTING -s b.ip -d !b.ip -p tcp -m tcp –sport p0 -j SNAT –to c.ip

可以发现,如果将C看成是NAT Box,B看成是内网机器,A看成是外网机器的话,以上配置与加了端口转发的NAT的唯一区别就是多了第二条规则。这是因为B的IP是Global的,它访问A的时候路由不经过C,所以A到B仅作DNAT是不够的,还必须用SNAT把源地址换成C的地址。

btw,别忘了启用ip_forward

Ubuntu源 (9.04)

备忘

#Tsinghua
deb ftp://ftp3.tsinghua.edu.cn/mirror/ubuntu/ubuntu/ jaunty main multiverse restricted universe
deb ftp://ftp3.tsinghua.edu.cn/mirror/ubuntu/ubuntu/ jaunty-backports main multiverse restricted universe
deb ftp://ftp3.tsinghua.edu.cn/mirror/ubuntu/ubuntu/ jaunty-proposed main multiverse restricted universe
deb ftp://ftp3.tsinghua.edu.cn/mirror/ubuntu/ubuntu/ jaunty-security main multiverse restricted universe
deb ftp://ftp3.tsinghua.edu.cn/mirror/ubuntu/ubuntu/ jaunty-updates main multiverse restricted universe

taiwan

deb http://debian.nctu.edu.tw/ubuntu jaunty main multiverse restricted universe
deb http://debian.nctu.edu.tw/ubuntu jaunty-backports main multiverse restricted universe
deb http://debian.nctu.edu.tw/ubuntu jaunty-proposed main multiverse restricted universe
deb http://debian.nctu.edu.tw/ubuntu jaunty-security main multiverse restricted universe
deb http://debian.nctu.edu.tw/ubuntu jaunty-updates main multiverse restricted universe
deb-src http://debian.nctu.edu.tw/ubuntu jaunty main multiverse restricted universe
deb-src http://debian.nctu.edu.tw/ubuntu jaunty-backports main multiverse restricted universe
deb-src http://debian.nctu.edu.tw/ubuntu jaunty-proposed main multiverse restricted universe
deb-src http://debian.nctu.edu.tw/ubuntu jaunty-security main multiverse restricted universe

VirtualBox 2.2无法卸载解决方案

google到的,做个记录。(ps 卸载2.2是为了装2.2.2,该版本解决了2.2中client os无法获取IP地址问题)
出处:
http://www.virtualbox.org/ticket/3701

原帖:
For those unable to uninstall VBox 2.2:
To be able to uninstall you would need to copy the HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion?\DIFxApp\Components registry key (and its sub-keys) from the HKEY_CURRENT_USER to the HKEY_LOCAL_MACHINE branch.

Here are the steps for doing this:

    1. run the registry editor (press windows + R , type regedit and press OK)
    2. in the left pane browse to HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion?\DIFxApp\Components -> there should be some sub-keys having GUID names located under the “Components”
    3. export the HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion?\DIFxApp\Components to some file (right-click the “Components” key, select “Export”, type a file name where you want to export the settings (e.g. C:\foo.reg) )
    4. open the exported .reg file (either with notepad or some other text editor or right-click it in explorer and select “Edit”)
    5. substitute the HKEY_CURRENT_USER with HKEY_LOCAL_MACHINE in the file, save and close the ditor.
    6. import the .reg file (either double-click it in the explorer or in the registry editor use menu File->Import-> browse to a file, select it and press “Open”)

Once this is done you should be able to uninstall.