Скрипт sftp bash не загружает файлы - PullRequest
0 голосов
/ 01 апреля 2020

У меня проблема с моим bash скриптом.

  • Он подключается к моему серверу sftp.
  • Получает список файлов для загрузки.
  • Должен загрузить файлы. Но это не делает этого. Я могу видеть команды. если я пишу команды вручную, это работает.

Вы можете увидеть скрипт и файлы журнала здесь:

#!/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 $9 }')
        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

1 Ответ

1 голос
/ 01 апреля 2020
expect -c 'spawn sftp ...'

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

Здесь, когда первый expect -c завершится, SFTP-соединение будет закрыто, поэтому второе expect -c не будет работать. Вы должны использовать один expect -c для одного сеанса SFTP.

Это похоже на то, когда вы вручную подключаетесь к серверу sftp, вы не можете временно go вернуться к Bash и вернуться к sftp позже.

...