• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[solved] Tastatureingabe simulieren

Hi Leute
Ich möchte ein Script erstellen, in dem zunächst der Befehl "su" steht. Normalerweise würde ich nun bei der Ausführung des Scripts dabei sein müssen, und das Passwort eintippen und mit Enter bestätigen.

Nun möchte ich aber, dass das Script das Rootpasswort selbst eintippt (ja ich weiß, dass es ein Sicherheitsrisiko ist, wenn im Script das Passwort steht ;) ). Es soll zunächst die Eingabe des Passworts und dann das drücken der Enter-Taste selbst erledigen, mich als Benutzer, der vorm Rechner sitzt, also "simulieren" !

Ich hoffe mal, dass es ne Möglichkeit gibt, dies zu erledigen, und bitte nicht über Sinn oder Unsinn eines solchen Scripts diskutieren, sondern über die Realisierbarkeit :D

Cu
 

admine

Ultimate Guru
Wie du dein Prob realisieren kannst, weiß ich nicht.
Aber wäre nicht eher die Anwendung von "sudo" für dich besser ?
Dazu allerdings müsste man jetzt wissen, was in dem Script nach "su" passieren soll ;)
 
OP
L

Linux-Sinner

Member
Nach dem Befehl "su" will ich den Befehl "/sbin/rcfirestarter start" ausführen, womit ich meine Firewall namens Firestarter starte.

Wenn ich das allerdings mit sudo versuche, behauptet er, ich hätte kein iptables installiert, was natürlich Schwachsinn ist :( (ansonsten könnte ich dann ja ganz leicht die Datei "sudoers" mit "visudo" editieren und dort festlegen, dass ich für den Befehl kein Passwort eingeben muss :D)

Dieses expect scheint mir reichlich kompliziert zu sein, da bin ich als n00b leicht überfordert :/
Könnte vielleicht jemand so nett sein, und hier reinposten, wie der Expect-Script-Teil aussehen müsste, damit er z.B. das Passwort "lala" als Root-Passwort eintippt ? *mitbettelndemHundeblickherumguck*

*edit: Uhh, hab mir mal die man-page von expect durchgelesen, ist das ne eigene Programmiersprache oder so ? Und ist das dann gar kein Shellscript mehr, sondern ein expectscript, so dass man am Anfang statt #!/bin/sh eben #!/richtiger/pfad/expect reinschreiben muss ???
 

sc_m

Member
Ich denke, folgendes würde funktionieren:
Code:
#! /usr/bin/expect
spawn su - -c "/sbin/rcfirestarter start"
expect :
send "lala\n"
expect #
Das "#" in "expect #" sollte durch deinen root-Prompt ersetzt werden. Außerdem würde ich das nur als vorübergehende Lösung betrachten und lieber herausfinden, was mit sudo nicht funktioniert. (Kann ja eigentlich nur an den Umgebungsvariablen liegen, wenn ich nicht irre. Vielleicht am Pfad?)
 
A

Anonymous

Gast
Linux-Sinner schrieb:
Dieses expect scheint mir reichlich kompliziert zu sein, da bin ich als n00b leicht überfordert :/
Könnte vielleicht jemand so nett sein, und hier reinposten, wie der Expect-Script-Teil aussehen müsste, damit er z.B. das Passwort "lala" als Root-Passwort eintippt ? *mitbettelndemHundeblickherumguck*

Ich habe mal eine zeitlang solche Scripte erstellt, und habe heute nach mehreren Jahren immer noch welche als Cronjobs am laufen.
Hier habe ich mal ein kleines Script als Beispiel mal etwas vereinfacht und verkürzt, und die Userdaten geändert. Nur mal so als Demo, wie ein expect-Script überhaupt aussehen könnte und wie es funktioniert muss man in der Manpage nachlesen.( Hoffe ich habe es beim Ändern nicht alzusehr kaputt gemacht)

Code:
#!/usr/local/bin/expect --
#
set force_conservative 1  ;# set to 1 to force conservative mode even if
			  ;# script wasn't run conservatively originally
if {$force_conservative} {
	set send_slow {1 .1}
	proc send {ignore arg} {
		sleep .1
		exp_send -s -- $arg
	}
}
#

set PROMT "(.*):(.*)-> "
set LOGIN19 0

set timeout 60

spawn rlogin "baum19"
match_max 100000

while { $LOGIN19 < 1 } { 
expect {
   Password: { send -- "$PWD" };
   Kennwort: { send -- "$PWD" };
   -re "$PROMT"    { set LOGIN19 1 ; send -- "\r" };
   incorrect  { exit };
   busy       { exit };
   timeout    { exit };
   closed     { exit };
   Unreachable { exit };
   unknown { exit };
   "no answer" { exit };
 }
}
expect  -re "$PROMT"


if { 1 == $LOGIN19 } {
send -- "cd ~/user1/dump3\r"
expect -re "$PROMT"
send -- "(rcp *.dat 1??.2??.1?.1:/export/home/s/bin/server/ ) \r"
expect -re "$PROMT"
send -- "(rcp b_failed.log 1??.2??.1?.1:/export/home/s/bin/server/ ) \r"
expect -re "$PROMT"
send -- "(rcp m-DB-failed.log 1??.2??.1?.1:/export/home/s/bin/server/ ) \r"
expect -re "$PROMT"
send -- "(rm b_failed.log ) \r"
expect -re "$PROMT"
send -- "(rm m-DB-failed.log ) \r"
expect -re "$PROMT"
}

send -- "exit\r"
expect eof

Ohne jetzt im einzelnen darauf einzugehen macht das script folgendes, es meldet sich per rlogin am Rechner baum19 an und verwendet dort das Passwort das vorher in der Bash in die Variable "PWD" geladen wurde.
Auf diesem Rechner führt dann das script einige rcp und rm Befehle aus und dann beendet es die Verbindung und anschließend sich selbst.
Es ist eine etwas eigentümliche Scriptsprache, aber wenn man sich damit beschäftigt, und bei der Scripterstellung autoexpect als Hilfsmittel mit dazunimmt, dann wird man bald die Vorzüge einer solchen Sprache auch erkennen. :wink:

robi
 
OP
L

Linux-Sinner

Member
Ok, vielen Danke für eure Hilfe :)
Ich hab es nach langem rumwerkeln jetzt aber doch noch geschafft, es mit sudo zum laufen zu bringen :)
 
Oben