kopeter
Anmeldungsdatum: 9. Juli 2013
Beiträge: 118
|
Ich bin dabei mir ein Script zu basteln, welches mir die neuinstallation eines Systems per Script möglichst flott erledigt. Dazu gehört hier im Heimnetz die Einbindung übers Netzwerk zweier HDDs am Pi. Meine Idee ist also, das entsprechende Einträge per Script einfach an die fstab angehänt werden. Damit, wenn es irgendwo zu Fehlern kommen sollte, die fstab nicht mit jeden Aufruf wächtst, würde ich gerne überprüfen ob die entsprechenden Einträge schon da sind. Die Einträge habe ich in einer Datei (fstab_Add) hinterlegt.
Der von mir gedachte Vorschlag meldet aber "[: grep: Einstelliger (unärer) Operator erwartet." 1
2
3
4
5
6
7
8
9
10
11
12
13 | #!/bin/bash
fstab_Add=/home/kopeter/TEST/fstab_Add
fstab=/home/kopeter/TEST/fstab_Test
echo "füge Netzlaufwerke zur fstab hinzu"
if [ grep <$fstab_Add $fstab ] ## [: grep: Einstelliger (unärer) Operator erwartet.
then
echo "fstab war bereits aktuell";
else
echo "erweitere fstab"
cat $fstab_Add >> $fstab
mount -a
echo "Netzlaufwerke sollten nun eingebunden sein"
fi
|
Ich erkenne als Fehler, dass die Ausgabe von grep nicht zur Prüfung von if passt, mir fällt aber auch nichts ein, wie es gehen könnte. LG kopeter ☺
|
kB
Supporter, Wikiteam
Anmeldungsdatum: 4. Oktober 2007
Beiträge: 8616
Wohnort: Münster
|
kopeter schrieb: […]
#!/bin/bash
fstab_Add=/home/kopeter/TEST/fstab_Add
fstab=/home/kopeter/TEST/fstab_Test
echo "füge Netzlaufwerke zur fstab hinzu"
if [ grep <$fstab_Add $fstab ] ## [: grep: Einstelliger (unärer) Operator erwartet.
[…]
Mit den eckigen Klammern „[ ]“ wird der Aufruf des Kommandos test gekennzeichnet. Also sollte zwischen den Klammern eine Prüfbedingung stehen und nicht der Aufruf eines Programms wie grep. Wenn Du den Rückgabewert von grep testen willst, lasse die Klammern einfach weg. (Alternativ könntest Du auch grep in einer Subshell ausführen, also ein Konstrukt wie [ $(grep … ) ] benutzen, aber das wäre ziemlicher Unfug.)
Prüfung von if
Das Kommando if prüft selbst gar nichts, sondern reagiert nur selektiv auf den Rückgabewert des letzten ausgeführten Kommandos, welches nach (!) dem Wort "if" steht.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Zeile 5 solle eher so aussehen: | if fgrep -xqf "$fstab_Add" "$fstab"; then
|
Es reicht dann aber, wenn ein Eintrag aus fstab_Add bereits in der fstab ist, damit keine Einfügung gemacht wird. Etwas robuster wäre: | while read -r line; do
fgrep -xqf "$line" "$fstab" || echo "$line" >> "$fstab"
done < "$fstab_Add"
|
Auf die Weise prüfst Du alle Zeilen einzeln und fügst sie ggf. hinzu.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
kopeter schrieb: Ich bin dabei mir ein Script zu basteln, welches mir die neuinstallation eines Systems per Script möglichst flott erledigt. Dazu gehört hier im Heimnetz die Einbindung übers Netzwerk zweier HDDs am Pi.
Warum nimmst du dazu nicht ein Tool wie Ansible, das speziell dafür gedacht ist Systeme in einen definierten Zustand zu bringen? Dafür gibt es z.B. lineinfile und blockinfile, um sicherzustellen, dass eine bestimmte Zeile in einer Datei vorhanden ist. Also z.B. in einem Playbook fstab_addition.yml:
1
2
3
4
5
6
7
8
9
10
11
12 | ---
- hosts: 127.0.0.1
connection: local
gather_facts: no
tasks:
- name: ensure all lines from file /home/kopeter/TEST/fstab_Add exist in fstab
lineinfile:
path: /home/kopeter/TEST/fstab
state: present
line: '{{ item }}'
with_lines:
- "cat /home/kopeter/TEST/fstab_Add"
|
Und dann einfach das Playbook ausführen:
ansible-playbook fstab_addition.yml Das nette an Ansible ist, dass man das Playbook auch von einem anderen Rechner aus über SSH-Verbindungen ausführen lassen kann und nicht mehr als ein Python-Interpreter auf dem Ziel installiert sein muss, was bei den meisten Distributionen, die auf Debian- bzw. Ubuntu als Basis setzen eh der Fall ist.
|
kopeter
(Themenstarter)
Anmeldungsdatum: 9. Juli 2013
Beiträge: 118
|
@seahawk1986 das nutze ich nicht weil ich es bisher garnicht kannte 😉 zunächst habe ich jetzt die Version von rklm eingebaut. grep findet aber die Dateien (=Zeilen?) nicht, sondern addiert die fröhlich zur fstab hinzu. | grep: : Datei oder Verzeichnis nicht gefunden
grep: # Addendum: Datei oder Verzeichnis nicht gefunden
grep: sshfs#himbeere:/home/pi/Musik/ /home/peter/Musik fuse uid=1000,gid=100,umask=0,allow_other,_netdev 0 0: Datei oder Verzeichnis nicht gefunden
grep: sshfs#himbeere:/home/pi/Bilder/ /home/peter/Bilder fuse uid=1000,gid=100,umask=0,allow_other,_netdev 0 0: Datei oder Verzeichnis nicht gefunden
grep: sshfs#himbeere:/home/pi/Videos/ /home/peter/Videos fuse uid=1000,gid=100,umask=0,allow_other,_netdev 0 0: Datei oder Verzeichnis nicht gefunden
grep: sshfs#himbeere:/home/pi/Dokumente/ /home/peter/Dokumente fuse uid=1000,gid=100,umask=0,allow_other,_netdev 0 0: Datei oder Verzeichnis nicht gefunden
grep: sshfs#himbeere:/home/pi/Lager/ /home/peter/Lager fuse uid=1000,gid=100,umask=0,allow_other,_netdev 0 0: Datei oder Verzeichnis nicht gefunden
grep: sshfs#himbeere:/home/pi/Buecher/ /home/peter/Buecher fuse uid=1000,gid=100,umask=0,allow_other,_netdev 0 0: Datei oder Verzeichnis nicht gefunden
grep: #sshfs#himbeere:/home/pi/Desktop/ /home/peter/Desktop fuse uid=1000,gid=100,umask=0,allow_other,_netdev 0 0: Datei oder Verzeichnis nicht gefunden
mount: nur „root“ kann die Option „--all“ verwenden
Netzlaufwerke sollten nun eingebunden sein
|
hier das gekürzte 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 | #!/bin/bash
# Variablen belegen
echo "Herzlich willkommen zum Installationsscript. Ich sage dir immer was ich tu ;)
zunächst werden die Variablen belegt :)"
benutzer=peter
#echo "Benutzer = " $benutzer
#echo "BackupDirSSH = " $BackupDirSSH
BackupDir_Lokal=/home/$benutzer/BackupDir_Lokal
#echo "BackupDir_Lokal = " $BackupDir_Lokal
read -p "sollen einmalig notwendige Ationen ausgeführt werden? (j/n):" einmaligesErledigen
###############################################
#echo {grep <$fstab_Add <$fstab}
case $einmaligesErledigen in
j|J|y|Y|ja|Ja|JA|yes|Yes|YES|z|Z|zes|Zes|ZES)
echo "führe dieses Mal einmalige Operationen aus!"
fstab_Add="/home/peter/TEST/fstab_Add.txt"
fstab="/home/peter/TEST/fstab_Test.txt"
set -C
echo "füge himbeere zur fstab hinzu"
while read -r line; do
fgrep -xqf "$line" "$fstab" || echo "$line" >> "$fstab"
done < "$fstab_Add"
mount -a
echo "Netzlaufwerke sollten nun eingebunden sein"
#echo "initialisiere SSH-Hilfen"
#
#echo "SSH sollte nun funktionieren"
;;
nein|Nein|NEIN|no|No|No|n|N)
echo "es werden dieses Mal keine einmaligen Operationen ausgeführt"
;;
*)
echo "ich weiß nicht was du eingegeben hast, aber es werden dieses Mal sicherheitshalber keine einmaligen Operationen ausgeführt"
;;
esac
|
|
Cranvil
Anmeldungsdatum: 9. März 2019
Beiträge: 990
|
Welchen Inhalt hat kopeter schrieb: | fstab_Add="/home/peter/TEST/fstab_Add.txt"
|
die Datei /home/peter/TEST/fstab_Add.txt bzw. existiert sie mit genau diesem Pfad (Groß- und Kleinschreibung beachten) und darf das Skript (bzw. der ausführende Benutzer) darauf zugreifen?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
kopeter schrieb:
zunächst habe ich jetzt die Version von rklm eingebaut. grep findet aber die Dateien (=Zeilen?) nicht, sondern addiert die fröhlich zur fstab hinzu.
Mein Fehler: da ist die Option "f" vom Experimentieren übrig geblieben. Zeile 24 muss so aussehen: | fgrep -xq "$line" "$fstab" || echo "$line" >> "$fstab"
|
Bitte führ das Skript mal so aus bash -x pfad/zum/script . Dann siehst Du genau, was es tut und wo es schiefgeht - wenn noch Fehler auftreten.
|
kopeter
(Themenstarter)
Anmeldungsdatum: 9. Juli 2013
Beiträge: 118
|
|