Copiando os últimos três arquivos do servidor remoto

0

Existe uma coleção de arquivos .doc, além de outros tipos de arquivos, em um servidor remoto (que suporta SCP).

Eu vi um script:

FILE='ssh abc@xyz ls -ht /tmp/*.doc | head -n 1'
rsync -avz -e ssh abc@xyz:"$FILE" .

Ele pode copiar o arquivo mais recente do servidor remoto quando usar o parâmetro "head -n 1". Mas eu descobri que não é possível copiar os últimos três arquivos do servidor remoto, mesmo se ele usar o parâmetro "head -n 3".

    
por Wei Yu 06.09.2016 / 06:22

2 respostas

1

Se o shell de login de abc em xyz for zsh :

ssh abc@xyz 'cd /tmp && tar cf - ./*.doc(.LM-100om[1,3]) | gzip -3' |
  gunzip | tar xvf -

Se não for zsh (mas zsh está instalado):

ssh abc@xyz "cd /tmp && exec zsh -c 'tar cf - ./*.doc(.LM-100om[1,3]) | gzip -3'" |
  gunzip | tar xvf -

Em qualquer caso, esteja ciente de que /tmp (ou qualquer diretório gravável do mundo) é um campo minado. Acima, somos cuidadosos o suficiente para selecionar apenas arquivos regulares menores que 100 MiB (com (.LM-100) ) e tar não seguirá links simbólicos nem lerá o conteúdo de dispositivos ou pipes nomeados, mas ainda há uma condição de corrida em que alguém poderia ampliar um arquivo para vários tebibytes entre esse glob sendo expandido e o comando tar sendo executado.

E, é claro, qualquer um poderia colocar malware com uma extensão .doc em /tmp , então você precisaria tratar esses arquivos de download com muito cuidado.

Seria melhor fazer isso no diretório privado em vez de /tmp .

    
por 06.09.2016 / 17:42
0

ls saídas 1 nome de arquivo por linha, head apara N linhas, mas rsync espera um arquivo ou glob para processar, você pode fazer isso:

FILES='ssh acb@xyz 'ls -t /tmp/*.doc' | head -n 3 | tr '\n' ',''
rsync -avz -e ssh abc@xyz:"\{$FILES\}" .
    
por 06.09.2016 / 20:36