sftp bash 脚本不下载文件

sftp bash script doesnt downloads files

我的 bash 脚本有问题。

您可以在此处查看脚本和日志文件:

#!/bin/bash

LOCALDIR="/data/IMPORT/$(date +%Y%m%d)"
REMOTEDIR="/EXPORT"
FILELIST="$LOCALDIR/filelist.txt"
FILELIST2="$LOCALDIR/filelist2.txt"

SFTP="sftp -P 1234 -i /var/xxxxxx.pem -oStrictHostKeyChecking=no  user@xxxxx.xxxx"
PASSPHRASE="xxxxxxxxxxxxxxxx"

mkdir -p $LOCALDIR
rm $FILELIST
rm $FILELIST2

allfilenames=()

function readFileList {
expect -c "
spawn $SFTP
expect \"assphrase\"
send \"$PASSPHRASE\r\"
expect \"sftp>\"
send \"lcd $LOCALDIR\r\"
send \"ls -l $REMOTEDIR/*\r\"
expect \"sftp>\"
send \"exit\r\"
interact " > $FILELIST
}

function getFiles {

myfilenames=("$@")

expect -c "
spawn $SFTP
expect \"assphrase\"
send \"$PASSPHRASE\r\"
expect \"sftp>\"
send \"lcd $LOCALDIR\r\"
expect \"sftp>\"
send \"cd $REMOTEDIR\r\"
expect \"sftp>\"
" >> $FILELIST2

for filepath in "${myfilenames[@]}"
do
file="$(basename -- $filepath)"
expect -c "
send \"get -P $file\r\n\"
sleep 3
expect \"sftp>\"
" >> $FILELIST2
done

expect -c "
send \"exit\r\"
" >> $FILELIST2

}

readFileList

c=0
if [[ -f "$FILELIST" ]]; then
    while read line; do
        filename=$(echo $line | awk '{ print  }')
        if [[ "$filename" =~ ^$REMOTEDIR ]] ; then
            allfilenames+=($filename)
        fi
    done < $FILELIST
fi

getFiles "${allfilenames[@]}"

filelist.txt 看起来像:

spawn sftp -P 1234 -i /var/xxxxxx.pem -oStrictHostKeyChecking=no  user@xxxxx.xxxx
Enter passphrase for key '/var/xxxxxx.pem':
Connected to xxxxx.xxxx.
sftp> lcd /data/IMPORT/20200401
sftp> ls -l /EXPORT/*
-rw-r--r--    0 1000472  1000472      3681 Mar 31 22:31 /EXPORT/file1.txt
-rw-r--r--    0 1000472  1000472     14537 Mar 31 22:34 /EXPORT/file2.txt
-rw-r--r--    0 1000472  1000472      5932 Mar 31 22:34 /EXPORT/file3.txt
sftp> exit

filelist2.txt 看起来像:

spawn sftp -P 1234 -i /var/xxxxxx.pem -oStrictHostKeyChecking=no  user@xxxxx.xxxx
Enter passphrase for key '/var/xxxxxx.pem':
Connected to xxxxx.xxxx.
sftp> lcd /data/IMPORT/20200401
sftp> cd /EXPORT
sftp> get -P file1.txt
get -P file2.txt
get -P file3.txt
exit
expect -c 'spawn sftp ...'

expect -c 'send "get file\r" '

此处,当第一个 expect -c 完成时,SFTP 连接将关闭,因此第二个 expect -c 将无法工作。一个 SFTP 会话必须使用一个 expect -c

就像你手动sftp到服务器时,你暂时无法返回Bash,稍后再返回sftp。