
Ich automatisiere die Dateiübertragung über SFTP und stecke fest, als ich den Dateieigentümer im Remote-Host ändere. Das Problem ist, dass SFTPs chown
und chgrp
Befehle nur numerische UIDs/GIDs akzeptieren, die im Voraus nicht bekannt sind. Das erwartete Szenario für meine Automatisierung ist, dass der Benutzer Dateiziele sowie Benutzernamen und Gruppennamen in Zeichenfolgen angibt.
Gibt es eine Möglichkeit, die numerische UID/GID über die SFTP-Sitzung aus dem String-Benutzer-/Gruppennamen im Remote-Host abzufragen?
Eine einfache Problemumgehung wäre, eine zusätzliche SSH-Sitzung zu öffnen und normale Shells chown
und chgrp
Befehle zu verwenden. Aber das Unternehmen, in dem ich arbeite, verwendet zeitgesteuerte Token zur Authentifizierung, und kurz gesagt bedeutet eine zusätzliche Sitzung zusätzliche 30 Sekunden pro Host, was bei Batch-Installationen nicht funktioniert.
Schwieriger wäre es, ls -l
Verzeichnisse, vielleicht Dateien, zu durchsuchen, eines mit den erforderlichen Anmeldeinformationen zu finden und dann ls -n
die numerische Version abzurufen. Dies birgt jedoch das Risiko, dass es zu lange dauert, keine geeigneten Verzeichnisse/Dateien gefunden werden oder sogar hängen bleibt, wenn ein Verzeichnis zu viele Dateien enthält, um zu ls
funktionieren ...
Antwort1
Es ist nicht möglich.
Zumindest nicht mit der weit verbreiteten SFTP-Version 3.
Antwort2
Eine einfache Problemumgehung wäre, eine zusätzliche SSH-Sitzung zu öffnen und normale Shells
chown
undchgrp
Befehle zu verwenden. Aber das Unternehmen, in dem ich arbeite, verwendet zeitgesteuerte Token zur Authentifizierung und kurz gesagt bedeutet eine zusätzliche Sitzung zusätzliche 30 Sekunden pro Host, was bei Batch-Installationen nicht funktioniert.
Mit -o ControlMaster=
und -o ControlPath=
können Sie mehrere Sitzungen über eine einzige Netzwerkverbindung gemeinsam nutzen (siehe man 5 ssh_config
). Die Kurzoptionen für ssh
sind -M
bzw. -S
(sieheman 1 ssh
). Dieser Ansatz erfordert eine Authentifizierungeinmal. sftp
von OpenSSH unterstützt -o
und kann eine Verbindung mit teilen ssh
.
Das Verfahren:
ssh -Nf -o ControlMaster=yes -o ControlPath=… user@server
. Die Master-Verbindung. Hier authentifizieren Sie sich, bevor die Verbindung in den Hintergrund geht.ssh -o ControlPath=… …
und/odersftp -o ControlPath=… …
und/oder sogarsshfs
(siehe unten). Solange Sie bei der gewählten Steuerbuchse bleiben (ControlPath
) und die Master-Verbindung funktioniert, werden diese Befehle diese verwenden. Viel Spaß.Sie können es beispielsweise ausführen
uid="$(ssh … "id -u someuser")"
und$uid
später in Ihrem Skript verwenden.Zum Schluss
ssh -o ControlPath=… -O exit …
beenden Sie die Master-Verbindung.
Meine anderen Antworten, die nützlich sein könnten:
- Antworten Sie mit einem Skript, das sicher ein temporäres Verzeichnis für den Control-Socket erstellt.
- Verwendung
sshfs
mit gemeinsam genutzter SteuerbuchseDie Antwort enthält einen interessanten Hinweis zu Platzhaltern. - Über
sshfs
im Allgemeinen.