Kann festgestellt werden, wann eine Datei heruntergeladen wurde?

7

Wir haben einen Server, auf dem ein anderes Skript jeden Tag sFTPs und Dateien herunterlädt.

Frage: Kann ich feststellen, dass die Datei heruntergeladen wurde, und die Datei nach Abschluss automatisch archivieren?

Zur Verdeutlichung - Wir hosten die Dateien und jemand anderes kommt und lädt sie herunter.

Dies ist das Skript, das sie verwenden:

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
Alex
quelle
Werden die Dateien über einen Cron-Job
eyoung100
3
Gibt es einen Grund, das ursprüngliche Skript nicht zu ändern, um Dinge zu archivieren, wenn es fertig ist?
Suchipi

Antworten:

12

Es gibt drei Möglichkeiten, die ich mir vorstellen kann, um Ihnen eine Lösung zu bieten.

1. Benutzerdefiniertes SFTP-Subsystem

Sie können den sftp-serverDaemon über verpacken sshd_configund ihn mit Ihrem eigenen Skript "überschreiben", das dann abfangen kann, was sftp-servergerade passiert, und dann handeln, wenn Sie sehen, dass eine Datei heruntergeladen wurde. Das Überschreiben der Standardeinstellung sftp-serverin sshd_configist einfach:

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

Herauszufinden, was im Wrapper-Skript zu tun ist, wäre der schwierige Teil /usr/local/bin/sftp-server.

#!/bin/sh

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

2. Beobachten Sie die Protokolle

Wenn Sie das Debuggen von sftp-severaufdrehen, können Sie Protokolle darüber anzeigen, wann Dateien geöffnet / geschlossen und auf dem SFTP-Server gelesen / geschrieben werden. Sie können einen Daemon / ein Skript schreiben, das diese Protokolle überwacht und die Datei bei Bedarf sichert. Weitere Details dazu finden Sie bereits teilweise in meiner Antwort auf diese U & L-Fragen und Antworten: Aktivitätsprotokollierungsstufe in SFTP sowie hier in diesem Blog-Beitrag mit dem Titel: Aktivitätsprotokollierung für SFTP-Dateiübertragungssitzungen .

Die SFTP-Protokolle können so erweitert werden, dass sie folgendermaßen aussehen:

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]

Sie müssten dann einen Dämon / ein Skript entwickeln, der die Protokolle auf die Ereignispaare zum Öffnen / Schließen überwacht. Diese stellen eine abgeschlossene Dateiübertragung dar. Sie können auch Syslog verwenden, das die Protokollereignisse "CLOSE" überwacht und zum Kopieren der übertragenen Dateien verwendet werden kann.

3. Incron

Sie können Inotify- Ereignisse verwenden, die der Linux-Kernel bei jedem Zugriff auf eine Datei erzeugt. Es gibt einen Dienst namens Incron, der ähnlich wie Cron funktioniert. Wo Cron basierend auf der Zeit arbeitet, arbeitet Incron basierend auf Dateiereignissen. Sie können also einen Incron-Eintrag einrichten, der Ihre SFTP-Upload-Verzeichnisse überwacht. Wenn ein bestimmtes Dateiereignis erkannt wird, kopieren Sie die Datei.

In der Manpage inotify finden Sie eine Beschreibung der verschiedenen Ereignisse. Ich glaube, Sie möchten nach einem read()( IN_ACCESS) gefolgt von einem close()( IN_CLOSE_WRITE) Ausschau halten . Diese gelten für Dateien, die vom SFTP-Server kopiert wurden.

Incron-Regeln sehen folgendermaßen aus:

<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

Dieser Artikel mit dem Titel: Linux incrond inotify: Verzeichnisse auf Änderungen überwachen und Maßnahmen ergreifen zeigt viel mehr Details, die erforderlich sind, wenn Sie versuchen möchten, diese Option zu verwenden.

slm
quelle
3

Konfigurieren Sie den SSH-Server so, dass die Aktivität protokolliert wird. Anschließend können Sie das Protokoll analysieren, um festzustellen, ob eine solche Datei heruntergeladen wurde.

Um das Anhängen -l INFOder Protokollierung an die Zeile des SFTP-Subsystems in der /etc/ssh/sshd_configDatei zu aktivieren , sollte es ungefähr so ​​aussehen (der Pfad kann je nach Distribution variieren, ich verwende SuSE 11):

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

Jetzt werden die SFTP-Sitzungen angemeldet /var/log/messages.

Dies ist ein Protokoll für eine von sftp heruntergeladene Datei:

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

Jetzt können Sie die Datei analysieren, um festzustellen, ob auf die Datei wie folgt zugegriffen wurde:

#!/bin/bash

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

So aktivieren Sie die SFTP-Protokollierung: /server/73319/sftp-logging-is-there-a-way

Dalvenjia
quelle
1
Während dies theoretisch die Frage beantworten kann, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Mir ist auch klar, dass es sich um eine andere SE-Site handelt, und ich habe eine der A'ers geschrieben, aber wir möchten, dass Inhalte, wenn möglich, freistehend sind.
slm
-1

Wenn Sie den Pfad und den Namen kennen, können Sie dies tun

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

Sie haben jedoch keine derartigen Informationen hinzugefügt.

Anzeigename
quelle