2013-01-17 105 views
2

這裏是我的腳本:與下載前SFTP和MGET整理shell腳本完成

#!/usr/bin/expect 
spawn /usr/bin/sftp [email protected] 
expect "password:" 
send "mysecret\n" 
expect "sftp>" 
send "mget dir/*.csv\n"; 
expect "sftp>" 
send "quit\n" 

開始下載,但幾秒鐘後,它發出的退出命令,並退出該程序的下載完成之前。

我成功停止的唯一方法是拋出一個「交互」命令,但因爲我想將其作爲cron作業運行,所以我不想只產生最終坐着的進程。

有沒有辦法做到這一點?

編輯:

有人會問,爲什麼我沒有一鍵安裝...這是由供應商允許我的唯一方法。

回答

2

添加行設置超時-1似乎已經解決了這個問題

整個腳本應該是這樣:

#!/usr/bin/expect 
set timeout -1 
spawn /usr/bin/sftp [email protected] 
expect "password:" 
send "mysecret\n" 
expect "sftp>" 
send "mget dir/*.csv\n"; 
expect "sftp>" 
send "quit\n" 
0

好吧,如果你可以使用Perl:

use Net::SFTP::Foreign; 

my $sftp = Net::SFTP::Foreign->new('[email protected]', password => 'mysecret'); 
$sftp->mget("dir/*.csv", '.', 
      on_error => sub { 
       warn "unable to copy '$_[1]{filename}':".$sftp->error."\n"; 
      }); 

您將不得不安裝Net::SFTP::ForeignIO::Pty(也可在幾個Linux發行版中作爲軟件包提供)。