Schrift
[thread]12666[/thread]

Problem mit Net::SSH::Perl (Seite 2)

Leser: 5


<< |< 1 2 >| >> 17 Einträge, 2 Seiten
tecker
 2008-10-23 16:34
#115720 #115720
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ok habs mal getestet und vom Prinzip funktioniert es genauso wie das Skript von mir was ich oben geprstet habe. Problem auch hier ist ... die Passwörter die ich eingebe um sie auf dem Remote-Rechner zu ändern werden bei der EIngabe im Klartext angezeigt.

Code: (dl )
1
2
3
4
5
6
7
8
use strict;
use warnings;

use Net::SSH qw(ssh issh sshopen2);

my $command="passwd USERNAME";

issh('USERNAME@HOSTNAME', $command);


Gleiches gilt für

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl

use strict;
use warnings;

use Net::SSH qw(ssh issh sshopen2);

my $user = "USERNAME";
my $host = "HOSTNAME";
my $cmd = "passwd USERNAME";

sshopen2("$user\@$host", *READER, *WRITER, "$cmd") || die "ssh: $!";

while (<READER>) {
chomp();
print "$_\n";
}

close(READER);
close(WRITER);


Ich seh schon ich muss weiter an meiner Single-Sign-On Lösung mit openldap basteln :(
nepos
 2008-10-23 16:45
#115722 #115722
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hm, was genau willst du eigentlich erreichen?
Prinzipiell gaebe es da ja auch noch NIS, wenns dir drum geht User auf mehreren Rechnern konsistent zu halten.
tecker
 2008-10-23 17:07
#115724 #115724
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Im Grunde geht es darum Benutzerkonten in unserer Abteilung auf sämtlichen Rechnern und Servern zentral zu verwalten bzw. in Zukunft dann auch Single Sign On zu realisieren. Es soll ermgölicht werden das Benutzer-Passwörter auf allen Maschinen aller X Monate oder nach Belieben geändert werden können ohne jede Maschine einzeln anfassen zu müssen. Beschäftige mich daher seit einer Weile mit OpenLDAP (im Grunde die Ablöse von NIS) und unter Debian-Systemen läufts inzwischen . Solaris stellt sich da etwas quer :)

Diese SSH Sache sollte vorübergehend eingerichtet werden.
nepos
 2008-10-23 17:34
#115726 #115726
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ahso :)

Hab heut auch nochmal mit Mat::Pari rumgespielt, aber ich kriegs leider nicht gebaut und mein Wissen um das Debian-Packaging-System reichen da leider nicht aus...
tecker
 2008-11-24 16:43
#116570 #116570
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Muss den Beitrag mal wieder hervor holen, da das Thema wieder aktuell für mich ist. Die Frage bezieht sich im Grunde auf meinen anderen Beitrag von heute (http://board.perl-community.de/thread/12812/#MSG2)

Ich arbeite mit Net::SSH::Perl, was auch inzwischen funktioniert. Geht darum User-Passwörter skriptgesteuert per SSH und passwd-Befehl zu ändern (nicht interaktiv). Soll also hintereinander durchlaufen. Funktioniert ohne Probleme bei Debian-Hosts.

Solaris Hosts mögen es wohl nicht, wenn man passwd per ssh aufruft, es sei denn man erzwingt eine pseudo TTY.

Code: (dl )
ssh USER@SOLARISHOST passwd
geht nicht.


Code: (dl )
ssh -t USER@SOLARISHOST passwd
geht.

Nun meine Frage .... wie kann ich das im Skript umsetzen mit dem Net::SSH::Perl Modul? Noch keinen Erfolg brachten die %params "interactive => 1, use_pty => 1"

Hatte auch schon mit Term::Readkey rumprobiert, aber bislang noch keine passende Lösung hinbekommen.


Danke.


Mein Skript:



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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/usr/bin/perl

use strict;
use warnings;
use Net::SSH::Perl;
use Math::BigInt::GMP;
use Term::ReadKey;

my $host = "IPADRESSE";
my $username = "USERNAME";
my $old_password = "PASSWORD_ALT";
my $new_password = "PASSWORD_NEU";

my $ssh = Net::SSH::Perl->new(  $host,
                                debug => 1,
                                protocol => '2',
                                #use_pty => 1,
                                #interactive => 1,
                                options => ["UsePrivilegedPort no"]);

$ssh->login($username, $old_password);


# Testen welches OS

my ($stdout, $stderr, $exit) = $ssh->cmd('uname');


chomp $stdout;
if   ( $stdout eq "SunOS") { &solaris; }
else                       { &linux;   }

print "Betriebssystem: $stdout \n";


sub solaris
{

        $ssh->register_handler("stderr", sub {
        my($channel, $buffer) = @_;
        my $str = $buffer->bytes;
        print "STRING $str\n";



       if ($str eq "Enter existing login password:") {
       print "Enter exisiting \n";
       $channel->send_data($old_password);
       }

       elsif ($str eq "New Password:") {
       print "New \n";
       $channel->send_data($new_password);
       }

       elsif ($str eq "Re-enter new Password:") {
       print "New again \n";
       $channel->send_data($new_password);
       }
       });
}

sub linux

{

    $ssh->register_handler("stderr", sub {
    my($channel, $buffer) = @_;
    my $str = $buffer->bytes;
    print "STRING $str \n";
    if ($str eq "(current) UNIX password: ") {
        $channel->send_data($old_password);
    }

    elsif ($str eq "Enter new password: ") {
        $channel->send_data($new_password);
    }

    elsif ($str eq "Re-type new password: ") {
        $channel->send_data($new_password);
    }
    });
}

$ssh->cmd('passwd');
tecker
 2008-11-25 16:52
#116596 #116596
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hmmmm keiner eine Idee? :-(


http://www.derkeiler.com/Newsgroups/comp.security....


Genau das dort beschriebene ist mein Problem. Nur das ich auf einem Debian System und nicht Windows arbeite. Aber Lösungen gibt es irgenwie keine.
tecker
 2008-11-26 16:55
#116631 #116631
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
"Was lange wehrt ...."

Habs hinbekommen und bastel grad noch an einem schicken Interface um alles mit Perl/CGI zu machen.

Wen es interessiert ... mein funktionierendes Skript:

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
28
29
30
31
32
33
34
35
#!/usr/bin/perl

use warnings;
use strict;
use CGI;
use CGI::Carp qw(fatalsToBrowser);

my $user = $ARGV[0];
my $password_old = $ARGV[1];
my $password_new = $ARGV[2];
my $host = $ARGV[3];

use Net::SSH::Expect;

my $ssh = Net::SSH::Expect->new (

   host => "$host",
   user => "$user",
   password => "$password_old",
   raw_pty => 1,

);

my $login_output = $ssh->login();

$ssh->exec("stty raw -echo");

$ssh->send("passwd");
$ssh->waitfor('password:\s*\z', 1) or die "prompt 'password' not found after 1 second";
$ssh->send("$password_old");
$ssh->waitfor(':\s*\z', 1) or die "prompt 'New password:' not found";
$ssh->send("$password_new");
$ssh->waitfor(':\s*\z', 1) or die "prompt 'Confirm new password:' not found";
$ssh->send("$password_new");
my ($before_match, $match) = $ssh->waitfor('>\s*\z', 1);  # waitfor() in a list context
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2008-10-22 17:30.