Sua melhor aposta será escrever um script em vez de tentar passar um grande comando feio via ssh
arguments. Torna-se muito difícil executar comandos complexos via argumentos ssh porque o ssh junta todos os argumentos em uma string separada por espaço e, em seguida, os divide novamente no final remoto.
Agora, usar um script não é tão ruim quanto parece e é bem simples, já que você pode passar o script para STDIN.
function host_file_count() {
ssh -o StrictHostKeyChecking=no david@"$1" bash -s <<'EOI'
dir_last="$(ls -dt1 /bat/data/snapshot/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n 1)"
count="$(ls -1 "$dir_last"/ | wc -l)"
echo "$(hostname): $dir_last=$count"
EOI
}
host_file_count machineB
host_file_count machineC
Basicamente isso apenas alimenta o script no STDIN de ssh
, que por sua vez passa para STDIN de bash -s
no host remoto.
A outra vantagem de fazer isso dessa forma é que você não precisa executar vários comandos ssh
para obter o resultado.
Observe que muitos dirão para não analisar ls
. Então, abaixo está outro script que faz o mesmo, mas sem usar ls
.
function host_file_count() {
ssh -o StrictHostKeyChecking=no david@"$1" bash -s <<'EOI'
dirs=( /bat/data/snapshot/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ) # get a list of matching directories
dir_last="${dirs[${#dirs[@]} - 1]}" # get the last item in the list
files=( "$dir_last"/* ) # get the list of files in directory
count="${#files[@]}" # size of that list
echo "$(hostname): $dir_last=$count"
EOI
}
host_file_count machineB
host_file_count machineC
nota: ambos são completamente não testados, pode haver pequenos erros, mas o princípio está