fox2k12
Anmeldungsdatum: 22. September 2012
Beiträge: 158
Wohnort: Bei Stuttgart
|
Hallo, ich versuche mich jetzt schon den ganzen Nachmittag erfolglos an einem Bash Script : An eine Zeichenkette z.b. : "/dev/sdb /dev/sdc /dev/sdd /dev/sde" ... kann auch noch länger sein,
soll jeweils eine "1" angehängt werden, das es dann so aussieht : /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 Dazu versuche ich das ganze mittels Array irgendwie hinzubiegen,
es funktioniert aber nicht. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | #! /bin/bash
#
Laufwerke="/dev/sdb /dev/sdc /dev/sdd /dev/sde"
ArrayLw=$Laufwerke
AnzahlLaufwerke=4
COUNTER=0
while [ $COUNTER -lt $AnzahlLaufwerke ];
do
ArrayNeu=${ArrayLw[COUNTER]}+"1"
let COUNTER=COUNTER+1
echo ArrayNeu[COUNTER]
read
done
|
Im neuen Array soll dann statt /dev/sdb /dev/sdc /dev/sdd /dev/sde
eben /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 stehen. Keine Chance das selbst hinzubekommen. Irgendwelche Ideen ?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
fox2k12 schrieb: Irgendwelche Ideen ?
Tatsächlich Arrays verwenden:
| #! /bin/bash
#
Laufwerke="/dev/sdb /dev/sdc /dev/sdd /dev/sde"
ArrayLw=($Laufwerke)
for element in "${ArrayLw[@]}"
do
ArrayNeu+=("${element}1")
done
echo "${ArrayNeu[@]}"
|
Wobei sich das ganze Beispiel auf ein
| Laufwerke="/dev/sdb /dev/sdc /dev/sdd /dev/sde"
ArrayNeu=($(printf "%s1 " $Laufwerke))
echo "${ArrayNeu[@]}"
|
eindampfen ließe, wenn es nur darum geht eine 1 an jedes Element anzuhängen...
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
Oder ohne Array: | echo "/dev/sd"{b,c,d,e}"1"
|
Je nach dem, wozu es eingesetzt werden soll.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
user_unknown schrieb:
Je nach dem, wozu es eingesetzt werden soll.
Das ist wohl der entscheidende Punkt. Man müsste noch ein bisschen mehr über den Anwendungsfall wissen, um sagen zu können, was eine gute Lösung ist.
|
fox2k12
(Themenstarter)
Anmeldungsdatum: 22. September 2012
Beiträge: 158
Wohnort: Bei Stuttgart
|
Der Anwendungsfall :
ich experimentiere seit einiger Zeit etwas mit der Bash Programmierung herum.
Ausserdem baue ich mir gerade einen neuen Homeserver auf, der ausser SmartHome Steuerung
auch ein Software-RAID-6 Volume bekommen soll. Verwenden will ich dafür mdadm.
Und da wollte ich beides verbinden und ein "kleines" Script dafür schreiben.
Die ganze Sache ist etwas eskaliert...
Zeit habe ich noch genug, da ein Teil der Hardware
noch ewig Lieferverzögerungen hat. Soweit sogut : (ausgeführt wird das Script mit sudo)
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334 | #! /bin/bash
#
cd ~
clear
tput setab 15 # Hintergrund Weiss
tput setaf 0 # Vordergrund Schwarz
clear
echo
read -p "Welchen Namen soll das RAID erhalten ? : $(tput setaf 1)" RaidName
tput setaf 0
echo
read -p "Soll das RAID verschlüsselt werden ? (j/n) : $(tput setaf 1)" Verschluesseln
tput setaf 0
echo
read -p "Welches RAID-Level soll erstellt werden (0/1/5/6) ? : $(tput setaf 1)" RaidLevel
tput setaf 0
echo
read -p "Wieviele Laufwerke sollen zum RAID-verbund gehören ? : $(tput setaf 1)" AnzahlLaufwerke
tput setaf 0
echo
read -p "RAID Laufwerke ?
(Schreibweise Beispiel : /dev/sdb /dev/sdc /dev/sdd) ? : $(tput setaf 1)" Laufwerke
tput setaf 0
echo
AnzahlSpareLaufwerke=0 #Wenn keine Spare-Laufwerke verwendet werden, dann "0" für mdadm
SpareLaufwerke="" #Wenn keine Spare-Laufwerke verwendet werden, dann Leer-wert für mdadm
read -p "Wieviele Spare-Laufwerke sollen zusätzlich
zum RAID-verbund gehören ? : $(tput setaf 1)" AnzahlSpareLaufwerke
tput setaf 0
echo
if [ $AnzahlSpareLaufwerke -gt 0 ];
then
read -p "Spare-Laufwerke(e) ?
(Schreibweise Beispiel : /dev/sde /dev/sdf /dev/sdg) ? : $(tput setaf 1)" SpareLaufwerke
tput setaf 0
echo
fi
read -p "Die Grösse der Chunks in KiB (Standard : 512) ? : $(tput setaf 1)" ChunkGroesse
tput setaf 0
echo
read -p "Dateisystem Blockgrösse in Byte (Standard : 4096)
(sollte nur in ganz speziellen Fällen geändert werden) ? : $(tput setaf 1)" BlockGroesse
tput setaf 0
echo
read -p "Die Stride Grösse ?
(Standard : 512 KiB Chunk / (4096 Byte Dateisystem Blockgrösse / 1024) = 128 ) : $(tput setaf 1)" StrideGroesse
tput setaf 0
echo
echo "Die Stripe Breite."
echo "Bespiel : Ein RAID-6 verbund, bestehend aus insgesamt 8 Laufwerken :"
echo "8 Laufwerke wovon immer 2 Parity-Laufwerke"
echo "(bei RAID-5 und bei RAID-1 jeweils nur 1 Parity-Laufwerk) sein müssen,"
echo "ergibt 6 Nutzbare Laufwerke. Spare-Laufwerke zählen NICHT dazu !"
echo "128 KiB Stride Grösse * 6 Nutzbare Laufwerke = 768"
read -p "Stripe Breite ? : $(tput setaf 1)" StripeBreite
tput setaf 0
echo
clear
echo
echo "==================="
echo "= Zusammenfassung ="
echo "==================="
tput setaf 0
echo
echo "Hardware :"
echo "Zu dem neuen Verbund gehören insgesamt $(tput setaf 1)$AnzahlLaufwerke Laufwerke$(tput setaf 0) :"
echo "$(tput setaf 1)$Laufwerke$(tput setaf 0)"
if [ $AnzahlSpareLaufwerke -gt 0 ];
then
echo
echo "Zusätzlich werden noch $(tput setaf 1)$AnzahlSpareLaufwerke Spare-Laufwerk(e) $(tput setaf 0)hinzugefügt :"
echo "$(tput setaf 1)$SpareLaufwerke$(tput setaf 0)"
fi
case "$Verschluesseln" in
j|"")
echo
echo "Software :"
echo "Der neue $(tput setaf 1)RAID-$RaidLevel $(tput setaf 0)Verbund wird in $(tput setaf 1)$RaidName $(tput setaf 0)benannt und $(tput setaf 1)Verschlüsselt$(tput setaf 0)."
echo "Er wird auf auf $(tput setaf 1)/dev/mapper/$RaidName $(tput setaf 0)verlinkt werden."
;;
n)
echo
echo "Software :"
echo "Der neue $(tput setaf 1)RAID-$RaidLevel $(tput setaf 0)Verbund wird in $(tput setaf 1)$RaidName $(tput setaf 0)benannt"
echo "und auf $(tput setaf 1)/dev/md/$RaidName $(tput setaf 0)verlinkt werden."
;;
esac
echo
echo "Die Grösse der Chunks beträgt $(tput setaf 1)$ChunkGroesse KiB$(tput setaf 0)."
echo "Die Grösse der Dateisystem Blöcke beträgt $(tput setaf 1)$BlockGroesse Byte$(tput setaf 0)."
echo "Die Grösse der Strides beträgt $(tput setaf 1)$StrideGroesse KiB$(tput setaf 0)."
echo "Die Breite der Stripes beträgt $(tput setaf 1)$StripeBreite KiB$(tput setaf 0)."
echo
echo
echo "Ab hier werden Änderungen am System vorgenommen."
echo "------------------------------------------------"
echo
echo "Die Laufwerke die für den RAID-verbund ausgewählt wurden,"
echo "werden $(tput setaf 1)UNWIEDERHERSTELLBAR GELÖSCHT !$(tput setaf 0)"
echo
read -p "$(tput setaf 2)(w)eiter, $(tput setaf 3)(z)urück, $(tput setaf 1)(a)bbrechen$(tput setaf 0) ? (w/z/a) : " antwort
case "$antwort" in
a|"")
tput sgr0
clear
echo
echo "Das Programm wurde ohne Änderungen vorzunehmen beendet."
echo
exit 1
;;
z)
unset RaidName
unset Verschluesseln
unset RaidLevel
unset AnzahlLaufwerke
unset Laufwerke
unset AnzahlSpareLaufwerke
unset SpareLaufwerke
unset ChunkGroesse
unset BlockGroesse
unset StrideGroesse
unset StripeBreite
# Rücksprung Zeile 4. WIE ??
;;
w)
;;
esac
ArrayLaufwerke=($Laufwerke)
COUNTER=0
cntr=0
while [ $COUNTER -lt $AnzahlLaufwerke ]; do
cntr=$((cntr+1))
clear
echo
echo "Vorbereitung von Laufwerk : $(tput setaf 1)$cntr/$AnzahlLaufwerke - ${ArrayLaufwerke[COUNTER]}$(tput setaf 0)"
echo "=========================================="
echo
echo "$(tput setaf 1)Das Laufwerk wird gelöscht...$(tput setaf 0)"
# Löschen durch überschreiben mit Nullen :
dd if=/dev/zero bs=1M status=progress of=${ArrayLaufwerke[COUNTER]}
# GPT-Partitionstabelle erstellen :
parted -s ${ArrayLaufwerke[COUNTER]} mklabel gpt
# Leere Partition erstellen :
parted -s -a optimal -- ${ArrayLaufwerke[COUNTER]} mkpart RaidDevice$COUNTER 2048s -16384s
# Partitions-Flag "linux_raid_member" setzen :
parted -s ${ArrayLaufwerke[COUNTER]} set 1 raid on
# Datenträger Zufalls-GUID erstellen :
sgdisk -G ${ArrayLaufwerke[COUNTER]}
sync
let COUNTER=COUNTER+1
done
if [ $AnzahlSpareLaufwerke -gt 0 ];
then
clear
ArraySpareLaufwerke=($SpareLaufwerke)
COUNTER=0
cntr=0
while [ $COUNTER -lt $AnzahlSpareLaufwerke ]; do
cntr=$((cntr+1))
clear
echo
echo "Vorbereitung von Spare-Laufwerk : $(tput setaf 1)$cntr/$AnzahlSpareLaufwerke - ${ArraySpareLaufwerke[COUNTER]}$(tput setaf 0)"
echo "================================================"
echo
echo "$(tput setaf 1)Das Laufwerk wird gelöscht...$(tput setaf 0)"
dd if=/dev/zero bs=1M status=progress of=${ArraySpareLaufwerke[COUNTER]}
parted -s ${ArraySpareLaufwerke[COUNTER]} mklabel gpt
parted -s -a optimal -- ${ArraySpareLaufwerke[COUNTER]} mkpart RaidSpareDevice$cntr 2048s -16384s
parted -s ${ArraySpareLaufwerke[COUNTER]} set 1 raid on
sgdisk -G ${ArraySpareLaufwerke[COUNTER]}
sync
let COUNTER=COUNTER+1
done
fi
echo
echo "Das Vorbereiten aller Laufwerke ist beendet."
echo
unset antwort
read -p "$(tput setaf 2)(w)eiter, $(tput setaf 1)(a)bbrechen$(tput setaf 0) (w/a) ? " antwort
case "$antwort" in
a|"")
tput sgr0
clear
echo
echo "Das Programm wurde beendet."
echo
exit 1
;;
w)
;;
esac
# Den Laufwerken eine "1" anhängen für mdadm (z.b. /dev/sdc nach /dev/sdc1) :
ArrayLw=($Laufwerke)
for element in "${ArrayLw[@]}"
do
Lw+=("${element}1")
done
if [ $AnzahlSpareLaufwerke -gt 0 ];
then
ArraySpLw=($SpareLaufwerke)
for element in "${ArraySpLw[@]}"
do
SpLw+=("${element}1")
done
else
SpLw=""
fi
clear
echo
echo "Erstelle neues $(tput setaf 1)RAID-$RaidLevel$(tput setaf 0) Volume : $(tput setaf 1)/dev/md/$RaidName$(tput setaf 0)"
echo "========================================================="
echo
# Das RAID Volume mit mdadm erstellen :
mdadm --create /dev/md/$RaidName --auto md --chunk=$ChunkGroesse --verbose --level=$RaidLevel --raid-devices=$AnzahlLaufwerke ${Lw[@]} --spare-devices=$AnzahlSpareLaufwerke ${SpLw[@]}
sync
echo
echo "Erstellen des neuen $(tput setaf 1)RAID-$RaidLevel$(tput setaf 0) Volumes beendet."
echo "Eingabetaste drücken zum fortsetzen."
read
case "$Verschluesseln" in
j|"")
clear
echo
echo "Einrichten der Verschlüsselung des $(tput setaf 1)RAID-$RaidLevel$(tput setaf 0) Volumes."
echo "=================================================="
echo
echo "Passwort festlegen und Volume Verschlüsseln :"
# Das RAID Volume mit LUKS Verschlüsseln :
cryptsetup luksFormat -c aes-xts-plain64 -s 512 -h sha512 /dev/md/$RaidName
sync
echo
echo "Verschlüsseltes Volume öffnen :"
# Das Verschlüsselte RAID Volume zur weiterbearbeitung öffnen :
cryptsetup luksOpen /dev/md/$RaidName $RaidName
echo
echo
echo "Eingabetaste drücken zum fortsetzen."
read
clear
echo
echo "Formatiere das Verschlüsselte $(tput setaf 1)RAID-$RaidLevel$(tput setaf 0) Volume."
echo "============================================"
echo
# Das Verschlüsselte RAID Volume auf EXT4 Formatieren :
mkfs -t ext4 -v -L $RaidName -b $BlockGroesse -E stride=$StrideGroesse,stripe-width=$StripeBreite /dev/mapper/$RaidName
# Die Dateisystem-Fehlerprüfung auf alle 3 Mounts einstellen :
tune2fs -c3 -C1 /dev/mapper/$RaidName
sync
echo
echo "Verschlüsseln und Formatieren des $(tput setaf 1)RAID-$RaidLevel$(tput setaf 0) Volumes beendet."
echo "Eingabetaste drücken zum fortsetzen."
read
;;
n)
clear
echo
echo "Formatiere das $(tput setaf 1)RAID-$RaidLevel$(tput setaf 0) Volume."
echo "============================"
echo
# Das RAID Volume auf EXT4 Formatieren :
mkfs -t ext4 -v -L $RaidName -b $BlockGroesse -E stride=$StrideGroesse,stripe-width=$StripeBreite /dev/md/$RaidName
tune2fs -c3 -C1 /dev/md/$RaidName
sync
echo
echo "Formatieren des $(tput setaf 1)RAID-$RaidLevel$(tput setaf 0) Volumes beendet."
echo "Eingabetaste drücken zum fortsetzen."
read
;;
esac
clear
echo "Das $(tput setaf 1)RAID-$RaidLevel$(tput setaf 0) Volume wird im Hintergrund aufgebaut..."
echo
echo "Eingabetaste drücken um die Fortschrittsanzeige einzublenden,"
echo "STRG+C drücken um die Fortschrittsanzeige wieder zu beenden."
read
clear
tput setaf 1
clear
# Den BUILD-Fortschritt vom RAID Volume anzeigen lassen :
watch -n 1 mdadm --detail /dev/md/$RaidName
clear
tput setaf 0
clear
echo
read -p "Das $(tput setaf 1)RAID-$RaidLevel$(tput setaf 0) Volume $(tput setaf 1)/dev/md/$RaidName$(tput setaf 0) in das Benutzerverzeichnis einbinden,
die Zugriffsrechte anpassen und in die $(tput setaf 1)/etc/fstab$(tput setaf 0) eintragen? (j/n) : " antwort
case "$antwort" in
j|"")
case "$Verschluesseln" in
j|"")
# Verschlüsseltes RAID Volume
benutzer=$whoami # $whoami liefert den Benutzer nicht zurück. - Bug ?? -
mkdir /home/$benutzer/$RaidName
mount -t ext4 /dev/mapper/$RaidName /home/$benutzer/$RaidName
chown -R /home/$benutzer/$RaidName $benutzer
chgrp -R /home/$benutzer/$RaidName $benutzer
echo /dev/mapper/$RaidName /home/$benutzer/$RaidName ext4 defaults,user,noauto 0 2 >> /etc/fstab
;;
n)
# Unverschlüsseltes RAID Volume
benutzer=$whoami
mkdir /home/$benutzer/$RaidName
mount -t ext4 /dev/md/$RaidName /home/$benutzer/$RaidName
chown -R /home/$benutzer/$RaidName $benutzer
chgrp -R /home/$benutzer/$RaidName $benutzer
echo /dev/md/$RaidName /home/$benutzer/$RaidName ext4 defaults,user 0 2 >> /etc/fstab
;;
esac
;;
n)
tput sgr0
clear
echo
echo "Programm beendet."
echo
exit 1
;;
esac
tput sgr0
clear
echo
echo "Programm beendet."
echo
|
Die sache mit dem Array steht bei Zeile 198. Es gibt LEIDER noch mehr Baustellen : Bei den ganzen Abfragen von Zeile 9 bis Zeile 55 kann man irgendwas anderes Eintragen als was vorgegeben ist. Z.b. Bei der Abfrage bei Zeile 15 könnte man z.b. anstatt "6" auch "blablupp" eintragen, sodass mdadm dann in einen Fehler läuft. Wie kann ich die Eingaben auf Gültigkeit überprüfen ? JEDESMAL mit case ? Das würde das ganze Script übel aufblähen. Das geht doch bestimmt kompakter ? Keine Ahnung wie man das programmiert. Bei der Abfrage bei Zeile 101 will ich wenn "Zurück" ausgewählt wird, auf Zeile 4 rückspringen. Keine Ahnung wie das geht. Wenn die Abfrage bei Zeile 294 mit Ja beantwortet wird, will ich im Home Verz. einen gleichnamigen Ordner als Mountpoint für das Volume anlegen, es Mounten, die Benutzerrechte anpassen und es in die /etc/fstab eintragen lassen. Es scheitert alles daran, das $Whoami aus mir unbekannten, nicht nachvollziehbaren Gründen den Benutzernamen nicht zurückliefert. Keine Ahnung warum. Liegt es evtl. daran, weil das Script mit sudo ausgeführt wird und dann irgend etwas durcheinander kommt ?
Ich habe mir in VirtualBox eine VM erstellt und das schon "simuliert".
Das Script funktioniert bis auf die genannten Probleme. Bearbeitet von rklm: Formatierung Aufzählung
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
fox2k12 schrieb: 1.) Bei den ganzen Abfragen von Zeile 9 bis Zeile 55
kann man irgendwas anderes Eintragen als was vorgegeben ist.
Z.b. Bei der Abfrage bei Zeile 15 könnte man z.b. anstatt "6" auch "blablupp" eintragen, sodass mdadm dann
in einen Fehler läuft. Wie kann ich die Eingaben auf Gültigkeit überprüfen ?
JEDESMAL mit case ? Das würde das ganze Script übel aufblähen. Das geht doch bestimmt
kompakter ? Keine Ahnung wie man das programmiert.
Da gibt es viele Ansätze. | [[ $a =~ [0-9]+ ]] && echo Zahl || echo keine Zahl
|
fallen mir spontan ein.
2.) Bei der Abfrage bei Zeile 101 will ich wenn "Zurück" ausgewählt wird,
auf Zeile 4 rückspringen. Keine Ahnung wie das geht.
Da in den Zeilen 1-4 nichts passiert, was fatal wäre, wenn es 2x passiert, einfach das Script neu starten. (Solange das nicht 100x in Folge passiert, ist das kein Problem.) Danach aber dann das äußere Script abbrechen. Generell würde es der Übersichtlichkeit des Scripts guttun, wenn Du jede einzelne Aufgabe in eine eigene Funktion schreibst. Diese können wiederum Hilfsfunktionen aufrufen, für wiederkehrende, strukturell gleiche Aufgaben. Mehrere Einzelaufgaben=Funktionen könnnen in einer zusammengefassten Funktion aufgerufen werden. Das Hauptscript kann dann 3-4 Hauptfunktionen aufrufen, die die Fachfunktionen aufrufen, die sich irgendwelcher Tools bedienen, soweit nützlich. Die Steuerung kann dann einen ganzen Block an Funktionen neu aufrufen.
3.) Wenn die Abfrage bei Zeile 294 mit Ja beantwortet wird, will
ich im Home Verz. einen gleichnamigen Ordner als Mountpoint für das
Volume anlegen, es Mounten, die Benutzerrechte anpassen und es in die /etc/fstab eintragen lassen.
Es scheitert alles daran, das $Whoami aus mir unbekannten, nicht nachvollziehbaren Gründen den
Benutzernamen nicht zurückliefert.
a) heißt die Variable bei Dir whoami, nicht Whoami - solche Subtilitäten spielen auf unixoiden Systemen eine Rolle.
b) Die Variable ist nie gesetzt worden. Du meinst wohl $(whoami), was der Wert ist, den das Kommando whoami ausspuckt.
|
micneu
Anmeldungsdatum: 19. Januar 2021
Beiträge: 200
|
bitte nicht böse nehmen, aber dein code bereitet mir schmerzen, versuche doch mal deinen code mit funktionen zu bauen, macht es dann auch einfacher zu debugen (in meinen augen).
z. b.
und mit puppet oder ansibel gibt es schon lötungen die es automatisieren
|
fox2k12
(Themenstarter)
Anmeldungsdatum: 22. September 2012
Beiträge: 158
Wohnort: Bei Stuttgart
|
micneu schrieb: bitte nicht böse nehmen, aber dein code bereitet mir schmerzen
Mir ist durchaus bewusst, dass das noch besser und schöner geht. Irgendwie.
Ich bin, was Programmierung betrifft, noch ein Anfänger.
Das bitte im Hinterkopf behalten. ☺ micneu schrieb: versuche doch mal deinen code mit funktionen zu bauen, macht es dann auch einfacher zu debugen (in meinen augen).
z. b.
Was genau meinst du mit "Funktionen bauen" ? user_unknown schrieb: a) heißt die Variable bei Dir whoami, nicht Whoami - solche Subtilitäten spielen auf unixoiden Systemen eine Rolle.
b) Die Variable ist nie gesetzt worden. Du meinst wohl $(whoami), was der Wert ist, den das Kommando whoami ausspuckt.
Das Problem war, das ich benutzer=$whoami geschrieben habe, es müsste aber. benutzer=$(whoami) heissen. Klammern vergessen.
Da das ganze Script aber mit sudo ausgeführt wird, liefert $(whoami) als Benutzer leider root zurück. Ich brauche
aber den Benutzernamen, der gerade angemeldet ist, und NICHT root. Ich finde dazu auch keine Infos in Netz.
Das geht wahrscheinlich nicht, nehme ich an ?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
fox2k12 schrieb: Ich brauche
aber den Benutzernamen, der gerade angemeldet ist, und NICHT root. Ich finde dazu auch keine Infos in Netz.
Das geht wahrscheinlich nicht, nehme ich an ?
Der Benutzer steckt in der Variable $SUDO_USER - das kannst du dir bequem mit env ansehen:
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
fox2k12 schrieb:
Was genau meinst du mit "Funktionen bauen" ?
Shell-Funktionen. Mindestens solltest Du aber Dein Skript ordentlich entlang der Kontrollstrukturen (if , for , while ...) einrücken.
Ich brauche
aber den Benutzernamen, der gerade angemeldet ist, und NICHT root. Ich finde dazu auch keine Infos in Netz.
Das geht wahrscheinlich nicht, nehme ich an ?
Das bekommst Du über die Umgebung heraus, wie auf der Manpage von sudo erwähnt: | $ sudo env | fgrep USER
USER=root
SUDO_USER=rklm
|
Ah, da war jemand schneller. ☺ Oder Du läufst die Prozesshierarchie hoch und findest den ersten Prozess, der nicht "root" gehört. | $ pstree -us $$ | egrep -o '\([^)]+\)' | fgrep -vx '(root)' | sed -n '$s/^(//;s/)$//p'
rklm
|
Also dann | benutzer=$(pstree -us $$ | egrep -o '\([^)]+\)' | fgrep -vx '(root)' | sed -n '$s/^(//;s/)$//p')
|
|
fox2k12
(Themenstarter)
Anmeldungsdatum: 22. September 2012
Beiträge: 158
Wohnort: Bei Stuttgart
|
Funktioniert leider nicht. Wäre ja auch zu einfach gewesen.
Dieses Testscript, ausgeführt mit sudo :
| #! /bin/bash
#
benutzer=$(SUDO_USER)
echo "Der Benutzername ist :" $benutzer
|
liefert das hier zurück :
./test.sh: Zeile 4: SUDO_USER: Kommando nicht gefunden.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
Das ist kein Befehl, sondern eine Variable und es macht IMHO wenig Sinn eine neue Variable anzulegen, wenn schon eine existiert:
| #!/bin/bash
echo "Der Benutzername ist :" "$SUDO_USER"
|
Damit die Variable gefüllt ist, muss das Skript natürlich mit sudo ausgeführt werden.
|
fox2k12
(Themenstarter)
Anmeldungsdatum: 22. September 2012
Beiträge: 158
Wohnort: Bei Stuttgart
|
seahawk1986 schrieb: Das ist kein Befehl, sondern eine Variable und es macht IMHO wenig Sinn eine neue Variable anzulegen, wenn schon eine existiert:
| #!/bin/bash
echo "Der Benutzername ist :" "$SUDO_USER"
|
Damit die Variable gefüllt ist, muss das Skript natürlich mit sudo ausgeführt werden.
Danke ! In meinem Script ganz oben habe ich die Variablen ja alle in Klammern geschrieben,
da funktioniert es. Hier funktioniert es auf einmal nichtmehr. Warum auch immer... Das mit dem einrücken der IF und CASE Anweisungen und alles übersichtlicher machen,
das wird erledigt.
Die Überprüfung der Abfragen, Shell-Funktionen und alles andere...keine Ahnung
was genau ich da jetzt machen muss. Da blick ich nicht durch.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11176
Wohnort: München
|
fox2k12 schrieb: In meinem Script ganz oben habe ich die Variablen ja alle in Klammern geschrieben,
da funktioniert es. Hier funktioniert es auf einmal nichtmehr. Warum auch immer...
Du musst zwischen dem Zugriff auf den Wert einer Variable mit geschweiften Klammern - aka Parameter Expansion und einer Command Substitution unterscheiden, bei der Ausdruck durch die Ausgabe eines Befehls auf stdout ersetzt wird:
| foo="bar"
echo "${foo}bar" # hier interessiert uns der Wert, der der Variablen foo zugewiesen wurde
output=$(echo "${foo}bar") # hier interessiert uns die Ausgabe von echo "${foo}",
# die der Variable output als Wert zugewiesen wird
echo "${output}a"
|
Und als drittes gibt es noch die Arithmetic Expansion, in der man mit ganzen Zahlen rechnen kann:
| declare -i n1=5
declare -i n2=10
echo $(( n1 * n2 - n1 ))
|
Und ohne führendes Dollar-Zeichen gibt es noch die Brace Expansion, mit der man Sequenzen bauen kann - also z.B. jede zweite Zahl von 1 bis 100 ausgeben:
| for in {1..100..2}
do
echo $i
done
|
|