取势 明道 优术

我写的自动ssh的程序 5,133 views

作者为 扶 凯 发表

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

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

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

机器列表(pwd.txt)

# 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   服务监控

使用方法

#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
 

使用的命令

#./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就行.

# chown root:root autoperl pwd.txt
# chmod 400 pwd.txt
# chmod 4755 autoperl

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

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

 

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

$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(); #返回匹配的个数

来了就留个评论吧! 20个评论



    schyman 2009年04月7日 的 09:12

    将密码记在文本中,是不是意味着如果中转主机被黑,会涉及到所有管理主机?
    这个危险系数?

    laneovcc 2009年04月7日 的 15:46

    呵呵这只是一个开始
    后面就要写自动执行的啦~对吧~

    admin 2009年04月7日 的 15:58

    你会给中转主机放到公网吗???

    密码在文本中这个不是问题,可以设置好权限,象passwd这个文件一样就行了,能运行,但不能查看。

    coolzsb 2009年04月9日 的 08:01

    有种东西叫做ssh key

    签名
    ——————
    兄弟,好久没联系了

      admin 2009年04月9日 的 11:48

      有时候,有些机器对外开发。所以还是使用密码方便。用key,那个人离开了,还能控制你的电脑,不方便

    coolzsb 2009年04月10日 的 17:11

    之所以用key,就是key可以设定有效期、有效期没有到,也可以设定某个key已经过期

    签名

    说起说起这些加密的东西,三天三夜也说不完

    admin 2009年04月12日 的 23:08

    学习了,多谢多谢

    supersun 2009年04月29日 的 15:15

    好象公钥认证和ssh代理满足的你的需求.

    huifeideluotuo 2009年05月7日 的 17:46

    很多时候远程服务器的端口不是默认的22,还有一个是不允许root用户直接登陆的,,还的改善下,,我也研究下。

    huifeideluotuo 2009年05月10日 的 18:53

    在匹配 yes/no 的那行代码有点问题,不能匹配,你可以打开debug模式查询。

      admin 2009年05月11日 的 20:59

      对这个,我早就知道,主要是有时这个信息出现的时间太久之类就会出问题

    admin 2009年05月23日 的 17:43

    yes/no 我又测试了一下,是有问题,修复了一下,呵呵,不好意思

    laiwei 2009年06月23日 的 19:58

    呵呵,脚本运行需要一大堆包,嗯 可以编译成二进制的发布使用
    此外 密码存成明文确实不安全

    内网,基本上大多数机器的密码都是一致的
    因此可以每次提示用户输入一次密码,后续列表就自动使用该密码登陆

    laiwei 2009年06月23日 的 20:00

    btw:
    可以参考下http://hi.baidu.com/anonymouslogin/blog/item/4dcf6064506453f8f7365432.html

    嗯 楼主的工具还是很不错的~

    sataonline 2009年07月8日 的 14:58

    想看看你的autossh 结果无法下载了。呵。

    admin 2009年07月8日 的 15:21

    可以了.修复连接了.上次升级不小心都删除了

    miger 2009年09月14日 的 16:04

    这个思路不错,想看看你的autossh怎么写的,这里下不到,有空能email么?

    admin 2009年09月15日 的 10:22

    近来我在写改进的版本…很快就会放出来,所以给老的删除了.

    Chao 2014年04月10日 的 07:55

    求个autossh 是怎么写的