[gelöst] expect, telnet und Befehl ausführen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

[gelöst] expect, telnet und Befehl ausführen

Beitrag von detix » 10.12.2007 19:59:16

Hab vieles durchprobiert, es wiil einfach nicht funktionieren.
Der Befehl:

expect -c "spawn telnet dbox; expect *login; send root\r; expect Password:; send dbox\r; expect BusyBox*; exec killall -9 streampes\r"

gibt mir einen automatischen root-Login auf meiner dbox, soweit klappts,
leider wird aber der Befehl auf den es mir ankommt nicht ausgeführt
killall -9 streampes
entweder gibt es Syntaxerrors von expect, oder 'Kein Prozess abgebrochen'.
Obwohl in einer 2ten Telnetsitzung mit gestartetem top der Prozess zu sehen ist
und hier mit demselben Befehl auch zu beenden ist.
Zuletzt geändert von detix am 11.12.2007 17:44:46, insgesamt 1-mal geändert.
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Ogion
Beiträge: 221
Registriert: 08.04.2007 12:42:55

Beitrag von Ogion » 10.12.2007 20:11:14

Versuchs doch mal, das ganze in ein Script zu packen.
Ich hab beispielsweise für einen automatischen telnetlogin folgendes script:

Code: Alles auswählen

#!/usr/bin/expect -f 
set timeout 20
set  send_slow {5  .001}
set USERNAME "meinnick" 
set PASSWORD "meinpasswort"
spawn telnet ip_des_Servers
expect "Username: "
send "$USERNAME\r"
expect "Password: "
send -s "$PASSWORD\r"
Bei mir schließt der Telnetserver direkt nach der Passworteingabe die Sitzung wieder und gibt mir das Internet frei, wenn aber die Sitzung nicht gleich geschlossen wird, dann kann man ja weitere Befehle ranhängen. Übrigens taucht dann auch nicht dein Passwort im Befehl auf...

Ogion
"Aufklärung ist der Ausgang des Menschen aus seiner selbst verschuldeten Unmündigkeit." - Immanuel Kant
"Wer grundlegende Freiheiten aufgibt, um vorübergehend ein wenig Sicherheit zu gewinnen, verdient weder Freiheit noch
Sicherheit." - Benjamin Franklin

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 11.12.2007 11:27:08

Hi,

ich koennte ein Perl Script anbieten, das sich per SSH oder Telnet auf einem Server einloggt, und dir anschliessend eine Konsole zur Verfuegung stellt:

Code: Alles auswählen

#!/usr/bin/perl
# Expect Perlmodule installieren:
# $ perl -MCPAN -e shell
# cpam> i /Expect/ # zeigt eine Trefferliste von Modulen die Expect "enthalten"
# cpan> install Expect # Installiert das Modul Expect
# cpan> exit
use strict;
use Expect;
my $host = shift or die("use: lmi host");
my $pwdfile = $ENV{’HOME’}. "/.lmi";
my $timeout = 10;
my $user;
my $passwd;
my $prog;
# read password file
open IN, "<$pwdfile" or die("could not open $pwdfile!\n");
while (<IN>)
{
  my $line = $_;
  # print $line;
  if ($line =~ m/$host\s/){
   # (grep( /^$host\s/, ’ERROR[Unused arguments - too many, or wrong type] in:<IN>’))[0]
   # or die("no entry in $pwdfile!\n");
   ($user, $passwd, $prog) = (split( /\s+/, $line))[1,2,3];
  }
}
close(IN);
if (! $user){
 die("no entry in $pwdfile!\n");
}
my $exp;
if($prog =~ m/ssh/){
 print "ssh -------- \n";
 # start program
 my $connect_string = $user . "@" . $host;
 $exp = Expect->spawn($prog, $connect_string)
 or die("Cannot spawn $prog: $!\n");
}
else{
 print "kein ssh -------- \n";
 # start program
 $exp = Expect->spawn($prog, $host)
 or die("Cannot spawn $prog: $!\n");
 # Wait for login prompt
 $exp->expect($timeout, ’ogin’) or die("No ’login’ prompt");
 $exp->send("$user\n");
}
# Wait for password prompt
$exp->expect($timeout, -re => ’[Pp]assword’) or die("No ’password’ prompt"); $exp->send("$passwd\n");
# Wait for shell
$exp->expect($timeout, ’$’) or die("1No prompt!\n");
# Setup environment
$exp->send("PS1=’MyPrompt:) ’\n");
$exp->expect($timeout, ’MyPrompt’) or die("2No prompt!\n");
# switch to interactive session
$exp->interact();
Die dazugehoerige Passwortdatei sieht folgendermassen aus:

Code: Alles auswählen

#host user password tool
127.0.0.1 foo bar /usr/bin/telnet
example.com kaese mumpitz /usr/bin/ssh
Die entsprechenden Stellen an denen auf z.B. den Prompt gewartet wird, muesstest du halt anpassen.

Das ist allerdings nicht auf meinem Miste gewachsen, sondern ich hab's irgendwann mal irgendwo gefunden.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Beitrag von detix » 11.12.2007 17:44:02

Danke euch beiden,
hab vieles durchprobiert, aber Eines offensichtlich nicht:

expect -c "spawn telnet dbox; expect *login; send root\r; expect Password:; send dbox\r; expect >; send \"killall -9 streampes\r\"; expect >"

so wird der Befehl automatisch ausgeführt und telnet wieder beendet. :D
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Antworten