Nous avons un serveur sur lequel un autre script sFTP et télécharge des fichiers tous les jours.
Question : Est-il possible de détecter que le fichier a été téléchargé, puis d'archiver automatiquement le fichier une fois terminé ?
Pour clarifier - Nous hébergeons les fichiers et quelqu'un d'autre vient le télécharger.
Voici le script qu'ils utilisent :
let $command = 'sftp -b /usr/tmp/file.sftp [email protected]'
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
Réponse acceptée :
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 sftp-server
démon via sshd_config
et "remplacez-le" avec votre propre script qui pourrait alors intercepter ce sftp-server
est en train de faire, puis agissez lorsque vous voyez qu'un fichier a été téléchargé. Remplacer le sftp-server
par défaut dans sshd_config
est facile :
Subsystem sftp /usr/local/bin/sftp-server
Comprendre ce qu'il faut faire dans le script wrapper serait la partie la plus 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 activez le débogage de sftp-sever
vous pouvez l'obtenir pour afficher les journaux lorsque les fichiers sont ouverts/fermés et lus/écrits vers/depuis le serveur SFTP. Vous pouvez écrire un démon/script qui surveille ces journaux, puis sauvegarde le fichier si nécessaire. De plus amples détails sur la façon d'y parvenir sont déjà partiellement couverts dans ma réponse à cette question-réponse U&L intitulée :Niveau de journalisation des activités dans SFTP ainsi qu'ici dans ce billet de blog intitulé :Journalisation des activités de la session de transfert de fichiers 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 auriez alors besoin de développer un démon/script qui surveillerait les journaux pour les paires d'événements d'ouverture/fermeture. Ceux-ci représentent un transfert de fichier terminé. Vous pouvez également utiliser syslog, qui peut surveiller les événements de journal "CLOSE" et il peut être utilisé pour effectuer la copie des fichiers transférés.
3. Incron
Vous pouvez utiliser les événements Inotify que le noyau Linux produit chaque fois qu'un fichier est accédé. Il existe un service appelé Incron qui fonctionne de manière similaire à Cron. Là où Cron fonctionne en fonction du temps, Incron fonctionne en fonction des événements de fichiers. Ainsi, vous pouvez configurer une entrée Incron qui surveillera vos répertoires de téléchargement SFTP, et chaque fois qu'un événement de fichier spécifique est détecté, copiez le fichier.
Connexe :Parcourir le fichier vmdk dans Windows ?
Consultez la page de manuel inotify pour une description des différents événements. Je crois que vous voudriez surveiller un read()
(IN_ACCESS
) suivi d'un close()
(IN_CLOSE_WRITE
). Ceux-ci seraient pour les fichiers qui ont été copiés à partir du serveur 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 répertoires pour les modifications et prendre des mesures montre beaucoup plus de détails nécessaires, si vous voulez essayer cette option.