2017-12-27 70 views
0

VPS에서 Synology NAS 서버로 폴더를 전송하는 스크립트를 작성했습니다. 이유를 알리지 않고 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 eofsftp 프로그램의 정상 종료를 기다립니다.

+0

항상 '\ r'입니까? '\ n'이 작동하지 않을 수 있습니까? –

+0

감사합니다. 시간 제한을 설정하면 문제가 해결되었습니다. – Ali

+0

@EmilyE. :'\ n'은 여전히 ​​작동하지만'\ n'는 내부적으로'\ r'로 변환 될 것입니다. – Dinesh