Erro ao passar cadeia para scp em loop

1

Estou pegando a lista de arquivos do servidor via find via ssh

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

Quando faço eco da lista no corpo do loop for ( echo ${f} ), tudo fica bem:

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

Mas quando estou tentando copiá-lo via scp (no mesmo loop) ( scp -p -P ${SSH_PORT} ${SSH_USER}@${SSH_HOST}:"${f}" "${DIR_SUB}${2}_$(date +%Y%m%d_%H%M%S_%N.jpg)" ), o resultado é:

: 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

Não consigo entender o que está acontecendo aqui ...

script inteiro:

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
    
por mat 13.05.2016 / 15:44

3 respostas

1

Ok - Acho que encontrei a solução.

Eu substituí o scp por rsync e ele me mostrou o caminho completo (que, nesse caso, foi finalizado por ascii-sequence #5 ).

Parece que scp estava procurando por um arquivo /some-path/some-file.jpg\r , porque o loop dividiu as linhas por \n

ssh -t aloca um pseudo-terminal, que retorna terminações de linha semelhantes a janelas ( \r\n ), assim como o comando screen .

Eu canalizei cada resposta do ssh via dos2unix e agora funciona.

    
por 13.05.2016 / 16:45
0

Você não precisa fazer

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

no seu comando SCP. Eu esperaria que isso funcionasse bem:

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

EDIT: relendo sua resposta abaixo, se você fosse para echo no comando de cópia, seria necessário fazer echo -n para desativar a impressão de uma nova linha no final.

    
por 14.05.2016 / 15:37
0
  • você pode escrever encontrar parte mais eficiente (faz sentido quando você tem uma grande quantidade de arquivos)
    find ${DIR_REMOTE} -type f -name "*.jpg" 2>/dev/null
  • você também pode ativar strip caracteres de retorno de carro (\ r) com sed:
    find ${DIR_REMOTE} -type f -name "*.jpg" 2>/dev/null | sed 's/\r//g'
por 16.05.2016 / 12:35