Gerdchen03
Anmeldungsdatum: 25. Februar 2011
Beiträge: 78
|
Hallo, ich bin dabei ein Backup- und Restore-Skript als Shell-Skript für ein Linuxgerät zu schreiben. Es gibt auf diesem Gerät User-profile, die z.T. mit chattr +i vor Manipulation geschützt sind, zum Teil nicht. Das Backup-Skript soll nun die Dateien mit der Endung .prf finden und der Reihe nach den Status der Attribute checken. Das passende Attribut wird gecheckt mit:
"if [[ "lsattr $PROFILE | cut -b 5" == i ]]" Wie kann ich nun der Reihe nach eine Datei finden, und dann die Attribute checken? Sind z.B. die Profile User1.prf und User2.prf vorhanden, soll zuerst User1.prf gefunden werden, dann das Prüfen der Attribute erfolgen, anschließend geht das Skript weiter zur Datei User2.prf und prüft wieder die Attribute. Ich wäre um Hilfe dankbar.
|
sebix
Moderator, Webteam
Anmeldungsdatum: 14. April 2009
Beiträge: 5044
|
| while IFS= read -r -d $'\0' file; do
# was auch immer
done < <(find path/ -type f -name '*.prf' -print0)
|
|
Gerdchen03
(Themenstarter)
Anmeldungsdatum: 25. Februar 2011
Beiträge: 78
|
Danke! Das bedeutet mein code müsste in etwa so aussehen?
| while IFS= read -r -d $'\0' PROFILE; do
if [[ "lsattr $PROFILE | cut -b 5" == i ]]
then echo protected
else echo unprotected
fi > /home/root/$PROFILE
done < <(find path/ -type f -name '*.prf' -print0)
|
Müsste die Abfrage, ob die gefundene Datei die Endung prf hat nicht vorher erfolgen?
|
Gerdchen03
(Themenstarter)
Anmeldungsdatum: 25. Februar 2011
Beiträge: 78
|
Was ist der Unterschied zu dem Code?
| find . -name "*.prf" -print0 | while IFS= read -r -d $'\0' PROFILE; do
if [[ "lsattr $PROFILE | cut -b 5" == i ]]
then echo protected
else echo unprotected
fi > /home/root/$PROFILE
done
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12444
|
Gerdchen03 schrieb: Was ist der Unterschied zu dem Code?
| find . -name "*.prf" -print0 | while IFS= read -r -d $'\0' PROFILE; do
if [[ "lsattr $PROFILE | cut -b 5" == i ]]
then echo protected
else echo unprotected
fi > /home/root/$PROFILE
done
|
Da, wo die doppelten Anführungsstriche stehen, sollte eine Command Substitution sein. Ich mache das ja lieber direkt in einem Skript ohne Pipe: | find -type f -name '*.prf' -exec bash -c '
for f; do
if [[ $(lsattr "$f" | cut -b 5) == i ]]; then
echo "$f protected"
else
echo "$f unprotected"
fi
done
' -- {} +
|
Eigentlich braucht man hier die bash nicht - das geht auch mit der sh : | find -type f -name '*.prf' -exec sh -c '
for f; do
if [ "$(lsattr "$f" | cut -b 5)" = i ]; then
echo "$f protected"
else
echo "$f unprotected"
fi
done
' -- {} +
|
Man kann auch einen grep nutzen: | find -type f -name '*.prf' -exec sh -c '
for f; do
if lsattr "$f" | cut -b 5 | fgrep -q i; then
echo "$f protected"
else
echo "$f unprotected"
fi
done
' -- {} +
|
|
Gerdchen03
(Themenstarter)
Anmeldungsdatum: 25. Februar 2011
Beiträge: 78
|
Diese Variante gefällt mir gut:
| find -type f -name '*.prf' -exec sh -c '
for f; do
if lsattr "$f" | cut -b 5 | fgrep -q i; then
echo "$f protected"
else
echo "$f unprotected"
fi
done
' -- {} +
|
Der Befehl "find -type f -name '*.prf' -exec sh -c " führt allerdings zu: find: Fehlendes Argument für »-exec«.
|
sebix
Moderator, Webteam
Anmeldungsdatum: 14. April 2009
Beiträge: 5044
|
Gerdchen03 schrieb: Der Befehl "find -type f -name '*.prf' -exec sh -c " führt allerdings zu: find: Fehlendes Argument für »-exec«.
Fehler beim Ausfuehren (neue Zeilen/Quoting)? Funktioniert bei mir
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12444
|
Gerdchen03 schrieb:
Der Befehl "find -type f -name '*.prf' -exec sh -c " führt allerdings zu: find: Fehlendes Argument für »-exec«.
Du musst schon das gesamte Kommando kopieren und einfügen.
|
Gerdchen03
(Themenstarter)
Anmeldungsdatum: 25. Februar 2011
Beiträge: 78
|
OK, geht jetzt, ich hatte dies hier vergessen:
– {} + Noch eine weitere Frage. find gibt mir den kompletten Pfad an. Ich möchte davon aber nur den Dateinamen weiterverwenden. wie muss ich den Befehl
| find -maxdepth 1 -type f -name '*.prf' -exec sh -c '
|
verändern, damit als Variable nur der Dateiname User1.prf und nicht der Pfad /home/Pfad_zur_Datei_/User1.prf verwendet wird?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12444
|
Gerdchen03 schrieb:
Noch eine weitere Frage. find gibt mir den kompletten Pfad an. Ich möchte davon aber nur den Dateinamen weiterverwenden. wie muss ich den Befehl
| find -maxdepth 1 -type f -name '*.prf' -exec sh -c '
|
Vorsicht, das ist wieder unvollständig!
verändern, damit als Variable nur der Dateiname User1.prf und nicht der Pfad /home/Pfad_zur_Datei_/User1.prf verwendet wird?
Das kannst Du einfach im Shell-Skript machen (basename oder ${f##*/} ).
|
Gerdchen03
(Themenstarter)
Anmeldungsdatum: 25. Februar 2011
Beiträge: 78
|
Danke!!! So funktioniert es:
| #!/bin/sh
FILE= find /home/User/Test -maxdepth 1 -type f -name '*.prf' -exec sh -c '
for FILE;
do
PROFILE=`basename "$FILE"`
if lsattr "$FILE" | cut -b 5 | fgrep -q i;
then echo protected
else echo unprotected
fi > Sicherung/"$PROFILE"
done
' -- {} +
|
|
Gerdchen03
(Themenstarter)
Anmeldungsdatum: 25. Februar 2011
Beiträge: 78
|
Nun hänge ich an einer Kleinigkeit bei der Wiederherstellung des Schutzes. Hier mein Skript:
1
2
3
4
5
6
7
8
9
10
11
12 | PATH=/home/User/Test
PROFILE= find $PATH -maxdepth 1 -type f -name '*.prf' -exec sh -c '
for PROFILE;
do
PROFILE_SETTINGS=`basename "$PROFILE"`
case `cat "$PATH"/profile-settings/"$PROFILE_SETTINGS"` in
protected) chattr +i "$PATH"/"$PROFILE_SETTINGS"
echo "$PROFILE_SETTINGS has been protected.";;
unprotected) echo "$PROFILE_SETTINGS is still unprotected.";;
esac
done
' -- {} +
|
chattr scheint so nicht zu funktionieren. Es wird der Pfad ignoriert, und chattr versucht die Datei /User1.prf, statt /home/User/Test/User1.prf zu schützen. Warum geht das so nicht??
|
sebix
Moderator, Webteam
Anmeldungsdatum: 14. April 2009
Beiträge: 5044
|
PATH ist in der Subshell nicht bekannt. Musst du zuerst exporten.
|
Gerdchen03
(Themenstarter)
Anmeldungsdatum: 25. Februar 2011
Beiträge: 78
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12444
|
Gerdchen03 schrieb: Danke!! Klappt!
Sicher? $PATH sollte man nicht überschreiben! Darin sind die Pfade von ausführbaren Programmen gelistet.
|