Remote-SFTP-Verzeichnisse ohne Schreibberechtigung rekursiv kopieren (lokal)

Remote-SFTP-Verzeichnisse ohne Schreibberechtigung rekursiv kopieren (lokal)

Ich sehe viele Fragen hierzu, aber nicht alle meine Einschränkungen. Deshalb beginne ich mit meinen Einschränkungen.

Einschränkungen:

  • Ich möchte ein Remote-Verzeichnis rekursiv kopieren.
  • Ich kann die Einrichtung des Remote-Servers überhaupt nicht steuern.
  • Ich habe keine Schreibberechtigung für dieses Verzeichnis auf dem Remotecomputer.
  • Wenn ich es versuche get -r, wird das Verzeichnis kopiertohne lokaleSchreibberechtigungen auch nicht.
  • Wenn dann versucht wird, verschachtelte Dateien und Ordner im Remote-Verzeichnis rekursiv zu kopieren, wird ein Fehler in derlokalVerzeichnis, für das ich keine Schreibberechtigung hatte.
  • Ich kann keine neue Software auf meinem Rechner installieren. (brauche eine reine sftpLösung mit „OpenSSH_7.9p1, LibreSSL 2.7.3“)

Frage:

Kann ich die Remote-Verzeichnisse rekursiv kopieren mit pure sftpund nolokalBerechtigungsfehler?

Antwort1

AKTUALISIEREN: OpenSSH 8.5 veröffentlicht 2021-03 behebt dieses Problem; siehehttp://www.openssh.com/txt/release-8.5unter Bugfixes der Eintrag für bz#3222.

Abgesehen davon: OpenSSH 7.9 wurde 2018-10 veröffentlicht; es kann nicht „vor ~5 Jahren auf [einem] Mac erschienen sein“. Sie wurden irgendwie aktualisiert.

Sie haben Recht; download_dir_internalin sftp-client.cerstellt ein neues lokales Verzeichnis mit den gleichen Berechtigungen wie das Remote-Verzeichnis, sofern verfügbar, außer maskiert durch 01777 – d. h. mit Ausnahme von suid und sgid, die ziemlich selten sind und in Ihrem Fall sehr wahrscheinlich nicht vorkommen. Das Flag -p(oder -P) wird benötigt, um Berechtigungen fürDateienwird aber für Verzeichnisse ignoriert.

Wenn das Verzeichnis jedoch bereits existiert, ignoriert sftp den EEXIST-Fehler. Wenn Sie also zuerst alle (leeren) Verzeichnisse erstellenmitSchreibberechtigungen und dann get -rsollte es funktionieren. Ich sehe keine Möglichkeit in SFTP,Listerekursiv, wenn Sie also nicht bereits die Verzeichnisstruktur kennen oder über eine Möglichkeit verfügen, so etwas find /mydir -type dauf der Fernbedienung auszuführen, wird dies etwas hässlich:

#!/bin/bash     # or other location as necessary
REMOTE=(user@host) # array so can add _separated_ options like -i idfile -P port if needed
IFS=$'\n'
all=( )
new=( $( echo ls -n | sftp ${REMOTE[@]} | awk '/^d/{print substr($0,57)}' ) )
while [[ ${#new[@]} -gt 0 ]]; do
        all+=( "${new[@]}" )
        new=( $( printf "ls -n %s\n" "${new[@]}" \
            | sftp ${REMOTE[@]} | awk '/^d/{print substr($0,57)}' ) )
done
mkdir "${all[@]}" # with umask NOT including 200!
# or if (maybe) large enough to hit ARG_MAX
printf '%s\n' "${all[@]}" | xargs mkdir
# if dirnames (can) contain any SP TAB " ' \
# use -d'\n' on GNU but you're on your own otherwise 
# (and Macs mostly don't have GNU)

(Nicht auf dem Mac getestet, da ich keinen habe, aber ich glaube, dass alles hier portabel ist, sofern nicht anders angegeben.)

verwandte Informationen