Você tem muitos shells fazendo algum processamento lá. Além disso, usar backticks é uma má idéia, especialmente quando haverá barras invertidas nelas. Você deve usar a sintaxe $(...)
.
sudo -s
inicia um shell para executar o comando, mas com sudo
tentando escapar de alguns dos caracteres especiais para o shell. Você não quer usar isso.
ssh
executa um shell no host remoto para interpretar a linha de comando que é feita da concatenação dos argumentos (com espaço intermediário).
Então, em:
var1='sudo -u psoadmin -H -s ssh [email protected] find . -maxdepth 1 -type f -mtime +14 -exec ls -lh \{} \;'
sudo
é executado:
"/bin/bash", ["/bin/bash", "-c",
"ssh daill_scp\@files.dc1.responsys.net find \. -maxdepth 1 -type f -mtime \+14 -exec ls -lh \{\} \;"]
( /bin/bash
ou qualquer que seja o shell de login do usuário).
Observe como sudo
escapou de .
, +
, }
, mas não de barra invertida por nenhuma boa razão.
Então esse bash será executado:
"/usr/bin/ssh", ["ssh", "[email protected]", "find", ".", "-maxdepth", "1", "-type", "f", "-mtime", "+14", "-exec", "ls", "-lh", "{}", ";"]
ssh
irá concatenar esses e executar no host remoto:
"$SHELL", ["$SHELL", "-c", "find . -maxdepth 1 -type f -mtime + 14 -exec ls -lh {} ;"]
(onde $SHELL
é o shell de login do usuário remoto desta vez).
Esse ;
acima não é ignorado, portanto, interpretado como um separador de comando e não passado para find
, e é por isso que find
reclama que -exec
não foi finalizado.
Aqui, você quer:
var1=$(
sudo -u psoadmin -H ssh [email protected] '
find . -maxdepth 1 -type f -mtime +14 -exec ls -lh {} \;' |
awk '{print $5, $9}' |
egrep -v '^./upload|^./download|^./archive|^\.'
)
(não que esse comando (especialmente o egrep
part) faça muito sentido).