Executando script através do ssh e avaliando algum var / comand dentro da máquina host

0

Estou criando um script para migrar alguns dados entre servidores.

Minha dor de cabeça:

(...)
ssh -t -i ${KEY} ${USER}@${HOST} "cd /home/${ACCOUNT}/var/${DOMAIN}/ && tar cf - mail/ -P | pv -s $(du -sb mail/ | awk '{print $1}') | gzip > mail.tar.gz"

Este comando retorna algo como "Não consigo encontrar a pasta de e-mail" e acho que sei por quê.

Este comando é avaliado antes da conexão ssh pv -s $(du -sb mail/ | awk '{print $1}') , e a pasta de e-mail não existe no primeiro servidor. Mas se eu codificar o tamanho do byte atual, o script funcionará.

Como posso evitar essa situação?

Eu usaria ' mas já está sendo usado em '{print $1}' , também tentei criar outra variável para acomodar algo como 'pv -s $(du -sb mail/ | awk \'{print $1}\') ' mas ainda sem sorte, eu tentei tantas possibilidades com aspas normais e duplas.

PS: Desculpe pelo meu "engrish"

Offtopic: I would love if someone points me to some good article(or some crucial keyword to search for) to explain/show all the possibilites to declarate, display and evaluate variables, I don't know the right terminology. Like ${var} and $var, what echo does when you use " or ', and how to escape duplicated quotes, double quotes, concatenation, etc...

Full script example:

clear
printf "\n\n"
echo "********************************  INTERWORX --> CPANEL  *************************************"
printf "\n\n"

USER=root
HOST=xxx.xxx.xxx.xxx
PORT=xxxx
KEY=/var/somewhere
# ----------------
ACCOUNT=myaccount
DOMAIN=example.com

printf " ► ---------------------- [ ${HOST} ]\n"
printf " ►►---------------------- \n"

ssh -t -i ${KEY} ${USER}@${HOST} "cd /home/${ACCOUNT}/var/${DOMAIN}/ && tar cf - mail/ -P | pv -s \$(du -sb mail/ | awk '{print $1}')  | gzip > mail.tar.gz"

printf "\n ►►► ------------ [ mail.tar.gz ]\n\n"

scp -i ${KEY} ${USER}@${HOST}:/home/${ACCOUNT}/var/${DOMAIN}/mail.tar.gz .
                          ( ... )
    
por kpuccino 29.06.2018 / 16:10

1 resposta

2

Como você mencionou as opções de depuração em seus comentários, Eu acho que isso merece uma resposta assim:

Use set -x como o primeiro comando na sequência

ssh -t -i ${KEY} ${USER}@${HOST} "set -x ; cd /home/${ACCO ....."

isso mostra claramente o ponto de falha no seu caso:

não escapou de $ 1

....
    ++ du -sb mail/
    + pv -s 12314 mail/   # <<< awk printed all the line instead of expected just 1st column with size and that ruined the command
    pv: mail/: read failed: Is a directory
...

versus escape

....
 ++ du -sb mail/
 + pv -s 12314    # <<< pv gets expected number
      10kiB 0:00:00 [ 184MiB/s] [=======
....
    
por 29.06.2018 / 19:34