Obtenha apenas arquivos modificados nos últimos 30 minutos usando o sftp get

1

Em um script .sh , estou usando expect para% sftp automaticamente em outro computador para get arquivos. Meu script será configurado para ser executado a cada 30 minutos, ponto no qual eu quero get somente arquivos que foram criados (modificados) desde a última execução (risco de repetição, nos últimos 30 minutos). Eu sei que os arquivos seguirão um método de nomenclatura específico: AppData*.RAW onde * será uma string de data e hora. No entanto, não sei quando os arquivos serão criados ou transferidos para o computador com o qual estou me comunicando, nem sei quantos podem existir, pois o número pode variar.

...
/usr/bin/expect<<EOD
spawn sftp user@host
expect "User's password: "
send "$password\r"
expect "sftp>"
send "get ????"
EOD
...

Procurei ajuda com get e encontrei referências ao uso da opção -neweronly , além de tentar usar synchronize . No entanto, não sei como implementar nenhum destes, ou se synchronize é mesmo uma opção no diálogo sftp . Ajuda com get

Além disso, o computador que eu tenho para sftp armazena arquivos de entrada em um diretório com milhares de arquivos antigos (de 2013 para o presente), então é imperativo que eu só pegue arquivos da última meia hora.

    
por Alex26 17.09.2015 / 00:38

1 resposta

2

sftp tem recursos limitados. A maneira mais fácil de fazer coisas complexas sobre o SFTP é usar SSHFS . O SSHFS é um sistema de arquivos que usa SFTP para fazer um sistema de arquivos remoto aparecer como um filessytem local. No cliente, o SSHFS requer o FUSE , que está disponível na maioria dos unices modernos. No servidor, o SSHFS requer SFTP; Se o servidor permitir SFTP, você poderá usar o SSHFS com ele.

Por exemplo, para copiar os arquivos modificados nos últimos 30 minutos, primeiro monte o diretório remoto por SFTP com sshfs . Use sshpass se você tiver que usar uma senha para o SSH. Em seguida, use o comando que você usaria localmente (aqui, eu uso os utilitários GNU, mas dependendo do que você está fazendo, rsync -a mnt/ /local/path/ pode ser melhor). Desmonte o sistema de arquivos SSHFS quando terminar.

mkdir mnt
sshpass -f password.txt sshfs user@host: mnt
find mnt -mmin -30 -exec cp -t /local/path/ {} +
fusermount -u mnt
    
por 17.09.2015 / 02:02