2017-07-25 80 views
0

我试图从ServerA传输数据(存档/压缩)到ServerB并检查所有数据传输时两台服务器中数据的大小。我的脚本在下面给出。SCP与预期使用时不传输整个数据

下面脚本在服务器B进行解压缩的数据和checkes数据大小(稍后使用)

#!/bin/bash 
#Decompresses file and checks sizes 
cd /home 
touch listB 
tar -zxvf datafiles.tar.gz 
du -sh datafiles* > listB 

下面脚本创建数据文件,归档/压缩,然后发送到ServerB

#!/bin/bash 
#File process and transfer 

#Remote server IP and access 
read -p "Enter ServerB IP:" serverBIP 
read -p "Enter ServerB Port:" serverBSSHPort 
read -p "Enter ServerB Password:" serverBPass 

startTime=$(date +%s) 

#Processing data 
cd /home/ 
seq 10000000 > /home/datafile1 
seq 11110000 > /home/datafile2 
mkdir datafiles 
cp -r datafile1 datafile2 datafiles 
tar -czvf datafiles.tar.gz datafiles 
du -sh datafiles* > listA 

checker=/home/checker 
data=datafiles.tar.gz 

export serverBIP 
export serverBSSHPort 
export serverBPass 
export checker 
export data 

#File transfer to remote server 
    /usr/bin/expect <(cat <<-'EOF' 

    spawn scp -r -P $::env(serverBSSHPort) $::env(checker) $::env(serverBIP):/home 
    expect "assword:" 
    send "$::env(serverBPass)\r" 

    spawn scp -r -P $::env(serverBSSHPort) $::env(data) $::env(serverBIP):/home 
    expect "assword:" 
    send "$::env(serverBPass)\r" 

    spawn ssh $::env(serverBIP) -p $::env(serverBSSHPort) "bash -s" < $::env(checker) 
    expect "assword:" 
    send "$::env(serverBPass)\r" 

    interact 

    EOF 
    ) 

finishTime=$(date +%s) 
timeElapsed=$((finishTime - startTime)) 
minute=$((timeElapsed/60)) 
sec=$((timeElapsed % 60)) 
echo It took $minute min $sec sec to complete the task 

这是适用于小于20 MB的小数据大小,但当数据大小很大(甚至是5 MB)时,所有数据都不会被传输并给出错误提示:

gzip: stdin: unexpected end of file 
tar: Unexpected EOF in archive 
tar: Unexpected EOF in archive 
tar: Error is not recoverable: exiting now 

此错误显示可能是因为来自ServerA的归档/压缩数据未传输到ServerB。

任何人都可以告诉我什么是确切的原因,我该如何解决这个问题? 我也试过使用rsync,但得到语法错误。 我需要自动执行此任务(每次我在远程服务器上执行某些操作时都不想提供IP,密码),这就是我使用expect的原因,出于某些原因我无法使用公钥验证。 我已经检查使用ServerA和ServerB之间的scp和rsync传输更大的数据(超过2 GB),除了当我尝试使用期望时没有发生任何问题。

回答

1

您需要等待每个产卵过程完成或者过程可能会在完成前被杀死。所以,你可以为每个spawn添加interact

spawn ... 
... 
interact 

spawn ... 
... 
interact 

spawn ... 
... 
expect -timeout -1 eof 

spawn ... 
... 
expect -timeout -1 eof 
+1

@derp的'-timeout'标志很重要,因为这里想到的默认超时值是10秒。这将解释为什么小文件可以正确传输,但大文件不能。 –