|
Posted by jammer on March 27, 2008, 2:47 pm
Please log in for more thread options >
> > I am trying to write a script that takes a list of hosts and sshs into
> > the first one and then can ssh to other ones. I can only ssh to the
> > other hosts from the first host.
>
> > Here is what I tried:
> > I think it is waiting for the ssh to the first host to finish.
>
> > I guess I could scp a partial hostlist and a program to *.domain and
> > then run the program remotely.
> > Am I on a right track?
>
> No. Step back a minute and consider how you would do this without Perl:
> what you want to end up running is
>
> ssh host1.domain ssh host2 uname -a
>
> assuming ssh is in your default PATH on host1.domain. What you actually
> end up running, here (or would if it weren't commented),
>
> > # print `ssh $line`;
>
> is
>
> ssh host1.domain
>
> with no command specified. This will give you a shell; while it would be
> possible to remote-control that shell, it's much easier to use ssh's
> ability to run a command directly. You want something like
>
> open my $HOSTLIST, '<', 'hostlist3.txt'
> or die "can't open hostlist3.txt: $!";
>
> $/ = ''; # this will read a paragraph at a time
> $\ = "\n"; # avoids needing to print it all the time
>
> while (<$HOSTLIST>) {
> my $cmd = join ' ', map "ssh $_", split /\n/;
> $cmd .= ' uname -a';
> print "executing '$cmd'";
> print `$cmd`;
> }
>
> which will cope with any number of intervening hosts automatically. Note
> that this assumes none of the items in hostlist3.txt have spaces in:
> annoyingly, there isn't a form of backticks corresponding to system
> LIST, so that would be rather harder to deal with.
>
> Ben
Here is my next attempt:
#!/bin/perl
use strict;
my $inputFile = 'hostlist3.txt';
open my $HOSTLIST, '<', $inputFile
or die "can't open hostlist: $!";
$/ = ''; # this will read a paragraph at a time
$\ = "\n"; # avoids needing to print it all the time
while (<$HOSTLIST>) {
my @hostList = split /\n/;
my $adminHost = shift( @hostList ); # first line
print 'adminHost=' . $adminHost;
my $otherHosts = join ' ', map "ssh $_ uname -a", @hostList;
my $cmd = "ssh ccn\@$adminHost $otherHosts";
print "executing '$cmd'";
print `$cmd`;
}
The problem is that I can't seem to run more than one command from
ssh.
I don't really want to open and ssh connection for each otherHosts.
What if hostlist3.txt is:
host1.domain
host2
host3
host4.domain
...
I need 'ssh host1.domain ssh host2 uname -a ssh host3 uname -a'.
I can do 'ssh host1.domain ssh host2 uname -a' and 'ssh host1.domain
ssh host3 uname -a' but I'd rather not ssh to host1.domain more than
once.
|