shell: keine Rechte trotz root?!

webdepp

New Member
Folgendes Script (/usr/local/bin/test.sh) führe ich per ssh als root aus:
Code:
#!/bin/sh

find /var/spool/mail -wholename "*/Maildir/.Spamverdacht/cur*," -type f > /tmp/sa-learn.lst
sa-learn --spam -f /tmp/sa-learn.lst >/var/log/sa-learn.log

    exit 0
Und es funktioniert. Aber sobald ich
Code:
/tmp/sa-learn.lst > rm xargs rm -v -f -r
vor's Exit einfüge, kriege ich folgende Fehlermeldung (auszugsweise, Pro Datei ein Fehler - is klar, wa?!):
HTML:
/tmp/sa-learn.lst: line 155: /var/spool/mail/domain.com/t-xxxxx/Maildir/.SPAM-Learn/cur/1222184076.M930177P8169V0000000000000901I00668402_113.h744429,S=2466:2,: Permission denied

Zeitglich hat er mir in /usr/local/bin eine Datei 'rm' angelegt - dich ich ebenfalls nicht löschen kann. Als root, weder im WinSCP noch per Putty.
(rm rm liefert zwar keinen Fehler, die Datei wird aber nicht gelöscht)

  1. Watt'n nu los? Ist die Pipe falsch? Berechtigungen ? Irgendwas anderes, das mir bei diesem meinem ersten Perl-Script überhaupt nicht in den Sinn kommt ?
  2. Und wieso darf ich nicht löschen? Ich führe das Script doch als root aus. Die Mail-Dateien selber gehören User 'exim' in der Gruppe 'root' mit chmod 644. Aber als root bin ich doch
  3. Und was soll diese rm-datei? Ich will löschen, nicht neue Dateien schreiben ;) Wie mach ich das Ding nu wieder weg ?

Vielleicht könnte mich jemand erleuchten?

Gruß, Tobi
 
Zu 1. Ja, die Pipe ist falsch, sie muss so aussehen (und es ist auch kein Perl- sondern ein Shell-Script ;) )
Code:
xargs rm -v -f -r < /tmp/sa-learn.lst

Zu 2. Bist Du wirklich root? Was sagt der Befehl 'id'? Wie sehen die File Attributes (-> lsattr) in den Verzeichnis aus?

Zu 3. In der ursprünglichen Version versuchst Du die Daten-Datei /tmp/sa-learn.lst auszuführen (obwohl sie keine execute-Rechte hat), was zu einem permission denied-Fehler führt. Die Standardausgabe wird dabei in die Datei rm umgelenkt. Dadurch entsteht eine leere Datei 'rm'. Wenn die Attribute des Verzeichnisses es zulassen kannst Du sie auch wieder löschen.
 
  1. Zu 1. Ja, die Pipe ist falsch, sie muss so aussehen (und es ist auch kein Perl- sondern ein Shell-Script ;) )

    Jo, meinte ich auch, mein Fehler. Wobei, nur ein halber Fehler. Perl kann ich auch nicht ;)
    Danke auf jeden Fall für die Pipe!
  2. Bevor ich lange Texte schreibe - ein paar kleiner Auszug der aktualisierten Datei test.sh, die da sagt
    Code:
    #!/bin/sh
    
    find /var/spool/mail -wholename "*/Maildir/.SPAM-Learn/cur*," -type f > /tmp/sa-learn.lst
    sa-learn --spam -f /tmp/sa-learn.lst >/var/log/sa-learn.log
    xargs rm -v -f -r < /tmp/sa-learn.lst
    id
    exit 0

    Ich finde zwar Log-Datei-Auszüge & Co ätzend, aber ihr seht wahrscheinlich am meisten draus. Ich hab versucht, alles wesentliche zusammenzufassen.
    Distri = Suse 10.2, falls wider Erwarten relevant

    Code:
    srv:/usr/local/bin # id
    uid=0(root) gid=0(root) groups=0(root)
    
    srv:/usr/local/bin # /usr/local/bin/test.sh 
    uid=0(root) gid=0(root) groups=0(root)
    
    srv:/usr/local/bin # lsattr
    ------------- ./rm
    ------------- ./test.sh
    ------------- ./sa-learn-courier.sh
    
    srv:/usr/local/bin # ls -l
    total 8
    -rwxr-xr-x 1 root root   0 Sep 23 16:47 rm
    -rwxr-xr-x 1 root root 315 Sep 23 14:15 sa-learn-courier.sh
    -rwxr-xr-x 1 root root 224 Sep 23 20:21 test.sh
    [ANMERKUNG: Es sind 3 ?]
    
    srv:/usr/local/bin # ls -l /var/spool/mail/domain.com/t-xxxx/Maildir/.SPAM-Learn/cur
    total 16 [ANMERKUNG: Da sind nur 4 Mails drin?!]
    -rw-r--r-- 1 exim root 1897 Sep 23 16:37 1222181182.M434370P32442V0000000000000901I0066824E_17.srv,S=1897:2,
    [ANMERKUNG: Dann noch 3 weitere Mail-Files, genauso]
    
    srv:/usr/local/bin # lsattr /var/spool/mail/domain.com/t-xxxx/Maildir/.SPAM-Learn/cur
    ------------- /var/spool/mail/zfka.com/t-mueller/Maildir/.SPAM-Learn/cur/1222181182.M434370P32442V0000000000000901I0066824E_17.h744429,S=1897:2,
    [ANMERKUNG: Dann noch 3 weitere Mail-Files, genauso]
    
    srv:/usr/local/bin # ls -l /var/spool/mail/domain.com/t-xxxx/Maildir/.SPAM-Learn/cur
    total 16 [ANMERKUNG: siehe oben - 4 mails]
    -rw-r--r-- 1 exim root 1897 Sep 23 16:37 1222181182.M434370P32442V0000000000000901I0066824E_17.srv,S=1897:2,
    [ANMERKUNG: Wieder 3 weitere. Der Ordner 'cur' selber hat die Rechte rwxr--r--, Benutzer exim, Gruppe root]


    Frage: Dein lsattr. Häää ?? Der macht doch gar nix, außer eben die diversen "Minusse" vor dem Dateinamen - habe deshalb mal freizügis ein ls -l hinzugefügt

  3. Wenn die Attribute des Verzeichnisses es zulassen kannst Du sie auch wieder löschen.

    OK. Was mach ich falsch?

    Code:
    srv:/usr/local/bin # ls -l
    total 8
    -rwxr-xr-x 1 root root   0 Sep 23 16:47 rm
    -rwxr-xr-x 1 root root 315 Sep 23 14:15 sa-learn-courier.sh
    -rwxr-xr-x 1 root root 224 Sep 23 20:21 test.sh
    
    srv:/usr/local/bin # cd ..
    srv:/usr/local # ls -l
    srv:/usr/local # ls -l
    total 40
    drwxr-xr-x  2 root root 4096 Sep 23 16:46 bin
    [ANMERKUNG: noch n paar andere Ordner, selbe Rechte/User-bzw. Gruppeneinstellungen]
    
    srv:/usr/local # chown -R root:root bin
    srv:/usr/local # chmod -R 777 bin
    srv:/usr/local # ls -l
    total 40
    drwxrwxrwx  2 root root 4096 Sep 23 16:46 bin
    
    srv:/usr/local # cd bin
    srv:/usr/local/bin # ls -l
    total 8
    -rwxrwxrwx 1 root root   0 Sep 23 16:47 rm
    -rwxrwxrwx 1 root root 315 Sep 23 14:15 sa-learn-courier.sh
    -rwxrwxrwx 1 root root 224 Sep 23 20:21 test.sh
    
    srv:/usr/local/bin # id
    uid=0(root) gid=0(root) groups=0(root)
    
    srv:/usr/local/bin # rm rm
    srv:/usr/local/bin # ls -l
    total 8
    -rwxrwxrwx 1 root root   0 Sep 23 16:47 rm
    -rwxrwxrwx 1 root root 315 Sep 23 14:15 sa-learn-courier.sh
    -rwxrwxrwx 1 root root 224 Sep 23 20:21 test.sh

Danke vielmals für die Hilfe
 
Last edited by a moderator:
Uja. Und ich unbedarfter Fuzzi dachte Pipe = ((Befehl || Datei) zu (Befehl || Datei))

Auch an dich danke. Zukünftig weiß ich, wie ich damit jedenfalls, wie ich Google-Suchen variieren kann.

Aber: Lieg ich falsch, oder ist das ein (Benennungs)Fehler, der vielen unterläuft? Mein ich nämlich, öfters gelesen zu haben.

[EDIT: Der 1. (Tips) Link ist ja geil. Erst nach dem schreiben überflogen. Aber morgen früh, nüchtern und wach ist der richtig gut. Merci]
 
Last edited by a moderator:
Die Redirects und Pipes sind sehr nützich, wenn man weiß, was damit alles möglich ist.

"Named pipes" ist auch ein super Begriff, über den du dich mal informieren kannst.
Damit kann man von einem Programm in ein anderen pipen, auch wenn eins oder beide Programme nur mit Files umgehen können.
 
Jau, werd ich mich mal durchgooglen.

Trotzdem ist mir immer noch nicht klar, wo mein(e) Fehler bzgl. meines Posts von 21:57 Uhr liegen.

Klar, ich bin Blond, aber das kann nicht der Grund sein ;)
Ich dachte, als root darf/kann man alles, unabhängig von den Datei-/Verzeichnisrechten.

Aber: Selbst wenn nicht - bei "Alle dürfen alles", also 777, wirft mir der Hund immer noch Fehler aus. Und ich verstehe nicht warum.

Lösung?
 
Sehe ich da Kommata, ein = und ein : im Dateinamen?
Es wird nichts escaped von xargs - das nimmt es so, wie es in der Datei steht.
Kann sein, dass dir die Shell diese Sonderzeichen übel nimmt.

Wenn es eh ein SPAM-Learn-Ordner ist, dann könntest du den auch mit find und -exec löschen. Oder find und xargs in Kombination mit dem Null-Character-Delimiter.
 
Es wird nichts escaped von xargs

Nee, das war's auch nicht - echo 1222181182.M434370P32442V0000000000000901I0066824E_17.h744429,S=1897:2, gibt den Dateinamen genauso aus wie echo '1222181182.M434370P32442V0000000000000901I0066824E_17.h744429,S=1897:2,
' , also in Anführungszeichen. Und auch ein rm bewirkt nichts.

Und ja, ich könnte das find nochmals machen und anschließend löschen. In der Theorie.
In der Praxis kann ich eben diese Dateien nicht löschen, nicht mal händisch.

Ist das erste mal, dass mir sowas passiert. Sehr komisch.
 
Du darfst das auch nicht mit echo testen. Echo erwartet einen reinen Text und keine Datei.
Teste es mit ls. Das macht einen Unterschied. :)
Code:
ls 1222181182.M434370P32442V0000000000000901I0066824E _17.h744429,S=1897:2
ls '1222181182.M434370P32442V0000000000000901I0066824E _17.h744429,S=1897:2'

Und wie eine Datei korrekt escaped aussehen kann, verrät Dir die TAB-Taste.

huschi.
 
Back
Top