我写的自动ssh的程序
转载本站文章请注明,转载自:扶凯[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(); #返回匹配的个数 |


















