
Grundsätzlich möchte ich jede einzelne Datei protokollieren, die über SCP auf dem Server gesendet oder empfangen wird.
Angenommen, ein Benutzer führt einen SCP von Server-1 zu Server-2 durch. Ich habe herausgefunden, wie man Protokolle auf der Absenderseite erhält.aber wie gelangt das Übertragene auf die Empfängerseite?
Ich möchte, dass die Protokolle auf der Empfängerseite die Namen der Dateien enthalten, die über SCP an ihn übertragen werden.
Um Protokolle auf der Absenderseite zu erhalten, verwende ich außerdem mein Bash-Skript, das zuerst den Dateinamen in einer Protokolldatei speichert und diese dann mit SCP überträgt. Gibt es dafür einen besseren Ansatz?
Vielen Dank im Voraus für alle Vorschläge.
Antwort1
Ich habe gerade eine interessante Lösung gefunden, die andere vielleicht interessiert:
Bei der Verwendung scp
wird mit dem Flag auch die Binärdatei auf dem Server aufgerufen -f
. Das bedeutet, dass man einen einfachen Wrapper für die Serverseite schreiben kann scp
, etwa so:
Ändern Sie zuerst scp
den Namen Ihres Originals:
mv /usr/bin/scp /usr/bin/scp-org
Erstellen Sie dann ein einfaches Skript in seinem Namen:
sudo nano /usr/bin/scp
mit dem Inhalt:
#/bin/bash
scp-org $@ | tee >(grep -aEo "[CD][0-7]{4} [0-9]* .*$" --line-buffered >> /var/log/scp.log)
Dies könnte natürlich noch verfeinert werden, aber es funktioniert als Beispiel. Sie können jetzt tail -f /var/log/scp.log
alle übertragenen Dateien in Echtzeit verwenden und sehen
Antwort2
Sie können versuchen, den scp
Befehl auf dem Server durch eine geänderte Version zu ersetzen, die Ihren Anforderungen entspricht. scp
ist ein sehr einfaches Programm und das Hinzufügen von Protokollierungscode sollte keine große Aufgabe sein.
Antwort3
Sie verwenden wahrscheinlich das Softwarepaket OpenSSH. Das OpenSSH- scp
Dienstprogramm protokolliert nichts. Es unterstützt die Debugausgabe für die zugrunde liegende SSH-Sitzung, protokolliert jedoch nicht die tatsächlich stattfindenden Dateiübertragungen.
Ebenso kann der OpenSSH-Server so eingestellt werden, dass er Details seiner Aktivitäten protokolliert oder die Tatsache protokolliert, dass ein Benutzer eine Verbindung hergestellt und ausgeführt hat; scp
die tatsächlich stattfindenden Dateiübertragungen werden jedoch nicht protokolliert.
Wenn Sie diese Benutzer nicht dazu bringen können, stattdessen SFTP zu verwenden, stehen Ihnen drei Ansätze zur Verfügung:
Untersuchen Sie alternative (also kommerzielle) SSH/SFTP/SCP-Server. Diese sollten grundsätzlich die Protokollierung von Dateiübertragungen unterstützen.
Ersetzen Sie das
scp
Dienstprogramm auf dem Server durch eines, das die gewünschten Daten protokolliert. OpenSSH ist Open Source. Jemand, der weiß, wie man in C für Unix programmiert, könnteLaden Sie die Quelle herunterund ändern Sie es.Ersetzen Sie das
scp
Dienstprogramm durch einen „Wrapper“, der das ursprüngliche scp-Programm startet und überwacht, was es tut. Es gibt Debugging-Tools für Unix, die überwachen können, was ein anderer Prozess tut.
Ich musste einmal Transfers protokollieren scp
und habe den dritten Ansatz verwendet. Ich habe ein Perl-Skript geschrieben, das das ursprüngliche scp-Programm unterstrace. Strace würde die Namen der Dateien ausgeben, die vom scp-Prozess geöffnet und geschlossen werden. Das Perl-Skript analysierte die Strace-Ausgabe und fand heraus, welche Dateien übertragen wurden.
Antwort4
Ich bin davon überzeugt, dass die Lösungen, die einen Wrapper um die Binärdatei auf dem Server vorschlagen, bei neueren Clients scp
nicht funktionieren werden .scp
Since OpenSSH 8.8 (8.7 in Red Hat/Fedora builds), scp has use the SFTP protocol for transfers by default.
Bei solchen neueren Clients scp
funktioniert dieser Mechanismus zum Umschließen auf dem Server nur, wenn der Client scp
mit dem -O
Flag aufgerufen wird (um das alte Protokoll durchzusetzen).
Für solche Zwecke könnte vielleicht die Verwendung rsync
von anstelle von scp
hilfreich sein? rsync
scheint die Möglichkeit zu haben, Dateizugriffe zu protokollieren: aus der rsyncd.conf
Manpage:
log format
This parameter allows you to specify the format used for logging file transfers when transfer logging is enabled.
[..]
%f the filename (long form on sender; no trailing lq/rq)