Gibt es eine möglichkeit, den benutzer währen eines shell-skriptes mehrfach zu wechseln (su passwort eingabe simulieren)?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Die Bash kennt sogenannte Here Documents in verschiedenen Notationen, z.B. so:

su username <<<'12345'

Als Alternative kannst Du dein Script als root ausführen (sudo aufgabe1.sh). Dann fragt su nicht mehr nach einem Passwort.

Javanoob 
Fragesteller
 07.04.2016, 10:10

wenn ich es als sudo ausführe liefert $USER mir root zurück... wenn ichs mit Here Docs mache dann sagt die Shell: su must be run from a Terminal 

D: das kann doch nicht so schwer sein...

0
ralphdieter  07.04.2016, 10:30
@Javanoob

a) für root ist $USER=root. Du schaltest doch sowieso im Script auf andere Benutzer um. Wo ist das Problem?

b) Habe ich auch eben bemerkt: su liest das Passwort nur von der Konsole. Nimm stattdessen

sudo -Siu username -- ls -l <<< password

Dann kannst Du aufgabe1.sh wieder als Normaler User starten (der sudoer ist).

0
guenterhalt  07.04.2016, 16:12

in der Frage lese ich nichts von Ubuntu oder den Ablegern. Wie kannst du also sicher sein, dass in seiner Distribution sudo installiert und auch noch  für den betreffenden User konfiguriert ist?

0

Zweiter Versuch: Deinen Kommentaren entnehme ich, dass Du so etwas machen wolltest:

su user1 
#Befehle als user1 ausführen...
exit

Wie qugart schon sagte, geht das natürlich nicht. Schreib stattdessen:

# einen einzelnen Befehl ($USER bist Du)
sudo -iu user1 -- ls -l


# mehrere Befehle
# mit IO-Umleitung
# $USER=user1:
sudo -iu user1 -- sh -c '

ls -l
echo "$(USER) ist fertig!"

'

echo "Hallo $USER: alles fertig!"

Beim ersten Ausführen von aufgabe1.sh wird sudo am Terminal nach Deinem eigenen Passwort fragen. Das ist wesentlich besser als ein Passwort im Script.

Javanoob 
Fragesteller
 07.04.2016, 12:14

ich weiß ich stelle michmehr als nur dumm an und ich bin auch sehr dankbar für die ganze hilfe die ich hier bekomme.

ich werde meine Intension hier nochmal schriftlich festhalten.

ich habe nächsten mittwoch ein testat an der uni und statt meine 1millionen befehle von hand zu tippen und unter dem druck zu versagen möchte ich lieber ein skript schreiben das alle gegebenen aufgaben automatisch ausführt. dafür ist es notwendig das ich keinem user extra rechte zuweise. deswegen möchte ich im skript eine reihe von befehlen für user A ausführen, danach für user B und danach für user C. natürlich muss ich dafür immer wieder die user wechseln:

Von hand mache ich das immer mit "EXIT" und dann wieder als anderer User einloggen mit "su USERNAME"

also root umgeht dabei schonmal jegliche passwortabfragen jedoch muss ich aktuell noch exit jedes mal von hand eingeben, was natürlich sehr kontraproduktiv ist

der aktuelle code sieht vor das die User: 

alice , bob & carl

 jeweilsmit cd ins Verzeichniss

 /tmp 

wechseln und dort mit dem befehl

echo ' nahricht '>> nachr-USERNAME 

eine nachricht hinterlassen

ich hoffe das war dieses mal ein bisschen verständlicher. 

der code den ich aktuell nutze (also der der mich zum manuellen eingeben von exit zwingt) sieht folgendermaßen aus:

echo "Schritt 1 von 12"

su alice

cd /tmp

echo 'nachricht' >> nachr-alice

exit

su bob

cd /tmp

echo ' nachricht ' >> nachr-bob

exit

su carl

cd /tmp

echo 'nachricht' >> nachr-bob

echo "Schritt 2 von 12"

...

...

...

etc.

0
ralphdieter  07.04.2016, 13:48
@Javanoob

Dein Script sieht dann wohl so aus:

echo "Schritt 1 von 12"

for user in alice bob carl; do
sudo -iu $user -- sh -c 'cd /tmp;
echo "nachricht">>nachr-$USER'
done

echo "Schritt 2..."
# usw.

Innerhalb von '...' findet keine $-Ersetzung statt. '>>' und $USER wird erst später von sh -c interpretiert.

Wenn die Schritte zu lang oder kompliziert werden, kannst Du ebensogut 12 weitere Scripte schritt_N schreiben und diese ausführen:

for step in {1..12}; do
echo "Schritt $step von 12"

for user in alice bob carl; do
sudo -u $user -- "$(dirname $0
)/schritt_$step"
done
done

Willkommen in Unix!

1
ralphdieter  07.04.2016, 17:15
@ralphdieter

Im letzten Fall könnte das Script schritt_1 etwa so aussehen:

#!/usr/bin/env sh

cd /tmp
echo "nachricht">>nachr-$USER


1

so etwas ist nicht ungefährlich, muss man doch die Login-Passwörter im Klartext im Script ablegen.

so eine Zeile könnte wie folgt aussehen:

echo -e <Passwort-User1> | su <User1> -c "Befehl-1 ; Befehl-2 ; Befehl-3 ... "

Die Befehle-1 ... können natürlich auch in einem weiteren Script abgelegt sein.

echo -e <Passwort-User1> | su <User1>  -c Script-mit-Befehl-1-bis-3 
echo -e <Passwort-User1> | su <User1> 
  Befehl-1
  Befehl-2
  ....

würde aber nicht funktionieren, den nach der ersten Zeile echo ....
werden die Befehle Befehl-1 ; Befehl-2 ... wieder von "alten" User ausgeführt.

Woher ich das weiß:Berufserfahrung – openSuSE seit 1995
Javanoob 
Fragesteller
 07.04.2016, 13:13

klingt jetzt nicht so berrauschend... also sicherheitstechnisch hab ich keine bedenken da es ja nur ein versuchsaufbau sein soll.. sog. prüfen der machbarkeit. da ich aber auf diverse echos angewiesen bin werde ich es wohl mühseelig von hand machen müssen :'(

0
guenterhalt  07.04.2016, 15:52
@Javanoob

etwas Schreibarbeit kannst du einsparen, wenn du für die Passwörter an zentraler Stelle Variablen definierst
( z.B. PSW1=<passwort-1> )  definierst und die dann mit

echo $PSW1  in der Zeile mit su  benutzt.

Da es auch Editoren gibt, mit denen man sehr einfach Zeichenketten kopieren kann und/oder denen man mehrere Operationen "beibringen" kann, lässt sich die Schreibarbeit drastisch reduzieren.

Ich benutze für solche Dinge joe .

0

Warum arbeitest du nicht mit mehreren „screen“, die über Nachrichten kommunizieren?

jeder einzelne „screen“ wird von einen anderen Benutzer gestartet und koordinieren kannst du die über einen Bereich, auf den alle Benutzer zugreifen können.

Mach dich mal schlau über „semaphoren“ und die Technik der „Signale“!

So wie du einen Prozeß mit „kill -9 PID“ töten kannst, kannst du auch mit anderen Signalen arbeiten ...

ein „kill -hup PID“ veranlaßt den Prozeß mit der Prozeß-ID=PID seine Konfigurations-Datei neu zu lesen (z.B. der „apache“).

Achte nur darauf, daß du keine Endlos-Schleifen baust! Also warten auf ein Ereignis mit „sleep“!

Woher ich das weiß:eigene Erfahrung – Intensive Beschäftigung hiermit seit etlichen Jahren