一个ssh登录多个服务器的脚本

看到老刘每登录一个服务器,都得在~/bin目录下搞一个命令,很是不方便。分享一下我之前从网上收藏的一个交互式登录脚本,略有改进。它有如下特性:

– 支持自定义协议版本、端口、用户名
– 如果版本是2,则用ssh2进行登录
– 支持登录newsmth的bbs

详细如下:

#! /bin/bash

declare -A HOSTS

# 格式 HOST:USER:协议版本:PORT
HOSTS[mydev-110]=”:10.0.1.110″
HOSTS[mydev-39]=”:10.0.1.39″
HOSTS[DevNet-220]=”user_01:10.6.207.220:2:36000″
HOSTS[DevNet-220strongzhou]=”strongzhou:10.6.207.220:2:36000″
HOSTS[DevNet-32]=”user_02:10.6.222.32:2:36000″
HOSTS[smzz]=”:smzz.org:”
HOSTS[newsmth]=’newsmth’

PS3=”host to connect> ”

#select i in “${!HOSTS[@]}”
#do
# ssh $USER@${HOSTS[$i]}
# break;
#done

select i in “${!HOSTS[@]}”
do
LINE=${HOSTS[$i]}
HOST=`echo “$LINE”|awk -F: ‘{print $2}’`
USER=`echo “$LINE”|awk -F: ‘{print $1}’`
VERSION=`echo “$LINE”|awk -F: ‘{print $3}’`
PORT=`echo “$LINE”|awk -F: ‘{print $4}’`

CMD=”ssh”
if [ “$VERSION” = “2” ] ; then
CMD=”ssh2″
fi

if [ “$PORT” != “” ] ; then
CMD=”${CMD} -p $PORT”
fi

if [ “$USER” != “” ]; then
CMD=”${CMD} $USER@”
else
CMD=”$CMD ”
fi

CMD=”${CMD}$HOST”
if [ “$i” = “newsmth” ] ; then
CMD=’luit -encoding gbk ssh -1 xxx@newsmth.net’
fi

echo $CMD
$CMD
break;
done

可以放在你的bin目录下,比如命名为s,效果如下:

$ s
1) DevNet-220		 4) DevNet-32		  7) mydev-39
2) smzz			 5) newsmth
3) mydev-110		 6) DevNet-220strongzhou
host to connect> 

pptp的vpn客户端拨通后可以ping通无法打开网页

在Linux配置好pptp的vpn客户端后,可以成功连上

$ sudo pptpsetup –create comsenz –server $VPN_IP –username $VPN_USER –password “$VPN_PASSWD” –encrypt –start
Password:
Using interface ppp0
Connect: ppp0 <--> /dev/pts/3
CHAP authentication succeeded
MPPE 128-bit stateless compression enabled
Cannot determine ethernet address for proxy ARP
local IP address 10.0.0.70
remote IP address 10.0.0.252

手动添加路由

route add -net 10.0.1.0/24 gw $VPN_GW

发现可以ping通目标主机,却无法正常访问其web、ssh服务,google了一下发现可能是MTU值设置不当导致的。pptp客户端可以在 /etc/ppp/options 里进行设置,于是将初试的MTU由1496反复调整至396后才正常。

$ ifconfig ppp0 | grep mtu
ppp0: flags=4305 mtu 396


vpn客户端控制脚本

$ cat /etc/rc.d/rc.dzvpn
#!/bin/sh
#
# /etc/rc.d/rc.dzvpn
#
# Start/stop/restart Comsenz VPN(PPTP)
#

VPN_IP=YOUR IP
VPN_USER=YOUR USER
VPN_PASSWD=YOUR PASSWD
VPN_GW=YOUR GW # todo

dzvpn_start() {
pptpsetup –create comsenz –server $VPN_IP –username $VPN_USER –password “$VPN_PASSWD” –encrypt –start
route add -net 10.0.1.0/24 gw $VPN_GW
}

dzvpn_stop() {
killall pppd
}

dzvpn_restart() {
dzvpn_stop
sleep 1
dzvpn_start
}

case “$1” in
‘start’)
dzvpn_start
;;
‘stop’)
dzvpn_stop
;;
‘restart’)
dzvpn_restart
;;
*)
echo “usage $0 start|stop|restart”
esac

参考
Linux 通过 pptp 连接 VPN 网络
搭建ppp之类的服务器,千万不能忽略mtu值的设定
单网卡 Ubuntu 服务器打造 PPTP Server

tcp_window_scaling导致的windows服务器回应迟缓问题

工作遇到了一个奇怪的现象:windows下访问某个IIS服务器没有问题,有的Linux也可以正常访问,但有的Linux访问时,服务器回应十分迟缓。

后来在bbs里有人让我参考kernel相关的一篇文章,原来自从内核2.6.17版本后TCP window scaling的变动导致无法访问某些路由器。

我进行如下设置,解决了问题:
echo 0 > /proc/sys/net/ipv4/tcp_window_scaling

文件反转命令tac和字符串反转命令rev

1. tac
将文件的最后一行当作第一行输出,以此类推,比如:

bash-3.1$ cat /etc/passwd | tac | tail -n 3
daemon:x:2:2:daemon:/sbin:/bin/false
bin:x:1:1:bin:/bin:/bin/false
root:x:0:0::/root:/bin/bash

2. rev
用法:rev [file …]
描述:反转文件每行里的字符串顺序,如果没有指定文件,则从标准输出读取

bash-3.1$ echo 123456789 | rev
987654321

通过ssh证书让putty自动登录

再复杂的密码也没有证书安全,再简单的密码也没有证书方便。有些人因为Putty无法保存密码,进而抛弃了这个免费、小巧的远程登录工具。条条大陆通罗马,其实可以ssh证书的方式让putty安全、方便的实现自动登录。

step0. 所需软件
putty.exe, puttygen.exe(官方)
step1. 生成密钥
运行puttygen.exe,按照默认即可:选择SSH-2 RSA1024位的key、空白的Key passphrase,然后点击Generate,在空白区域不断随机挪动光标,直到它产生key。将它生成的那一行Public key粘贴到文件里,比如叫id_rsa2.pub;然后点击”Save private key“,将对应的密钥保存下来,如id_rsa2.prv。
注意:不要直接使用点Save public key按钮后保存的文件,它的格式在后面没法用.
step2. 配置远程帐户
登录远程帐户,将Public key即id_rsa2.pub里的内容添加到相应的文件里:
mkdir ~/.ssh
cat > ~/.ssh/authorized_keys

(此时粘贴内容,然后在新行里按Ctrl + D结束)
同时应该确保~/.ssh目录的权限是700。
step3. 配置Putty
进行基本设置之后,在Connection / Data分类的Auto-login username里填写你远程的用户名;然后在下面的SSH / Auth分类的Private key file for authentication里选择刚才保存的密钥文件id_rsa2.prv。
然后保存设置,登录即可。
注意事项:
– 生成的文件,尤其是私有文件id_rsa2.prv, 应严加防范妥善保存
– 通过ssh-keygen命令生成的key没法在putty里直接使用,需要经过puttygen.exe转换
– ssh-keygen的使用方法请参考《基于SSH密钥对的自动登录

参考资料:

使用Slax Linux制作可引导的U盘

step1. 准备工作
 - 下载Slax,.iso或者.tar格式均可,当前是v6.0.7,约190M
 - 视主板BIOS具体选项,将U盘制作成相应格式(USB-HDD/USB-FDD/USB-ZIP)的可引导盘
    如果找不到U盘附带的转换软件,可使用USBoot v1.70(下载页面)。我使用的是USB-HDD。
 - U盘1个,我使用的是很普通的64M的

step2. 格式化U盘
   这里建议格式化成linux下的文件系统,因为后面我使用默认的FAT32文件系统制作好,发现中途因为找不到某些文件而失败。
    # mkfs.ext2 /dev/sdb1

step3. 拷贝文件
    下载后直接将其中的boot和slax目录拷贝至U盘里
    # cp boot slax /mnt/sdb1 -r
    这里假设U盘被mount到了/mnt/sdb1目录

step4. 安装lilo至U盘的主引导扇区(MBR)
    # cd /mnt/sdb1
    # boot/liloinst.sh
     根据提示操作即可。

至此,重启,更改启动顺序,即可享受通过U盘启动的Linux - Slax!:)

中间碰到了一些问题,在这里罗列一二:
* 确保U盘可写
* 刻录U盘?
别指望着想刻录光盘那样,把iso文件里的数据“刻录”到U盘上。虽然也可以全部写进去,但毕竟U盘和光盘是两种不同的设备,终究要以失败而告终的。
* 鉴于我64M的U盘容量太小,我只保留了slax/base下的第一个,也是最核心的文件:001-core.lzm

此外,slax/tools存放一些使用的脚本,可以操作神秘的.lzm文件

体验virtualbox的无缝模式

由于公司选择腾讯的RTX作为官方通讯工具,使用Linux后没少和虚拟机打交道。见识了MachineMa同学演示的VirtualBox无缝模式,根据网上的教程,比葫芦画瓢体验了一把,感觉不错,终于找到了个VirtualBox代替Vmware的理由了。

步骤:
step1. 下载并安装VirtualBox
VirtualBox是从去年的1.5.0版本开始支持无缝模式的,根据使用Vmware的经验,建议选择最新的版本

step2. 选择相应的guest additions程序
类似vmware里的工具包,不过这个是个单独的iso文件,需要单独下载。

step3. 安装guest additoins
开启虚拟机的情况下,通过菜单里的"device" / "mount CD/DVD" / "CD/DVD image",选择已下载完成的Vboxguestadditions.iso,然后在虚拟机的光驱里双击安装。

安装完成之后在虚拟机的菜单上选择"machine" / "seamless mode",进入传说中的无缝模式。相应的快捷键为Host + L(默认的Host键为右Ctrl)。

Enjoy it!

btw, 有意思的是,运行无缝模式的virtualbox时,通过选择激活的虚拟机程序截图,看到的是一张普通透明的图片(图1图2)。

参考:
Ubuntu中virtualbox解决无缝模式不能开启的问题

Pure-FTPd配置笔记

以前曾用过Pure-FTPd提供的ftp服务,作为ftp的服务器端,其类似linux下useradd/usermod/passwd工具的用户管理方式,令人印象深刻。最近正好需要配置一台ftp服务器,当然首选这款有良好安全性口碑的Pure-FTPd。

基本需求是这样的:
虚拟用户 – 也就是说提供的ftp用户在系统里并不存在
权限 – 每个用户对自己目录拥有读写权限,但不允许访问其他目录
虚拟目录 – 每个用户目录下面需要添加一个只读的公有目录

以下为配置过程:
1. 安装
当前最新版本为1.0.21,可从官方网站下载。
wget http://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.21.tar.gz
tar zxvf pure-ftpd-1.0.21.tar.gz
cd pure-ftpd-1.0.21
./configure --prefix=/usr/local/stow/pure-ftpd-1.0.21 --with-puredb
make
sudo make install

其中,--with-puredb 选项代表虚拟用户支持

2. 创建用户
出于安全以及管理方便,我们让虚拟用户共享同一个系统用户。
首先,在系统中添加相应的用户和组,这里以ftpuser和ftpgroup为例:
/usr/sbin/groupadd ftpgroup
/usr/sbin/useradd -g ftpgroup -d /dev/null -s /etc ftpuser

创建虚拟用户的命令是这样的:
pure-pw useradd smzz -u ftpuser -d /home/ftpusers/smzz -m
其中, -u将虚拟用户 smzz 同系统用户 ftpuser 关联在一起。-d参数使 smzz 只能访问其 home 目录。而如果想让他访问整个文件系统,可以用 -D 选项。

此外,pure-pw useradd 的选项还有:

-t 下载带宽限制
-T 上传带宽限制
-n 最大文件数目
-N 磁盘配额(单位M)
-q 上传速度限制
-Q 下载速度限制
-r 允许某些ip/网段的客户端访问
-R 拒绝某些ip/网段的客户端访问
-i 允许本地某些ip/网段访问(allow local host)
-I 拒绝本地某些ip/网段访问(deny local host)
-y 同时最大连接数目
-z 允许连接服务器的时间段,格式hhmm-hhmm,如 -z 0412-1618代表用户只能在凌晨4点12分至下午4点18分连接服务器
-f passwd_file
-F puredb_file
-m

2. 更改用户
pure-pw adduser 唯一不同的是,使用 pure-pw usermod 不是创建一个用户,而是更改已经存在用户的某些属性。
如果想禁用某些属性,可直接添加空值,比如pure-pw usermod -n ''代表不限制文件数目

3. 更改密码
pure-pw passwd smzz -m
所有这些参数都有一个共同选项 -m ,它代表修改完毕之后不必重启Pure-FTPd以及重新生成puredb_file文件

此外,还有类似userdel命令的子选项pure-pw userdel

4. 提交更改
所有用户操作必须提交更改,方能生效。目前有两种形式
a) 通过pure-pw mkdb重新生成数据文件(/etc/pureftpd.pdb)
b) 用户操作时带上-m选项,比如 pure-pw passwd smzz -m

5. 开启服务
/usr/local/sbin/pure-ftpd -j -lpuredb:/etc/pureftpd.pdb &
其中,-j代表用户第一次登录将会创建自己的home目录,-l代表验证方式
此外,匿名、配额、发呆设置、日志文件等选项均可通过相关参数在pure-ftpd启动时设置

6. 虚拟目录
Pure-FTPd并不支持类似windows下ftp服务器那样的虚拟目录,但可以通过其他方式变相实现,比如
mount --bind /home/my_apps/lib /home/ftpusers/smzz/lib

todo:
pure-ftpd的诸多参数

参考:
man pure-ftpd
man pure-pw
pure-ftpd用户管理

根据搜索结果下载驱动之家某型号笔记本驱动程序

以Sony VGN-CR31这款为例,本脚本(实为命令集,笔者注)通过分析搜索页面、下载页面,最后将结果存放于相应文件(drivers_*.txt)中,同时并下载相应文件。详细见源文件:

#!/bin/bash

mkdir drivers
cd drivers/
echo > /tmp/zgq.txt
echo -n > drivers_url.txt
echo > drivers_id.txt
echo > drivers_title.txt

for i in $(seq 1 4); do
        curl http://drivers.mydrivers.com/drivers-1102-875-Sony/VGN-CR31/0-0-0-0/$i >> /tmp/zgq.txt
done

iconv -f gbk -t utf8 /tmp/zgq.txt > /tmp/zgq_1.txt

cat /tmp/zgq_1.txt | grep '<a href="/drivers/' | awk -F'</a>' '{print $1}' | grep desc > /tmp/zgq.txt

cat /tmp/zgq.txt | awk -F\/ '{print $3}' > drivers_id.txt
cat /tmp/zgq.txt | awk -F'>' '{print $3}' > drivers_title.txt


for i in `cat drivers_id.txt`; do
        curl http://drivers.mydrivers.com/download/$i > /tmp/zgq.txt 2>/dev/null
        cat /tmp/zgq.txt | grep dizhi | awk -F\" '{print $6}' | awk -F= '{print $3}' | head -n 1 >> drivers_url.txt
done

wget -i drivers_url.txt -N

注:本文章仅供学习研究之用,切勿用作非法用途,否则后果自负。
吃水不忘打井人,还是建议多点点人家的广告,如果有时间的话。:)