当与期望一起使用时,SCP不会传输整个数据

时间:2017-07-25 09:48:04

标签: linux expect file-transfer scp

我正在尝试将数据(存档/压缩)从ServerA传输到ServerB,并检查两个服务器中的数据大小(如果所有数据都已传输)。我的脚本如下。

下面的脚本解压缩ServerB中的数据并检查数据大小(稍后将使用)

#!/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的小数据,但是当数据大小很大(甚至5o 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,密码)这就是我使用期望的原因,我出于某些原因无法使用公钥认证。 我已经检查过在ServerA和ServerB之间使用scp和rsync传输更大的数据(超过2 GB),除非我尝试使用expect,否则没有问题。

1 个答案:

答案 0 :(得分:1)

您需要等待每个生成过程完成,否则该过程可能会在完成之前被终止。因此,您可以为每个interact添加spawn

spawn ...
...
interact

spawn ...
...
interact

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

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