in reply to Net::OpenSSH::Parallel with sudo commands

Hello,

Looking at your problem:

# 1 Your @cmd contains sudo, but at sudo sub you are calling sudo, so +you can remove sudo from commands my @cmd = ( "ls /tmp" , "ls /var" , "ls /usr" ); # 2 You can bucle your commands and execute each of them # You need split by space your command, so system won't interpret argu +ments as part of the command: sub sudo { my ($label, $ssh, @cmd) = @_; foreach my $c (@cmd) { $ssh->system({stdin_data => "$sudo_passwords{$label}\n +"}, 'sudo', '-Skp', '', '--', split " ",$c); } }

A while ago, I wrote as_root script which doesn't use sudo, but su , maybe you can get some idea from there:

For parallelize such command I use pdsh

Take a look to ansible project which have sudo support

I think it is best to play with pubkeyauthentication (passwordauthentication for automatic tasks are not good idea).

I hope this help

Replies are listed 'Best First'.
Re^2: Net::OpenSSH::Parallel with sudo commands
by thanos1983 (Parson) on Dec 30, 2014 at 14:24 UTC

    Hello i5513,

    Thank you for your time and effort reviewing my code and all the suggestions that you proposed to me.

    Although the solution looks better than before, it still the output is not exactly what I was looking for.

    Sample of output:

    Enter LAN Password: Enter LAN Password: * Stopping NTP server ntpd ...done. * Stopping NTP server ntpd ...done. Enter LAN Password: Enter LAN Password: Enter LAN Password: * Startin +g NTP server ntpd ...done. ntpd: time slew +0.001779s Enter LAN Password: * Starting NTP server ntpd ...done.

    From what I see it dose not work exactly as it should. It is not updating twice the time.

    Well I was also considering the possibility to use this part of code:

    sub sudo_install { my ($label, $ssh, @pkgs) = @_; my ($pty) = $ssh->open2pty('sudo', 'apt-get', 'install', @pkgs); my $expect = Expect->init($pty); $expect->raw_pty(1); $expect->expect($timeout, ":"); $expect->send("$passwd\n"); $expect->expect($timeout, "\n"); $expect->raw_pty(0); while(<$expect>) { print }; close $expect; } $pssh->push('*', parsub => \&sudo_install, 'scummvm');

    I will try to make it work and I will let you know. Again thank you for your time and effort.

    Seeking for Perl wisdom...on the process of learning...not there...yet!