Existem 3 caminhos que posso conceber e que podem fornecer uma solução.
1. Subsistema sftp personalizado
Você poderia agrupar o daemon sftp-server
via sshd_config
e "substituí-lo" pelo seu próprio script, que poderia então interceptar o que o sftp-server
estava fazendo e agir quando vir que um arquivo foi baixado. Substituir o padrão sftp-server
em sshd_config
é fácil:
Subsystem sftp /usr/local/bin/sftp-server
Descobrir o que fazer no script de wrapper seria a parte difícil.Em /usr/local/bin/sftp-server
:
#!/bin/sh
# ...do something...
chroot /my/secret/stuff /usr/libexec/openssh/sftp-server
# ...do something...
2. Assista os logs
Se você ativar a depuração de sftp-sever
, poderá fazê-lo para mostrar os registros de quando os arquivos estão sendo abertos / fechados e lidos / gravados para / do servidor SFTP. Você pode escrever um daemon / script que observe esses logs e depois faça backup do arquivo quando necessário. Mais detalhes sobre como conseguir isso já estão parcialmente cobertos em minha resposta a essa pergunta e respostas: Nível de registro de atividades em SFTP , bem como aqui neste post de blog intitulado: arquivo SFTP transferir o registro de atividades da sessão .
Os logs do SFTP podem ser aprimorados para ficarem assim:
Sep 16 16:07:19 localhost sftpd-wrapper[4471]: user sftp1 session start from 172.16.221.1
Sep 16 16:07:19 localhost sftp-server[4472]: session opened for local user sftp1 from [172.16.221.1]
Sep 16 16:07:40 localhost sftp-server[4472]: opendir "/home/sftp1"
Sep 16 16:07:40 localhost sftp-server[4472]: closedir "/home/sftp1"
Sep 16 16:07:46 localhost sftp-server[4472]: open "/home/sftp1/transactions.xml" flags WRITE,CREATE,TRUNCATE mode 0644
Sep 16 16:07:51 localhost sftp-server[4472]: close "/home/sftp1/transactions.xml" bytes read 0 written 192062308
Sep 16 16:07:54 localhost sftp-server[4472]: session closed for local user sftp1 from [172.16.221.1]
Você precisaria desenvolver um daemon / script que monitore os logs dos pares de eventos de abertura / fechamento. Estes representam uma transferência de arquivos concluída. Você também pode fazer uso do syslog, que pode monitorar os eventos de log "CLOSE" e pode ser usado para executar a cópia dos arquivos transferidos.
3. Incron
Você pode usar os eventos Inotify que o kernel Linux produz toda vez que um arquivo é acessado. Existe um serviço chamado Incron que funciona de forma semelhante ao Cron. Onde o Cron funciona com base no tempo, o Incron funciona com base em eventos de arquivo. Assim, você pode configurar uma entrada do Incron que monitore seus diretórios de upload de SFTP e, sempre que um evento de arquivo específico for detectado, copie o arquivo.
Dê uma olhada na página man inotify para obter uma descrição dos vários eventos. Acredito que você queira assistir a um read()
( IN_ACCESS
) seguido por um close()
( IN_CLOSE_WRITE
). Estes seriam para arquivos que foram copiados do servidor SFTP.
As regras do Incron são assim:
<directory> <file change mask> <command or action> options
/var/www/html IN_CREATE /root/scripts/backup.sh
/sales IN_DELETE /root/scripts/sync.sh
/var/named/chroot/var/master IN_CREATE,IN_ATTRIB,IN_MODIFY /sbin/rndc reload
Este artigo intitulado: Linux incrond inotify: Monitore os diretórios para alterações e tome medidas mostra muito mais detalhes necessários, se você quiser tentar usar esta opção.