2017-12-27 23 views
0

VPSからSynology NAS Serverにフォルダを転送するスクリプトを作成しました。スクリプトは、1または2%の転送で何の徴候も示さずに失敗します。手動でコマンドを実行すると問題なく正常に動作し、フォルダを完全に転送します。私はこれを引き起こしているのか分かりませんし、どこを見なければならないかについていくつか指針を得ることができれば感謝します。SFTP手動コマンドは成功しましたが、スクリプトが1または2で失敗しています

SCRIPT:

#!/usr/bin/expect 
set dir [timestamp -format "%Y-%m-%d"] 
spawn sftp [email protected] 
expect "Password:" 
send "passw0rd\n" 
expect "sftp>" 
send "cd /directory/\n" 
expect "sftp>" 
send "put -r /home/backup/$dir\n" 
expect "sftp>" 
send "bye\n" 

結果:

[email protected] [/scripts]# ./sftp.sh 
spawn sftp [email protected] 
[email protected]'s password: 
Connected to host.synology.me 
sftp> cd /directory/for/backup 
sftp> put -r /home/backup/2017-12-26 
Uploading /home/backup/2017-12-26/ to /backup/2017-12-26 
Entering /home/backup/2017-12-26/ 
Entering /home/backup/2017-12-26/accounts 
/home/backup/2017-12-26/file1.tar.gz  2% 26MB 1.8MB/s 08:41 [email protected] [/scripts]# 
[email protected] [/scripts]# 

MANUAL COMMAND:

[email protected] [/scripts]# sftp [email protected] 
[email protected]'s password: 
Connected to host.synology.me. 
sftp> cd directory 
sftp> put -r /home/backup/2017-12-26 
Uploading /home/backup/2017-12-26/ to /backups/2017-12-26 
Entering /home/backup/2017-12-26/ 
Entering /home/backup/2017-12-26/accounts 
/home/backup/2017-12-26/file.tar.gz    100% 959MB 820.2KB/s 19:57 
/home/backup/2017-12-26/file2.tar.gz   100% 147MB 1.4MB/s 01:45 
sftp> bye 
[email protected] [/Scripts]# 

答えて

2

私は推測する、あなたのケースでは、タイムアウトは、ファイル転送するので、Expectに関して発生しましたデフォルトのタイムアウト(10秒)よりも時間がかかります。 timeoutを-1に設定するか、より高い値に増やすことができます。その値は秒単位です。

set timeout -1; # Infinite amount of waiting time 

または

set timeout 300; # 5 minutes of waiting time 

あなたはあなたのコードで上記の文を保つことができます。

send "put -r /home/backup/$dir\n" 
expect { 
    timeout {puts "timeout happened"} 
    "sftp>" 
} 
send "bye\r" 
expect eof 

必ずキーの代わり\n 'を入力し' 送信する\r文字を使用します。最後の文expect eofは、sftpプログラムの正常終了を待ちます。

+0

なぜいつも\ r? '\ n'は動かないかもしれませんか? –

+0

ありがとうございます。タイムアウトを設定すると問題が解決しました。 – Ali

+0

@EmilyE。 : '\ n'は動作しますが、' \ n'は内部的に '\ r'に変換されます。 – Dinesh

関連する問題