今天在工作中遇到一個(gè)問(wèn)題,需要在crontab中加入一個(gè)任務(wù),以便能夠定時(shí)從過(guò)程拷貝一些文件,并同時(shí)通過(guò)svn提交。這個(gè)看似簡(jiǎn)單的問(wèn)題讓我折騰了一陣子,記下來(lái)也許有人能用上。
這里的主要問(wèn)題在于:crontab不允許任何交互操作,ssh的passphrase和svn的user/password都不能夠輸入。
原來(lái)ssh用的是ssh-agent的方案,每次登錄的時(shí)候敲一遍passphrase就可以了,但在crontab中使用不允許這樣的交互。查了一下,無(wú)交互的方案要使用ssh -i identity的方式,其中identity是指定private key的路徑。但是如果private key存在著(zhù)非空的passphrase的話(huà),還是需要交互的操作。為了方便起見(jiàn),我重新生成了一對公私鑰,私鑰使用了空的passphrase,并把公鑰加入到要登錄機器的.ssh/authorized_keys中。這樣在crontab使用的腳本中,所有用到ssh或者scp的地方,都加上-i identity選項,就沒(méi)有問(wèn)題了。
遇到的另一個(gè)問(wèn)題是這樣:我們的svn是采用ssh認證的方式,也需要為一個(gè)指定的private key輸入passphrase,但在crontab中也不允許這樣的交互。svn中指定ssh參數的方法是增加一個(gè)環(huán)境變量,export SVN_SSH=”ssh -i identity”,這樣如果使用一個(gè)無(wú)passphrase的private key的話(huà),問(wèn)題也就解決了。但是環(huán)境所限,登錄這個(gè)svn必須使用一個(gè)有passphrase的private key。怎么辦?最終的方案是采用了expect腳本。expect是一個(gè)自動(dòng)化交互操作的工具。它的工作方式大概是:
- spawn一個(gè)目標程序
- expect一段預定義的提示信息
- send一段響應的信息
可以利用expect腳本來(lái)自動(dòng)化svn操作輸入passphrase的過(guò)程。腳本如下:
#!/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
}
上面都是現學(xué)現用的,錯漏難免,但是目前是解決了我的問(wèn)題。

