Gibt es eine möglichkeit, den benutzer währen eines shell-skriptes mehrfach zu wechseln (su passwort eingabe simulieren)?
Hallo liebe Communiy,
ich habe ein kleines Problem.. Aktuell versuche ich eine Hausaufgabe für ein Unifach zu automatisieren.
Ich schreibe ein Shell-Skript auf Ubuntu 14.10 mit dem man das Nutzungsverhalten mehrerer User innerhalb einer Shell simulieren kann. Dabei ist mir schon relativ früh aufgefallen, das die Passworteingabe mittels:
su [username]
nicht auf anhieb funktionieren will...
Das Ganze sieht im Teilausschnitt so aus:
su [username]
12345
cd /tmp
echo 'hier wird eine Testnachricht erzeugt' >> nachr-alice
exit
12345 soll das Passwort sein aber die Shell kann damit nichts anfangen. Ich erhalte nach dem Ausführen stetts einen Error von der Shell:
su:Authentication failure
aufgabe1.sh: line 2 12345: command not found
nachdem per exit der User wieder ausgeloggt wird, wird sich ein neuer User einloggen und das wechselt also im prinzip die ganze Zeit.
Hat jemand schon ein ähnliches Problem lösen können?
Außerdem sollte ich erwähnen das keine externen Pakete installiert werden können.
Vielen dank für eure Antworten :)
4 Antworten
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.
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...
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).
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.
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.
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!
Im letzten Fall könnte das Script schritt_1 etwa so aussehen:
#!/usr/bin/env sh
cd /tmp
echo "nachricht"
>>nachr-$USER
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.
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 :'(
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 .
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“!
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?