CVS自动登录

来源:互联网 发布:全球即时通讯软件排名 编辑:程序博客网 时间:2024/04/18 17:23
 

你遇到过还有用shell也解决不了的问题么?

我遇到过,所以不得不学习弥补shell的弊端的语言Expect;

的确,交互式既是shell的优点,同时也是它的遗憾。

前两天,因为工作原因需要写一个自动连接cvs的脚本,本以为用bash简简单单的就搞定了,没成想可怜的bash死活就是无法自动登录CVS服务器。

后来想想也应该是,因为shell本身就是一个脚本,按部就班得做出你所下的各种命令,当你cvs login的时候它是做了,但是现在它做出这个命令之后,已经把控制权转交给cvs login程序了,再由cvs login提示输入密码,判定正确与否。其实你写的shell只不过之行了一半就跳到别的程序上去执行了。那有没有能够实现自动交互的语言呢?答案当然是肯定的。

不知,你是否写过ftp自动登录的脚本呢?大体是这样的:

#!/bin/bash

USER=anonymous
pass="cuitggyy@163.com</P" />

ftp -i -n <<END
open ftp.caldera.com
user $USER $PASS
cd /pub
ls
close
END

看清楚了么,ftp命令里有一个“-i”的参数,它的作用是启动非交互式ftp,而参数“-n”则是关闭自动登录功能。这样就成了一个作业流的执行方式了,而ftp命令本身能够避免交互方式的出现,可是我们的CVS服务器可没有这么仁慈的方式,为了安全起见,CVS被设计只能手工输入密码的交互式程序,与此相同的还有fsck之类的,因此这就将我们能够写一个省事脚本得方法彻底的打垮。

幸亏我们还有Expect ——这个基于Tcl/Tk的语言,它可以将交互式的程序以非交互式的方式运行,弥补了shell的最大弊端。而且Expect的语法也很简单,写过shell的一看就明白,下面是我写的一个简单的自动登录cvs服务器得小程序,运行前提当然是已经设置好了正确的CVSROOT:

#!/usr/bin/expect -f
# cvslogin.exp -- auto cvs login
####################

set timeout 10

set passwd [lindex $argv 0]

spawn cvs login
expect "*password:"
send  "$passwd\r"

expect eof {exit 0}
       timeout {exit 1}

看明白了么?简单吧^_^'' 这样我们还可以写出类似的自动登录ssh的小东东,呵呵。

这是我发现的Expect的中文教程:http://www.xfocus.net/articles/200104/169.html

当初我学Expect的时候这个教程还没出来了,你可以去Expect的官方站搜刮:http://expect.nist.gov/

其实中文教程也是从官方教程翻译过来的,希望你还是去看官方的,毕竟对E文能有很大提高。

我也是由于工作需要现炒现卖,只不过给有类似问题的兄弟姐妹们提供一种另外解决问题思路,呵呵。