rsync und Dateirechte
Jörg
- linux
- webserver
Hallo Forum,
ich sichere meine relevanten Daten von einem Windowsrechner mit darin integriertem Ubuntu über rsync -asv
auf meinen Zielrechner.
Seltsamer- und unerwünschterweise landen alle Verzeichniss und dateien auf dem Zielrechner mit 0777-Rechten.
Wie kann ich verhindern, dass alles als 777er auf dem Zielrechner ankommt, bzw. woran liegt es, dass alle Rechte neu gesetzt werden?
Jörg
Hallo Jörg,
handelt es sich bei dem Zielsystem evtl. um eine USB-SSD Platte mit exFAT Filesystem? Dort wird mit root:root 777 geschrieben. Ich habe meine Platte mit ext4 formatiert.
Gruß Fred
Hallo Jörg,
handelt es sich bei dem Zielsystem evtl. um eine USB-SSD Platte mit exFAT Filesystem? Dort wird mit root:root 777 geschrieben. Ich habe meine Platte mit ext4 formatiert.
Hallo Fred,
das glaube ich eher nicht, aber weiß es auch nicht. Ist auf jeden Fall mein Server bei meinem Provider, insofern gehe ich nicht von einer USB-SSD aus.
Jörg
Hi,
mit der rsync option "a" werden auf jeden Fall die Rechte beibehalten.
Kannst du dir die Platten ansehen, ssh Session zum 'Server und mal "lsblk -f" eingeben...
Fred
Hi,
mit der rsync option "a" werden auf jeden Fall die Rechte beibehalten.
Kannst du dir die Platten ansehen, ssh Session zum 'Server und mal "lsblk -f" eingeben...
Hi Fred,
leider nein.
lsblk: failed to access sysfs directory: /sys/dev/block: Permission denied
Jörg
Schade, Sudo Rechte hast du nicht, oder?
Dann bin ich raus, da bleibt dir evtl. nur eine Anfrage beim Support.
Gruß Fred
Schade, Sudo Rechte hast du nicht, oder?
Dann bin ich raus, da bleibt dir evtl. nur eine Anfrage beim Support.
Nein, Sudo Rechte habe ich nicht. Und der Support sagt einfach nur, es liegt nicht am Server, muss an rsync liegen.
Eins hätte ich noch, diese Datei solltest du lesen können:
cat /etc/fstab
Ich weiß allerdings nicht was genau den Provider dir da anbietet, wie die Platten eingebunden sind etc.
Bei mir behält der rsync alle Rechte
rsync --delete -av SOURCE TARGET
Fred
Hi Fred,
dieser Befehl ergibt:
# /etc/fstab: static file system information.
# TODO: sysfs?
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
/dev/xvda1 / xfs defaults,noatime 0 1
/dev/xvda7 /is/cust xfs noatime,nosuid,gquota,nodev 0 2
/dev/xvda8 /is/ssd xfs defaults,noatime 0 1
# Bindmounts falls vorhanden
/is/cust/htdocs /is/htdocs none bind 0 0
/is/cust/maildirs /is/maildirs none bind 0 0
/is/cust/databases /is/databases none bind 0 0
/is/cust/trash /is/trash none bind 0 0
/var/log/httpd /is/logs/httpd none bind 0 0
# End of fstab
Auf welches Gerät Du schreibst erfährst Du, wenn Du in einer ssh-Sitzung in das betreffende Verzeichnis wechselst und dann mal df -h .
(Achte auch den Punkt und die Leerzeichen eintippst… df -h /Dein/Verzeichnis
geht auch, wenn Du Dich nicht blöd stellst und das zu ändernde änderst.
Wichtiger und zielführend ist aber vorhersehbar das hier:
https://forum.selfhtml.org/self/2022/aug/15/rsync-und-dateirechte/1801191#m1801191
Hm.
von einem Windowsrechner mit darin integriertem Ubuntu
Naja. Windows, integriertes Linux ... was weiß das über Unix-Benutzer und deren Rechte?
Aus dem Manual:
-copy-as=USER[:GROUP] specify user & optional group for the copy
Und lies dort (man rsync
) bitte auch bei
Hallo Willi,
von einem Windowsrechner mit darin integriertem Ubuntu
Naja. Windows, integriertes Linux ... was weiß das über Unix-Benutzer und deren Rechte?
Ja, das scheint mir der Punkt zu sein.
Ich habe mir mal als Beispiel eine TCPDF-Version oder einen Clon davon (weiß nicht mehr) heruntergeladen, es ausgepackt und dann ls -al
ausgeführt und siehe da:
drwxrwxrwx 1 me me 512 Aug 14 10:39 .
drwxrwxrwx 1 me me 512 Apr 20 10:21 ..
-rwxrwxrwx 1 me me 119640 Jul 5 2021 CHANGELOG.TXT
-rwxrwxrwx 1 me me 43682 Jul 5 2021 LICENSE.TXT
-rwxrwxrwx 1 me me 4888 Jul 5 2021 README.md
-rwxrwxrwx 1 me me 6 Jul 5 2021 VERSION
-rwxrwxrwx 1 me me 1052 Jul 5 2021 composer.json
drwxrwxrwx 1 me me 512 Jul 5 2021 config
drwxrwxrwx 1 me me 512 Jul 5 2021 examples
drwxrwxrwx 1 me me 512 Jul 5 2021 fonts
drwxrwxrwx 1 me me 512 Jul 5 2021 include
-rwxrwxrwx 1 me me 901920 Jul 5 2021 tcpdf.php
-rwxrwxrwx 1 me me 7155 Jul 5 2021 tcpdf_autoconfig.php
-rwxrwxrwx 1 me me 73306 Jul 5 2021 tcpdf_barcodes_1d.php
-rwxrwxrwx 1 me me 14666 Jul 5 2021 tcpdf_barcodes_2d.php
-rwxrwxrwx 1 me me 3325 Jul 5 2021 tcpdf_import.php
-rwxrwxrwx 1 me me 27600 Jul 5 2021 tcpdf_parser.php
drwxrwxrwx 1 me me 512 Jul 5 2021 tools
Soll heißen, mein Ubuntu erkennt überall 0777, folglich macht rsync schonmal alles richtig.
Ich fürchte, dass mein Ubuntu im Windowsrechner da nicht ganz sauber arbeitet, kann das sein?
Und noch wichtiger: Was tun?
Jörg
Ich fürchte, dass mein Ubuntu im Windowsrechner da nicht ganz sauber arbeitet, kann das sein?
Da wird nur versucht, Linux-Binarys direkt unter Windows, alos ohne Virtualisierung auszuführen. Du kannst nicht erwarten, dass das perfekt geht, die Programme laufen gerade so ohne abzustürzen, von solchen gelieferte Systeminformationen sind regelmäßig falsch.
Und noch wichtiger: Was tun?
wsl:> rsync -avu --owner $OWNER_ON_SERVER --group $GROUP_ON_SERVER --perms 750
Das sollte beim Transfer die User, Gruppe, Rechte auf dem Server setzen. Doch das reicht nicht:
Starte danach in einer ssh-Sitzung auf dem Server ETWAS WIE
user@server:~> cd $DEIN_DIR; find -type f -fprint0 | xargs -0 chmod 640
also:
wsl:> ssh $USER@$SERVER "cd $DEIN_DIR; find -type f -fprint0 | xargs -0 chmod 640"
Das findet alle normalen Dateien, gibt diese als mit NULL-Byte getrennte Liste aus und schickt diese zu xarg, auf das dieses die Rechte für Dateien wie gezeigt setze.
Anpassungen nach Deinen Anforderungen... Die mit „$“ beginnenden „Variablen“ musst Du ersetzen.
Hallo Willi,
danke für Deinen Vorschlag, den ich aber nicht so ganz kapiere. Dazu reichen einfach meine Linuxkenntnisse nicht.
Ich dachte selber schonmal an Folgendes als Lösungsalternativen, kannst Du dazu mal was sagen?
Ich könnte über die --chmod-Option von rsync gehen und alles so setzen, wie ichs gerne hätte. Mein Problem hierbei ist, dass es mir sehr gut gelingt, z.b. alles auf 755 zu setzen. Aber ich schaffs nihct, alles auf 755, außer dem Verzeichniss XY, welches ich gerne auf 777 hätte.
Ich könnte alle Rechte serverseitig so setzen, wie ichs gerne hätte und rsync anweisen, die Datei- und Verzeichnisrechte auf dem Server unangetastet zu lassen. Hier ist mien Problem dann aber, dass ich nicht weiß, was rsync dann mit neuen Dateien macht, die der Server bisher gar nicht kennt.
Findest Du meine Lösungsvorschläge abwegig oder sind die brauchbar?
Jörg
Mein Problem hierbei ist, dass es mir sehr gut gelingt, z.b. alles auf 755 zu setzen. Aber ich schaffs nihct, alles auf 755, außer dem Verzeichniss XY, welches ich gerne auf 777 hätte.
Zweimal rsync. Einmal exkludierst Du das Verzeichniss, einmal exkludierst Du alle anderen und inkludierst ´dann das oder die bestimmten.
Siehe auch:
https://code.fastix.org/Projekte/Linux%2Cbash%3APlatzsparendes nächtliches Backup/
Zweimal rsync. Einmal exkludierst Du das Verzeichniss, einmal exkludierst Du alle anderen und inkludierst ´dann das oder die bestimmten.
Gute Idee. (danke für den Link, das les ich mir durch) Ich dachte, man müsste das zwingend in einem einzigen Befehl unterbringen.
Sag mal, findest Du denn Lösungsvorschlag 1 oder 2 besser?
Soll heißen, was ist hier sinnvoller?
Jörg
Sag mal, findest Du denn Lösungsvorschlag 1 oder 2 besser?
Es ist nicht besonders innvoll, wenn ich jetzt alle Optionen durchgehe (manche sind bei rsync „schnelle“ Kombinationsoptionen) und mir anschaue, was das macht, weil ich die Voraussetzungen und das Ziel einfach nicht genau kenne.
Aber wenn das Ergebnis Deinen Wünschen entspricht…
- Ich könnte alle Rechte serverseitig so setzen, wie ichs gerne hätte und rsync anweisen, die Datei- und Verzeichnisrechte auf dem Server unangetastet zu lassen. Hier ist mien Problem dann aber, dass ich nicht weiß, was rsync dann mit neuen Dateien macht, die der Server bisher gar nicht kennt.
zu 2.:
rsync -rltgoDsv --chmod=ugo=rwX
oder auch
rsync -asv --no-p --chmod=ugo=rwX
scheinen genau das zu machen, was ich in Punkt 2 ansprach.
Dateirechte des Servers werden beibehalten und neue Dateien erhalten ein 755.
Jörg
Hallo,
ich habe herausgefunden, dass ich, wenn ich alle Verzeichnisse, außer einem Ordner XY auf 755 stellen möchte, folgenden Befehl verwenden kann.
find . -type d \( -path ./myXYverz \) -prune -o -exec chmod 750 {} \;
Dazu habe ich eine Frage:
Kann ich auch mehrere Verzeichnisse dort angeben, die ich gerne ausgenommen hätte?
Jörg
Dazu habe ich eine Frage:
Kann ich auch mehrere Verzeichnisse dort angeben, die ich gerne ausgenommen hätte?
find . -type d \( -path ./myXYverz ! -path ./myVerzABC ! -path ./myVerz123 \) -prune -o -exec chmod 750 {} \;
Geht das so?
Edit: Nö, klappt nicht. 😕
Jörg
Geht das so?
Edit: Nö, klappt nicht. 😕
Und leider hats auch auf diese Art nicht funktioniert.
find . -type d \( -path ./Verz1 -o -path ./Verz2/Verz2a -o -path ./Verz3 \) -prune -o -exec chmod 750 {} \;
Wenn ich nur ein Verzeichnis ausschließe, dann wird das berücksichtigt. Bei mehreren Verzeichnissen wird gleich gar keines mehr berücksichtigt.
Und leider hats auch auf diese Art nicht funktioniert.
find . -type d \( -path ./Verz1 -o -path ./Verz2/Verz2a -o -path ./Verz3 \) -prune -o -exec chmod 750 {} \;
Oops, hat doch funktioniert. Ich hatte einen verzeichnisfehler drin, deshalb habe ich natürlich beim falschen Verzeichnis nach den Rechten geschaut.
Habe aber trotzdem noch eine Frage:
Kann ich die Verzeichnisse vom chmod-Befehl so unangetastet lkassen, aber die darin enthaltenen Dateien trotzdem "chmodden"? ich weiß, dass es geht, weil ich habe es in meiner Recherche irgendwo gelesen. Aber ich finde es nicht mehr.
Kann ich die Verzeichnisse vom chmod-Befehl so unangetastet lkassen, aber die darin enthaltenen Dateien trotzdem "chmodden"?
Statt "find . -type d" gibt es auch "find . -type f"…
Statt "find . -type d" gibt es auch "find . -type f"…
Ja. Auch ich hatte einen Typo drin.
@Jörg:
find -type f -print0 | xargs -0 chmod 640
find -type d -print0 | xargs -0 chmod 750
find . -type d
) ist hyperliquid.-exec chmod 750 {}
zu behandeln ist falsch, weil Dateinamen alle möglichen Zeichen enthalten können. Ist ein Leerzeichen oder tab drin schlägt das fehl. Mindestens -exec chmod 750 "{}"
angeben.… -print0 | xargs -0 …
. Damit bist Du sicher.Wenn Du Pfade haben willst:
find /pfad -type f -print0 | xargs -0 chmod 640
find /pfad -type d -print0 | xargs -0 chmod 750
Was mir unklar ist: Warum machst Du es kompliziert, wenn Du doch selbst zum Ausdruck bringst, dass Deine Linux-Kenntnisse „eher mittel“ sind? Machs einfach statt schwierig.
Hallo Willi,
Was mir unklar ist: Warum machst Du es kompliziert, wenn Du doch selbst zum Ausdruck bringst, dass Deine Linux-Kenntnisse „eher mittel“ sind? Machs einfach statt schwierig.
Mittel? 😂
Themenwechsel. 😇
Statt "find . -type d" gibt es auch "find . -type f"…
Ja, an dieser Stelle auch noch schnell ein dank an den "Mitleser".
Wenn Du Pfade haben willst:
find /pfad -type f -print0 | xargs -0 chmod 640 find /pfad -type d -print0 | xargs -0 chmod 750
Soll heißen, Dein befehl macht dasselbe wie "mein" -exec chmod 750 {} ?
Falls ja, dann hab ich das soeben erst verstanden (oder besser: bemerkt).
Gruß+Dank,
Jörg
Hi nochmal,
Wenn ich doch nun alles auf dem Server auf 777 stelle, anschließend alle dateien auf 640 und alle verzeichnisse (bis auf 3 Ausnahmen) auf 750, dann dürfte ich doch nicht mehr einen "error WriteBlob using ImageMagick" erhalten, wenn genau dieses verzeichnis, in das ImageMagick schreiben will, innerhalb ,meiner Ausnahmen war??
Auch mein FTP-Programm zeigt mir an, dass das Verzeichnis auf 777 steht (und ja, ich weiß, dass ich das im FTP-Programm bei mir immer erst aktuallisieren muss, weil es mir sonst Cache-Mist anzeigt).
Selbst ein Update auf 777 des verzeichnisses vermeidet den Write-Fehler nihct.
Erst wenn ich über SSH chmod -R 777 auf das Verzeichnis ansetze, klappt es.
Wo ist hier der Fehler? Sowohl über FTP als auch SSH gehe ich mit demselben User rein.
Jörg
Rechte an einem Verzeichnis:
r - read : Verzeichnisinhalt (Namen und Eigenschaften von Dateien, direkten Unterverzeichnissen und anderen Dateisystemobjekten) im Verzeichnis lesen. Voraussetzung für w.
w - write : Dateien, direkte Unterverzeichnissen und anderen Dateisystemobjekte im Verzeichnis anlegen, löschen, umbenennen.
x - (betreten) : Verzeichnis betreten, Voraussetzung für r und w.
Rechte an einer normalen Datei:
r - read : Inhalt lesen. Voraussetzung für w und x.
w - write : Dateien schreiben.
x - (betreten) : Datei als Programm ausführen.
Ich vermute, wer oder was auch immer ImageMagick gestartet hat (user www-run
?), hat nicht das Recht (in) die Datei zu schreiben.
Ich vermute, wer oder was auch immer ImageMagick gestartet hat (user
www-run
?), hat nicht das Recht (in) die Datei zu schreiben.
Und er erhält sie, wenn ich mit demselben User, der ohnehin schon die 777 Rechte gesetzt hatte, diese nochmal setze? Denn danach funktioniert es ja.
Na egal, ich habe mir jetzt ein Shell(oder Bash?)script geschrieben, was für alle relevanten Verzeichnisse diese Prozedur durchführt, da macht es dann auch nichts, die Rechte für diesen (für Imagick) wichtigen Uploadordner 2 mal zu setzen.
Kann man sicher schöner machen, aber es funktioniert. 😀
#!/bin/sh
myAlles=('Verz1' 'Verz2' 'Verz3')
for myVerz in "${myAlles[@]}"
do
printf "Wechsle in das Verzeichnis: $myVerz\n\n"
#Verzeichniswechsel
cd $myVerz
#chmod komplettes Verzeichnis
chmod -R 777 ./
#Alle Dateien anschließend auf 640 setzen
find -type f -print0 | xargs -0 chmod 640
#Alle Verzeichnisse (bis auf Ausnahmen) auf 750 setzen
find \( -path "./Exclude1" -o -path "./Exclude2/temp" -o -path "./Exclude3/temp2" -o -path "./Exclude4" \) -prune -o -type d -print0 | xargs -0 chmod 750
# Exclude4-Verzeichnis nochmal auf 777 setzen
chmod -R 777 ./Exclude4
# Zurück auf obere Ebene
cd ..
done
Jörg
Ich vermute, wer oder was auch immer ImageMagick gestartet hat (user
www-run
?), hat nicht das Recht (in) die Datei zu schreiben.Und er erhält sie, wenn ich mit demselben User, der ohnehin schon die 777 Rechte gesetzt hatte, diese nochmal setze? Denn danach funktioniert es ja.
Das kann so nicht sein. Was da stattfindet und was Du vermutest sind 2 Paar Schuhe. Verschiedenfarbige übrigens.
Das kann so nicht sein. Was da stattfindet und was Du vermutest sind 2 Paar Schuhe. Verschiedenfarbige übrigens.
Guten Morgen, Willi.
ich vermute nichts, ich beschreibe nur. Schau Dir mein Bashscript an.
Ohne die Zeile:
# Exclude4-Verzeichnis nochmal auf 777 setzen
chmod -R 777 ./Exclude4
erhalteb ich den ImageMagick-Fehler, mit der zeile nicht.
Logisch ist anders, hm? 😉
1. Kontrolliere bitte, was Dein Skript macht.
#Alle Dateien anschließend auf 640 setzen
find -type f -print0 | xargs -0 -r -t chmod 640
#Alle Verzeichnisse (bis auf Ausnahmen) auf 750 setzen
find \( -path "./Exclude1" -o -path "./Exclude2/temp" -o -path "./Exclude3/temp2" -o -path "./Exclude4" \) -prune -o -type d -print0 | xargs -r -t -0 chmod 750
Die hinzugefügten Optionen für xargs
sind:
-r
: Starte den Befehl nicht, wenn String leer ist.-t
: Gib den Befehl mit dem Argument aus.1.a (Alternative)
Um wirklich alle ausgeführten Befehle zu sehen, setze
set -x
als Zeile nach der Shebang. Was das ist folgt:
2. Wie (zum Teufel!) startest Du das Skript eigentlich?
Mit der Shebang
#!/bin/sh
und direkt gestartet wirft es den Fehler, dass in Zeile 3, die da lautet:
myAlles=('Verz1' 'Verz2' 'Verz3')
ein Syntaxfehler sei und beendet sich. Das ist auch richtig, weil die „Urshell“ (/usr/bin/sh
) tatsächlich „keine Arrays kann“.
Die „Shebang“ muss also #!/usr/bin/bash
lauten.
Soll heißen, Dein befehl macht dasselbe wie "mein" -exec chmod 750 {} ?
Er hat das selbe Ziel und macht es auch dann, wenn Dein Befehl versagt.