我写的自动ssh的程序

四 6th, 2009

转载本站文章请注明,转载自:扶凯[http://www.php-oa.com]

本文链接: http://www.php-oa.com/2009/04/06/autossh.html

因为要管理大量的机器,所以大多的公司,都有一台中转主机,然后在要管理的机器上面设置只有这台中转主机才能连接.但中转主机,每次进入别的主机时,还要在一次输入密码.所以写了一个autossh的程序.来自动登陆做这些事情.

另外,要是你管理少量的主机的话,没有中转主机,但进入你管理的那些机器,也要在登陆时输入多次密码,非常麻烦.在linux下没有象SecureCRT 一样可以记在登陆时记住密码的方便软件.所以次次更换主机登陆都得多次输入.所以也可以使用这个autossh.另外,这个软件不做中转登陆程序时,还有个功能,就是可以中转登陆二次,你在linux上,可以设置先登陆到中转主机,然后在登陆进入目标主机.

使用前,要先写一个你要管理的机器列表,相信所有的系统管理人员都有自己的机器列表.为了清楚显示,建议写上#

机器列表(pwd.txt)

1
2
3
4
5
6
7
8
9
10
# vim pwd.txt
 
#目的主机   用户名   密码      备注
61.135.1.3    root   kisfsdf      web主机
211.147.2.3    root   kisfsdf     www.linux.com
www.php-oa.com  root   33442      我的网站
 
#目的主机 目的主机用户名 目的主机密码 中转主机 中转主机用户 中转主机密码 备注
61.135.33.2 root      qq   172.16.189.133 root  secret   流量管理
61.135.94.3 root      qq   172.16.189.131 root  secret   服务监控

使用方法

1
2
3
#autossh -s 主机名 #-s参数会查找你的列表中所有主机和备注,只要找到就会自动连接上,是使用的最多的参数
#autossh -s web主机 -c uptime #-c参数会在远程主机上运行-c后面的命令
#autossh -l            #显示所有的主机列表

下面是如图

 下载地址 :http://www.php-oa.com/wp-content/uploads/autossh

5.23日加入新功能

-h 参数 指定一个主机列表,如上
-f 参数,指定一个shell命令列表

这样可以一次操作大量的主机,在命令列表中放到你要排量在远程主机上运行的命令,一个个排列好,一次会读一行,运行下去.

例如: comfile中有如下内容

uptime
cat /etc/redhat-release
 

使用的命令

1
#./autossh -h hostlist -f comfile

会在hostlist中所有主机上运行comfile中写好的命令,显示如下

[root@TEST ~]# uptime
 17:33:27 up 4 days,  2:55,  1 user,  load average: 22.36, 23.20, 24.11

[root@TEST ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.2 (Tikanga)

很多人安全问题

 1.给你的中转主机放到内网

 2.提心明文密码保存的问题,这个其实很容易解决设置setuid就行.

1
2
3
# chown root:root autoperl pwd.txt
# chmod 400 pwd.txt
# chmod 4755 autoperl

这样的话,普通用户就没法读密码文件了.只有root用户才行,管理好你的root用户就行了

进入远程主机后,vi之类的程序的窗口大小不正常,现己修正

 

这个文件大量的使用了Expect的模块.下面来个Expect模块的简介

1
2
3
4
5
6
7
8
9
10
$exp = new Expect;  #new一个Expect.
$exp->spawn($command,@params);  #fork和exec一个新进程用来执行$command命令.
$exp->expect($timeout,$content); #'-re'.在$timeout内,期待出现包含$content的内容,默认是精确匹配,也可以使用正则表达式,expect($timeout,re=>'').
$exp->send($string);  #向终端发送字符
$exp->debug(0|1|2);  #打印debug 信息,不同的数字表示不同的bug级别
$exp->interact();   #和用户进行交互,把控制权转交给用户
$exp->soft_close();  #软关闭,直到$timeout时间到达,才关掉该进程
$exp->hard_close();  #硬关闭,立刻关闭该进程
$exp->match();   #返回匹配的结果
$exp->match_number(); #返回匹配的个数
Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪 ViVi 365Key 网摘 天极网摘 和讯网摘 博拉网 POCO 网摘 饭否 QQ 书签 Digbuzz 我挖网 Mister Wong
标签:
目前还没有任何评论.