脚本中中无交互地使用ssh/scp/svn--expect

来源:百度文库 编辑:神马文学网 时间:2024/07/03 07:33:22

crontab中无交互地使用ssh/scp/svn

2009年1月24日
评论 发表评论

今天在工作中遇到一个问题,需要在crontab中加入一个任务,以便能够定时从过程拷贝一些文件,并同时通过svn提交。这个看似简单的问题让我折腾了一阵子,记下来也许有人能用上。

这里的主要问题在于:crontab不允许任何交互操作,ssh的passphrase和svn的user/password都不能够输入。

原来ssh用的是ssh-agent的方案,每次登录的时候敲一遍passphrase就可以了,但在crontab中使用不允许这样的交互。查了一下,无交互的方案要使用ssh -i identity的方式,其中identity是指定private key的路径。但是如果private key存在着非空的passphrase的话,还是需要交互的操作。为了方便起见,我重新生成了一对公私钥,私钥使用了空的passphrase,并把公钥加入到要登录机器的.ssh/authorized_keys中。这样在crontab使用的脚本中,所有用到ssh或者scp的地方,都加上-i identity选项,就没有问题了。

遇到的另一个问题是这样:我们的svn是采用ssh认证的方式,也需要为一个指定的private key输入passphrase,但在crontab中也不允许这样的交互。svn中指定ssh参数的方法是增加一个环境变量,export SVN_SSH=”ssh -i identity”,这样如果使用一个无passphrase的private key的话,问题也就解决了。但是环境所限,登录这个svn必须使用一个有passphrase的private key。怎么办?最终的方案是采用了expect脚本。expect是一个自动化交互操作的工具。它的工作方式大概是:

  • spawn一个目标程序
  • expect一段预定义的提示信息
  • send一段响应的信息

可以利用expect脚本来自动化svn操作输入passphrase的过程。脚本如下:

#!/usr/bin/expect -f
spawn /usr/bin/svn ci xxxx -m “xxxx” # svn operation you want
expect {
“^Enter” { send “your pass here\n”; expect eof} # Enter xxxx is the prompt for inputing passphrase
eof { exit; } # in case svn is not been spawn successfully
}

上面都是现学现用的,错漏难免,但是目前是解决了我的问题。