今天用 expect 写了一个自动 telnet 登陆服务器的小脚本,以前还不知道 expect 这么好用,嗯 unix tools 真是强大。
写这个脚本的起因是我们使用的计算软件的特殊需求:计算分两部分,一部分是自己小组写的计算代码,另一部分是商业软件。商业软件的计算部分耗时非常大,我们一般都是租用超级计算机来计算。而我们自己的代码则对保密性要求非常高,所以这部分代码一般都在本地运行,而同时要求本地的计算结果要实时的传送到远程的超级计算机以便进行下一步计算。
在以前我们用的都是国外的超级计算机,一般都开放了 ssh 服务,所以我们只要设定了 ssh key , 就可以很方便的自动登陆机器提交任务和传输文件了。但是现在我们租用的计算机—-曙光5000A,即去年在全球排名第十的 MagicCube,却不支持 ssh 登陆,只能用 telnet 登陆。而且它必须先登陆一个防火墙,然后再登陆主节点,但是在你第一次登陆后一定时间内不需要登陆防火墙即可登陆主节点。所以在自动登陆机器时还要做一个判断,用 expect 很容易就可以实现。
脚本代码:
#!/usr/bin/expect set timeout 60 spawn /usr/bin/telnet xxx.xxx.xxx.xxx expect { "User:" { send "username\r" expect "password:" send "xxxxxx\r" expect "login" send "username\r" expect "Password:" send "xxxxxx\r" } "login" { send "username\r" expect "Password:" send "xxxxxx\r" } } send "bsub job.lsf\n" # 登陆后自动提交任务 interact { timeout 30 { send " "} # 防发呆 }
当登陆时出现 User: 提示符时则说明这时需要登陆防火墙,当出现 login 时刚说明不需要登陆防火墙。
而传输文件时刚只能使用 ftp 不能用 scp , 所以就用 lftp 写了一个自动传文件的脚本。
#!/bin/bash lftp username:password@xxx.xxx.xxx.xxx << ! cd mym/ lcd /home/wyc/ get a # 下载文件 put b # 上传文件 !
这样基本就可以代替 ssh 和 scp , 缺点是脚本里的密码都是明文的,看到脚本的人都可以知道账号和密码。
Leave a Reply