Man kann scp
ganz wunderbar dazu benutzen, um Dateien auf einen anderen Rechner zu übertragen. Allerdings muss man i.d.R. jedes mal das Passwort des Zielbenutzers angeben. Das ist für automatisierte Prozesse ziemlich unpraktisch.
Nun kann man aber auch einen SSH-Key ohne Passphrase erzeugen und diesen auf dem Zielrechner in der authorized_keys
des entsprechenden Nutzers hinterlegen. Dann kann zwar nur derjenige User, der im Besitz des privaten Schlüssels ist, ohne Passwort/Passphrase auf diesen Rechner zugreifen, aber ganz so sicher ist das nicht. Allerdings kann man SSH-Keys auch mit einem sog. „forced Command“ verknüpfen, so dass mit diesem Key nur das definierte Kommando ausgeführt wird, unabhängig davon, was auf der Kommandozeile angegeben wurde. Dies geschieht in der authorized_keys
auf dem Zielrechner, in dem man in der Zeile mit den entspr. Key vor diesem das gewünschte Kommando angibt, i.d.R. mit weiteren nützlichen Parametern:
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="mache_nur_was_ich_will" ssh-rsa AAAAB3NzaC…
Aber wie muss das Kommando auf der Zielseite bei scp nun aussehen? Das lässt sich herausfinden, in dem man ein normalen scp-Befehl mit den Debug-Parameter -v
absetzt. In der Ausgabe findet man u.a. dann so was wie (wenn nicht: siehe unten):
debug1: Sending command: scp -v -t myfile.txt
Hier taucht der undokumentierte scp-Parameter -t auf, der auch nur vom Programm auf der Zielseite verwendet wird. Wenn wir also das folgenden in der authorized_keys
angeben, können wir mit den entspr. Key Dateien in das Verzeichnis /var/local/Backups
kopieren – mehr nicht!
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="scp -t /var/local/Backups/" ssh-rsa AAAAB3NzaC…
Aber das funktioniert nicht …
Es kann passieren, dass die Verbindung zwar aufgebaut wird, danach aber nichts mehr passiert. Die Verbindung „hängt“, es findet keine Datenübertagung statt.
Die Ursache ist, dass scp ab Version 9.0 standardmäßig das SFTP-Protokoll benutzen. Man erkennt es daran, dass in der oben erwähnten Debug-Ausgabe nicht das erwartete scp -v -t …
steht, sondern:
debug1: Sending subsystem: sftp
Man muss scp auf der aufrufenden Seite also mit dem Parameter –O
(großes O) dazu zwingen, das SCP-Protokoll zu verwenden.
Siehe auch: https://serverfault.com/a/88864