shell中嵌套expect实现ssh登录
我想在某台测试服务器上集中监控一些服务器的磁盘空间。但是又不想配置主机信任关系,怕不安全,公司不允许。因此想通过shell脚本中嵌套expect方式来实现。
一:安装expectexpect是交互性很强的脚本语言,可以帮助运维人员实现批量管理成千上百台服务器操作,是一款很实用的批量部署工具! expect依赖于tcl,而linux系统里一般不自带安装tcl,所以需要手动安装。 下载:expect-5.43.0.tar和tcl8.4.11-src.tar 下载地址:https://pan.baidu.com/s/1kVyeLt9 提取密码:af9p 将expect和tcl的软件包下载放到/usr/local/src目录下 (1)解压tcl,进入tcl解压目录,然后进入unix目录进行编译安装 [root@xw4 src]# tar -zvxftcl8.4.11-src.tar.gz [root@xw4 src]# cd tcl8.4.11/unix [root@xw4 unix]# ./configure [root@xw4 unix]# make && make (2)安装expect [root@xw4 src]# tar -zvxfexpect-5.43.0.tar.gz [root@xw4 src]# cd expect-5.43.0 [root@xw4 expect-5.43.0]# ./configure--with-tclinclude=/usr/local/src/tcl8.4.11/generic--with-tclconfig=/usr/local/lib/ [root@xw4 expect-5.43.0]# make &&make install (3)安装完成后进行测试 [root@xw4 ~]# expect expect1.1> expect1.1> 二:修改/etc/hosts文件比如我想在10.192.203.102机器上ssh访问10.0.9.121 我需要在10.192.203.102上修改/etc/hosts文件,添加要访问地址的IP及主机名对应关系: 10.0.9.121 ocp 否则后面ssh会报错: reverse mapping checking getaddrinfo forbogon [10.0.9.121] failed - POSSIBLE BREAK-IN ATTEMPT! 三 嵌套expect的shell脚本cat c.sh IpGroup=('10.0.9.121' '10.0.9.122') for ip in ${IpGroup[@]} do /usr/local/bin/expect <<-EOF set timeout 3 spawn ssh oracle@$ip expect { "*yes/no" { send "yesr"; exp_continue } "*password:" { send "oracler" } } expect "*#" send "df -hr" expect "*#" send "exitr" interact expect eof EOF done 脚本内容介绍: /* set timeout n命令将expect命令的等待超时时间设置为n秒,在n秒内还没有获取到其期待的命令,expect 为false,脚本会继续向下执行; spawn command命令会fork一个子进程去执行command命令,然后在此子进程中执行后面的命令; send命令的一般用法为 send"string",它们会我们平常输入命令一样向命令行输入一条信息,当然不要忘了在string后面添加上 r 表示输入回车; send "oracler"表示输入用户的密码 interact:执行到此命令时,脚本fork的子进程会将操作权交给用户,允许用户与当前shell进行交互; */ #给脚本赋予执行权限 chmod +x c.sh #调用脚本 sh c.sh --本篇文章参考了:http://www.cnblogs.com/kevingrace/p/5900303.html http://www.cnblogs.com/zhenbianshu/p/5867440.html http://bbs.chinaunix.net/thread-2320506-1-1.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |