Jörg: rsync und Dateirechte

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

  1. 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

    --
    I � Unicode
    1. 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

      1. 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

        --
        I � Unicode
        1. 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

          1. Schade, Sudo Rechte hast du nicht, oder?
            Dann bin ich raus, da bleibt dir evtl. nur eine Anfrage beim Support.

            Gruß Fred

            --
            I � Unicode
            1. 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.

              1. 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

                --
                I � Unicode
                1. 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
                  
                  1. 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

  2. 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

    • --chmod
    • --owner
    • --group
    • --acls
    • --perms
    • den ganzen Rest
    1. 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

      1. 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.

        1. 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?

          1. 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.

          2. 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

          1. 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/

            1. 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

              1. 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…

            1. 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

  3. 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

    1. 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

      1. 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.

        1. 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.

          1. 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"…

            1. 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
              
              • Den aktuellen Pfad mittels Punkt anzugeben (find . -type d) ist hyperliquid.
              • Die Fundstelle einfach mit -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.
              • Weil das bei vielen Funden auch nicht reicht geht man den Umweg über … -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.

              1. 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

                1. 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

                  1. 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.

                    1. 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

                      1. 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.

                        1. 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. 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.

                2. 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.