Назад | Перейти на главную страницу

Ошибка при передаче строки в scp в цикле for

Я беру список файлов с сервера через поиск через ssh

for f in `ssh -p ${SSH_PORT} -l ${SSH_USER} ${SSH_HOST} -t "find ${DIR_REMOTE} -type f | grep jpg" 2> /dev/null`

Когда я повторяю список в теле цикла for (echo ${f}) все в порядке:

/a3/obieg/skan001/skan001.jpg
/a3/obieg/skan001/skan000.jpg
/a3/obieg/skan001/skan003.jpg
/a3/obieg/skan001/skan002.jpg
/a3/obieg/skan.jpg

Но когда я пытаюсь скопировать его через scp (в том же цикле) (scp -p -P ${SSH_PORT} ${SSH_USER}@${SSH_HOST}:"${f}" "${DIR_SUB}${2}_$(date +%Y%m%d_%H%M%S_%N.jpg)"), результат:

: No such file or directory001.jpg
: No such file or directory000.jpg
: No such file or directory003.jpg
: No such file or directory002.jpg
: No such file or directory

Я не понимаю, что здесь происходит ...

весь сценарий:

SSH_USER=username
SSH_HOST=${1}
SSH_PORT=22

DIR_REMOTE="/a3/obieg/"
DIR_LOCAL="/b2/skany_temp_test/ot/"
DIR_SUB="${DIR_LOCAL}${2}/"

# foldery
mkdir "${DIR_LOCAL}" 2> /dev/null
mkdir "${DIR_SUB}" 2> /dev/null

# sync
for f in `ssh -p ${SSH_PORT} -l ${SSH_USER} ${SSH_HOST} -t "find ${DIR_REMOTE} -type f | grep jpg" 2> /dev/null`
do
#   echo ${f}
    scp -p -P ${SSH_PORT} ${SSH_USER}@${SSH_HOST}:"$f" "${DIR_SUB}${2}_$(date +%Y%m%d_%H%M%S_%N.jpg)"
    # ssh -p ${SSH_PORT} -l ${SSH_USER} ${SSH_HOST} -t "rm ${f}"
done

Хорошо - я думаю, что нашел решение.

Я заменил scp с участием rsync и он показал мне полный путь (который в данном случае заканчивался ascii-последовательностью #\015).

Это выглядит как scp искал файл /some-path/some-file.jpg\r, потому что цикл for разделил строки на \n

ssh -t выделяет псевдотерминал, который возвращает оконечные окончания строк (\r\n), как и screen команда.

Я отправил каждый ответ ssh через dos2unix, и теперь это работает.

  • ты можешь написать найти часть более эффективна (имеет смысл при большом количестве файлов)
    find ${DIR_REMOTE} -type f -name "*.jpg" 2>/dev/null
  • также вы можете полоса символы возврата каретки (\ r) с помощью sed:
    find ${DIR_REMOTE} -type f -name "*.jpg" 2>/dev/null | sed 's/\r//g'

Вам не нужно делать

${SSH_USER}@${SSH_HOST}:"$(echo $f)"

в вашей команде SCP. Я ожидал, что это должно работать нормально:

${SSH_USER}@${SSH_HOST}:"${f}"

РЕДАКТИРОВАТЬ: перечитайте свой ответ ниже, если вы собирались echo в команде копирования вам нужно будет сделать echo -n чтобы отключить печать новой строки в конце.