2017-12-27 6 views
0

Ich schrieb ein Skript, um einen Ordner von VPS zu Synology NAS Server zu übertragen. Das Skript schlägt bei 1 oder 2% Übertragung fehl, ohne Angabe warum. Wenn ich den Befehl manuell ausführe, funktioniert es problemlos und es überträgt den Ordner einwandfrei. Ich bin mir nicht sicher, was das verursacht, und würde mich freuen, wenn ich eine Anleitung bekommen könnte, wo ich hinschauen soll.SFTP Manueller Befehl erfolgreich aber Skript schlägt bei 1 oder 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" 

ERGEBNIS:

[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]# 

manuellen Befehl:

[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]# 

Antwort

2

Ich denke, in Ihrem Fall, Timeout passiert in Bezug auf Expect, da die Dateiübertragung benötigt etwas mehr Zeit als das Standard-Timeout (10 Sekunden). Sie können entweder die timeout auf -1 setzen oder Sie können sie auf einen höheren Wert erhöhen und sie sind in Einheiten von Sekunden.

set timeout -1; # Infinite amount of waiting time 

oder

set timeout 300; # 5 minutes of waiting time 

Sie können die obige Aussage in Ihrem Code halten.

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

Immer \r Charakter 'Enter' senden Schlüssel statt \n. Die letzte Anweisung expect eof wird auf das ordnungsgemäße Schließen des Programms sftp warten.

+0

warum immer '\ r'? '\ n' funktioniert möglicherweise nicht? –

+0

Vielen Dank, Timeout wurde behoben. – Ali

+0

@EmilyE. : '\ n' funktioniert immer noch, aber' \ n' wird intern in '\ 'umgewandelt. – Dinesh

Verwandte Themen