Schrift
[thread]8852[/thread]

lesen/schreiben auf /dev/tty

Leser: 1


<< >> 7 Einträge, 1 Seite
Gast Gast
 2007-03-20 13:49
#75147 #75147
Hallo liebe Perl Community!

Ich möchte in meinem perl Skript den Befehl sshfs starten und dann diesem Befehl eine Eingabe übergeben.

sshfs fordert nach dem Start wie ssh ein Passwort an. Wie kann ich diese Aufforderung nachkommen in dem ich ein GTK Entry Feld auslese und dann auf den Eingabe Stream des Kommandos ausgebe. (der Stream ist scheinbar nicht stdin sondern /dev/tty)

Verwendet unter Debian Linux.

Ich suche nun schon seit gut 2 Wocher nach einer Lösung hierfür und vermute dass es mit IO:pty zu schaffen ist, komme aber nicht zum Ziel.

Vielen Dank

david
Taulmarill
 2007-03-20 18:55
#75148 #75148
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
mit CPAN:Expect kann man interaktive Programme recht gut steuern.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
davewood
 2007-03-21 09:50
#75149 #75149
User since
2007-03-21
3 Artikel
BenutzerIn
[default_avatar]
Das stimmt und wurde mir auch bereits empfohlen aber aus zweierlei Gründen habe ich diesen Ansatz bisher nicht verfolgt.

1) Ich will ja nicht einem interaktiven Programm vorgaukeln dass da ein Mensch sitzt, denn es sitzt wirklich ein Mensch da, ich will nur den Input/Output weiterleiten. Ein Proxy quasi.

2) Ich will wissen wie/wo die Daten gelesen und geschrieben werden, auf welchen file-deskriptoren. Mir fehlt das Verständnis für TTYs, PTYs etc und soviel ich auch lese ich komme (noch) nicht dahinter.\n\n

<!--EDIT|davewood|1174463445-->
davewood
 2007-03-21 17:10
#75150 #75150
User since
2007-03-21
3 Artikel
BenutzerIn
[default_avatar]
Hab nun einen Tag mit Expect gespielt :)
Code (perl): (dl )
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
#!/usr/bin/perl -w
use strict;
use warnings;
use Expect;

# command and parameters to execute
my $command = "sshfs";
my @params = ("user\@server:/home/user", "~/remote_home");

# data to be sent by expect
my $password = "********";

# spawn a new command
my $exp=new Expect();
$exp->debug(3); # 0,1,2,3
$exp->spawn($command, @params) || die "Error: Cannot spawn process. $!\n";

# wait for the password prompt
$exp->expect(5,-re=>'assword:') or die "No password prompt\n";
#print("\nError: " . $exp->error() . "\n");

# send password
$exp->send("$password\n");

$exp->soft_close();

exit(0);


Leider funktioniert das nicht

Debug Output
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
localuser@vigo:~/perl$ ./expect.pl
Spawned 'sshfs user@server:/home/user /home/localuser/home'
spawn id(3)
Pid: 8937
Tty: /dev/pts/1
at /usr/share/perl5/Expect.pm line 164
Expect::spawn('Expect=GLOB(0x8345394)', 'sshfs', 'user@server:/home/user', '/home/localuser/home') called at ./expect.pl line 17
Starting EXPECT pattern matching...
at /usr/share/perl5/Expect.pm line 533
Expect::expect('Expect=GLOB(0x8345394)', 5, '-re', 'assword:') called at ./expect.pl line 26
user@server's password: Closing spawn id(3).
at /usr/share/perl5/Expect.pm line 1311
Expect::soft_close('Expect=GLOB(0x8345394)') called at ./expect.pl line 32

Got EOF from spawn id(3).
spawn id(3) closed.
Pid 8937 of spawn id(3) exited, Status: 0x00
Closing spawn id(3).
at /usr/share/perl5/Expect.pm line 1388
Expect::hard_close('Expect=GLOB(0x8345394)') called at /usr/share/perl5/Expect.pm line 1578
Expect::DESTROY('Expect=GLOB(0x8345394)') called at ./expect.pl line 0
eval {...} called at ./expect.pl line 0
localuser@vigo:~/perl$
\n\n

<!--EDIT|davewood|1174489930-->
PerlProfi
 2007-03-21 20:03
#75151 #75151
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Vielleicht solltest du mal 1 Sekunde warten, bevor du nach dem Passwort Prompt suchst.
Hab aber keine Ahnung ob das was bringt.

MfG
davewood
 2007-03-22 15:01
#75152 #75152
User since
2007-03-21
3 Artikel
BenutzerIn
[default_avatar]
Nein hat auch nichts gebracht.
betterworld
 2007-03-23 06:01
#75153 #75153
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Hmm, ich habe das Programm nicht installiert und aus dem Debug-Output werde ich auch nicht ganz schlau, aber versuch doch vielleicht einfach mal, die Zeile mit ->expect wegzulassen und stattdessen ein paar Sekunden zu warten.

Quote
1) Ich will ja nicht einem interaktiven Programm vorgaukeln dass da ein Mensch sitzt, denn es sitzt wirklich ein Mensch da, ich will nur den Input/Output weiterleiten. Ein Proxy quasi.

Im gewissen Sinne kommst Du nicht darum herum, dem Programm irgend etwas vorzugaukeln. Wenn das Programm von einem gewoehnlichen (Pseudo-)Terminal (wie xterm) etwas liest, muss ueblicherweise immer eine Eingabe vom Benutzer stattfinden. Expect hingegen baut ein Pseudoterminal auf, welches keinen Benutzer braucht.
<< >> 7 Einträge, 1 Seite



View all threads created 2007-03-20 13:49.