Est-il possible de détecter quand un file a été téléchargé?

Nous avons un server où un autre script sFTPs et télécharge des files tous les jours.

Question: Est-il possible de détecter que le file a été téléchargé et ensuite pour moi d'archiver automatiquement le file après qu'ils soient terminés?

Pour clarifier – Nous hébergeons les files et quelqu'un d'autre vient et le télécharge.

C'est le script qu'ils utilisent:

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 

Il y a 3 pistes que je peux concevoir qui pourraient vous fournir une solution.

1. Sous-système sftp personnalisé

Vous pouvez envelopper le démon sftp-server via sshd_config et le "surcharger" avec votre propre script qui pourrait alors intercepter ce que fait sftp-server , puis agir quand vous verrez qu'un file a été téléchargé. Le rlocation du sftp-server par défaut dans sshd_config est facile:

 Subsystem sftp /usr/local/bin/sftp-server 

Déterminer ce qu'il faut faire dans le script wrapper serait la partie difficile. Dans /usr/local/bin/sftp-server :

 #!/bin/sh # ...do something... chroot /my/secret/stuff /usr/libexec/openssh/sftp-server # ...do something... 

2. Regardez les journaux

Si vous lancez le debugging de sftp-sever vous pouvez l'get pour afficher les journaux de l'ouverture / fermeture des files et lire / écrire sur / depuis le server SFTP. Vous pouvez écrire un démon / script qui surveille ces journaux, puis sauvegarde le file en cas de besoin. Plus de détails sur la façon de réaliser ceci sont déjà partiellement couverts dans ma réponse à ce Q & R d'U & L en mosaïque: Niveau d' logging d'activité dans SFTP ainsi qu'ici dans ce billet de blog intitulé: Enregistrement d' activité de session de transfert de files SFTP .

Les journaux SFTP peuvent être améliorés afin qu'ils ressemblent à ceci:

 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] 

Vous devez ensuite développer un démon / script qui surveillera les journaux pour les paires d'events open / close. Ceux-ci représentent un transfert de file terminé. Vous pouvez également utiliser syslog, qui pourrait surveiller les events de journal "FERMER" et il pourrait être utilisé pour effectuer la copy des files transférés.

3. Incron

Vous pouvez utiliser les events Inotify que le kernel Linux produit chaque fois qu'un file est accédé. Il y a un service appelé Incron qui fonctionne de la même façon que Cron. Lorsque Cron fonctionne en fonction du time, Incron fonctionne en fonction des events de file. Vous pouvez donc configurer une input Incron qui surveillera vos directorys de téléchargement SFTP, et chaque fois qu'un événement de file spécifique est détecté, copyz le file.

Jetez un oeil à la page man inotify pour la description des différents events. Je crois que vous voudriez regarder un read() ( IN_ACCESS ) suivi d'un close() ( IN_CLOSE_WRITE ). Ce serait pour les files qui ont été copiés à partir du server SFTP.

Les règles Incron ressemblent à ceci:

 <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 

Cet article intitulé: Linux incrond inotify: Surveiller les directorys pour les changements et prendre des mesures montre beaucoup plus de détails nécessaires, si vous voulez essayer d'aller avec cette option.

Configurez le server SSH pour save l'activité, puis vous pouvez parsingr le journal pour savoir si un tel file a été téléchargé.

Pour activer la journalisation append -l INFO à la ligne de sous-système sftp dans le file /etc/ssh/sshd_config , il devrait ressembler à quelque chose comme (le path peut varier selon la dissortingbution, j'utilise SuSE 11):

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

Maintenant, les sessions SFTP seront enregistrées dans /var/log/messages .

Ceci est un journal pour le file téléchargé par 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 

Vous pouvez maintenant parsingr le file pour savoir si le file a été accédé avec quelque chose comme:

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

Comment activer la journalisation SFTP: https://serverfault.com/questions/73319/sftp-logging-is-there-a-way

Si vous connaissez le path et le nom, vous pouvez le faire

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

Cependant, vous n'avez pas ajouté de telles informations.