staging.inyokaproject.org

Textblöcke erweitern

Status: Ungelöst | Ubuntu-Version: Ubuntu 20.10 (Groovy Gorilla)
Antworten |

fox2k12

Anmeldungsdatum:
22. September 2012

Beiträge: 158

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: 11278

fox2k12 schrieb:

Irgendwelche Ideen ?

Tatsächlich Arrays verwenden:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#! /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

1
2
3
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

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Oder ohne Array:

1
echo "/dev/sd"{b,c,d,e}"1"

Je nach dem, wozu es eingesetzt werden soll.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

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

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 :

  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.

  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.

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

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

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) select benutzen.

  • b) Mit regulären Ausdrücken und =~ testen:

1
[[ $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

Avatar von micneu

Anmeldungsdatum:
19. Januar 2021

Beiträge: 845

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.

  • funktion: einlesen der daten und prüfung ob zulässig

  • usw..

und mit puppet oder ansibel gibt es schon lötungen die es automatisieren

fox2k12

(Themenstarter)

Anmeldungsdatum:
22. September 2012

Beiträge: 158

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.

  • funktion: einlesen der daten und prüfung ob zulässig

  • usw..

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: 11278

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:

sudo env 

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

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:

1
2
3
$ 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.

1
2
$ pstree -us $$ | egrep -o '\([^)]+\)' | fgrep -vx '(root)' | sed -n '$s/^(//;s/)$//p'
rklm

Also dann

1
benutzer=$(pstree -us $$ | egrep -o '\([^)]+\)' | fgrep -vx '(root)' | sed -n '$s/^(//;s/)$//p')

fox2k12

(Themenstarter)

Anmeldungsdatum:
22. September 2012

Beiträge: 158

Funktioniert leider nicht. Wäre ja auch zu einfach gewesen. Dieses Testscript, ausgeführt mit sudo :

1
2
3
4
#! /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: 11278

Das ist kein Befehl, sondern eine Variable und es macht IMHO wenig Sinn eine neue Variable anzulegen, wenn schon eine existiert:

1
2
#!/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

seahawk1986 schrieb:

Das ist kein Befehl, sondern eine Variable und es macht IMHO wenig Sinn eine neue Variable anzulegen, wenn schon eine existiert:

1
2
#!/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: 11278

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:

1
2
3
4
5
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:

1
2
3
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:

1
2
3
4
for in {1..100..2}
do
  echo $i
done
Antworten |