Многопараметрическая строка не возвращается через команду get SFTP - PullRequest
0 голосов
/ 12 апреля 2019

Я работаю над сценарием ksh для извлечения файла каждый час через sftp, который будет помещен в планировщик заданий для ежечасной работы.Скрипт должен перейти в папку со вчерашней датой (remote / path / yyyymmdd /).Имя файла также содержит вчерашнюю дату и отметку времени (filename_yyyymmdd_hhmmss.dat).Поскольку работа будет запланирована, мой сценарий должен включать предыдущий час - напр.если задание выполняется в 11:02, файл для извлечения будет иметь имя_файла_yyyymmdd_10mmss.dat.Минуты и секунды всегда будут одинаковыми - например, 4949. В удаленном каталоге будет несколько файлов, и я хочу получить только самый последний, чтобы не было нескольких входных файлов, обрабатываемых нашими заданиями.В удаленном каталоге также будут регулярно создаваться другие файлы, поэтому я не могу получить только последние измененные файлы.

У меня есть переменные для возврата вчерашней даты и предыдущего часа, но команда sftp не возвращает полное имя файла и не получает файл.Я попытался объединить переменные, используя скобки, кавычки и круглые скобки, присвоить несколько переменных одной переменной и экспортировать переменные.

vdate=$(TZ=bb24 date '+%Y%m%d')
vhour=$(date '+%H')
prevhour=$((vhour - 1))

sftp user@host << EOF
lcd /my/dir/
cd /remote/path/$vdate/
get filename_$vdate_$prevhour*.dat
bye
EOF
exit

При запуске сценария файл не может быть найден и полное имя файла не возвращается:

File "/remote/path/20190411/filename_20190411" not found.

вместо

File "/remote/path/20190411/filename_20190411_10*.dat" not found.

Каждая комбинацияпеременных, которые я пробую, возвращает то же самое, что не найдено - заканчивая после filename_ $ vdate.

Я пробовал некоторые другие комбинации, но всегда получал то же самое, но не нашел:

newvar=${vdate}_${prevhour}
get filename_$newvar*.dat

и

newvar=${vdate}\\_${prevhour}
get filename_$newvar*.dat
File "/remote/path/20190411/filename_20190411" not found.

1 Ответ

1 голос
/ 15 апреля 2019

У вас есть проблема в вашем скрипте на prevhour=$((vhour - 1)), таким образом, текст 02 после того, как вы сделаете вычитание, будет 1, а не 01, и будет соответствовать нежелательным файлам, или даже ни одному, как 00 - 1 is -1

[edvin]$ vdate=$(TZ=bb24 date '+%Y%m%d')
[edvin]$ vhour=$(date '+%H')
[edvin]$ prevhour=$((vhour - 1))
[edvin]$ echo $vhour
03
[edvin]$ echo $prevhour
2
[edvin]$ prevhour=$(date -d '1 hour ago' '+%H')
[edvin]$ echo $prevhour
02

опция даты -d недоступна в некоторых системах.

Я считаю, что при вашей попытке оболочка считается * как частьпеременная prevhour, поскольку вы не поместили ее в {}, которая отделяет переменные от сорбируемого текста.

Это мое рабочее решение, основанное на вашей попытке:

#!/bin/ksh

r_host='server2'
r_user='edvin'
l_dir='./content'
r_dir='./Test_folder'

# this still not cover the case of midnight
# it put 00 to 23 but day have to be yesterday as well
##vdate=$(TZ=bb24 date '+%Y%m%d')
##vhour=$(date '+%H')                      # not used
##prevhour=$(date -d '1 hour ago' '+%H')

# vtime = YYYYmmdd_HH -1 H
vtime=$(TZ=bb24 date -d '1 hour ago' '+%Y%m%d_%H')

sftp ${r_user}@${r_host} << EOF
lcd ${l_dir}
cd ${r_dir}
get filename_${vtime}*.dat
bye
EOF

exit

Вывод:

[edvin]$ ./script.ksh 
Connected to server2.
sftp> lcd ./content
sftp> cd ./Test_folder
sftp> get filename_20190415_02*.dat
Fetching /home/edvin/Test_folder/filename_20190415_020000.dat to filename_20190415_020000.dat
Fetching /home/edvin/Test_folder/filename_20190415_020100.dat to filename_20190415_020100.dat
Fetching /home/edvin/Test_folder/filename_20190415_020200.dat to filename_20190415_020200.dat
Fetching /home/edvin/Test_folder/filename_20190415_020300.dat to filename_20190415_020300.dat
Fetching /home/edvin/Test_folder/filename_20190415_020400.dat to filename_20190415_020400.dat
Fetching /home/edvin/Test_folder/filename_20190415_020500.dat to filename_20190415_020500.dat
Fetching /home/edvin/Test_folder/filename_20190415_020600.dat to filename_20190415_020600.dat
Fetching /home/edvin/Test_folder/filename_20190415_020700.dat to filename_20190415_020700.dat
Fetching /home/edvin/Test_folder/filename_20190415_020800.dat to filename_20190415_020800.dat
Fetching /home/edvin/Test_folder/filename_20190415_020900.dat to filename_20190415_020900.dat
Fetching /home/edvin/Test_folder/filename_20190415_021000.dat to filename_20190415_021000.dat
sftp> bye

В этом решении еще многое может пойти не так, как, например, если удаленный каталог не существует, недоступен, сценарий будет продолжаться с остальной частью команды, то же самое для локального каталога и дляфайлы также.Соединение также может запускать различные проблемы, которые вы можете решить.Вы хотите запланировать это так, чтобы решение могло избежать повторного появления скрипта, если он уже запущен.

scp будет более предпочтительным способом сделать это, так как вы используете аутентификацию без пароля.

Если scp по какой-то причине не подходит, с expect это может быть обработано достаточно хорошо.

...