É possível detectar quando um arquivo foi baixado?

6

Temos um servidor onde outro script sFTPs e downloads de arquivos todos os dias.

Pergunta: É possível detectar que o arquivo foi baixado e, em seguida, arquivar automaticamente o arquivo depois que eles são feitos?

Para esclarecer - Nós hospedamos os arquivos e outra pessoa vem e faz o download.

Este é o script que eles usam:

let $command = 'sftp -b /usr/tmp/file.sftp someuser@myserver'
show 'FTP command is ' $command
call system using $command #status

##file.sftp##

# Set local directory on PeopleSoft server
lcd /var/tmp
# Set remote directory on the remote server
cd ar/in
# Transfer all remote files to PeopleSoft
get file.dat
get file2.dat
# quit the session
bye
    
por Alex 02.12.2014 / 22:56

3 respostas

11

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.

    
por 03.12.2014 / 07:35
3

Configure o servidor SSH para registrar a atividade e, em seguida, você poderá analisar o log para saber se esse arquivo foi baixado.

Para ativar o registro em log de -l INFO na linha do subsistema sftp no arquivo /etc/ssh/sshd_config , ele deve ser parecido com (o caminho pode variar por distro, estou usando o SuSE 11):

Subsystem    sftp    /usr/lib64/ssh/sftp-server -l INFO

Agora as sessões sftp serão registradas em /var/log/messages .

Este é um registro para o arquivo baixado pelo sftp:

Dec  3 08:42:02 $HOSTNAME sftp-server[$PID]: session opened for local user user from [192.168.0.10]
Dec  3 08:42:03 $HOSTNAME sftp-server[$PID]: opendir "/home/user"
Dec  3 08:42:03 $HOSTNAME sftp-server[$PID]: closedir "/home/user"
Dec  3 08:42:18 $HOSTNAME sftp-server[$PID]: open "/home/user/file" flags READ mode 0666
Dec  3 08:42:19 $HOSTNAME sftp-server[$PID]: close "/home/user/file" bytes read 48843 written 0

Agora você pode analisar o arquivo para saber se o arquivo foi acessado com algo como:

#!/bin/bash

grep sftp /var/log/messages | grep -q $FILENAME
if [ $? -eq 0 ]
    do something
else
    do other thing
fi

Como ativar o registro em SFTP: link

    
por 02.12.2014 / 23:20
-1

Se você conhece o caminho e o nome, então você pode fazer isso

if [ -f $filename ];
then 
archive
else
echo ""
fi

No entanto, você não adicionou essas informações.

    
por 03.12.2014 / 01:06