【问题标题】:SCP is not transferring whole data when used with expect与期望一起使用时,SCP 不会传输整个数据
【发布时间】:2017-12-31 03:57:08
【问题描述】:

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

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

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

以下脚本创建数据文件,归档/压缩,然后发送到服务器B

#!/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 时没有出现问题。

【问题讨论】:

    标签: linux expect file-transfer scp


    【解决方案1】:

    您需要等待每个生成的进程完成,否则该进程可能会在完成之前被终止。所以你可以为每个spawn添加一个interact

    spawn ...
    ...
    interact
    
    spawn ...
    ...
    interact
    

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

    【讨论】:

    • @derp,-timeout 标志在这里很重要,因为 expect 的默认超时值为 10 秒。这就解释了为什么小文件可以正常传输而大文件不能。
    猜你喜欢
    • 2016-08-21
    • 1970-01-01
    • 2014-11-05
    • 2013-05-26
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    相关资源
    最近更新 更多