Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Net::SSH::Perl push variable into remote file

by rtech0 (Initiate)
on Jul 28, 2016 at 03:14 UTC ( [id://1168696]=perlquestion: print w/replies, xml ) Need Help??

rtech0 has asked for the wisdom of the Perl Monks concerning the following question:

Hi,

I am trying to grab the contents of ~/username/.ssh/id_rsa.pub into a variable and copy it so a user on the remote machine in /home/remoteusername/.ssh/authorized_keys. I have the file already in a variable via:

my $fnpubcert = "/home/localusername/.ssh/id_rsa.pub"; open my $fhpubcert, '<', $fnpubcert or die "error opening $fnpubcert $ +!"; my $mypubcert = do { local $/; <$fhpubcert> };

If I try this is creates the files but empty (I am sure you know why). Please advise:

my $cmd = "echo $mypubcert > /home/remoteusername/.ssh/authorized_keys +"; my ($stdout,$stderr,$exit) = $ssh->cmd("$cmd"); if ($stdout || $stderr) { print "STDOUT: $stdout STDERROR: $stderr\n"; + } my $cmd = 'chown remoteusername.remoteusername /home/remoteusername/.s +sh/authorized_keys; chmod 600 /home/remoteusername/.ssh/authorized_ke +ys'; my ($stdout,$stderr,$exit) = $ssh->cmd("$cmd"); if ($stdout || $stderr) { print "STDOUT: $stdout STDERROR: $stderr\n"; + }

ps I thought it might be this but doesn't work:

my $cmd = "cat > /home/vmsys/.ssh/authorized_keys"; print $mypubcert | my ($stdout,$stderr,$exit) = $ssh->cmd("$cmd");

Thank y'all in advance!

Replies are listed 'Best First'.
Re: Net::SSH::Perl push variable into remote file
by Corion (Patriarch) on Jul 28, 2016 at 07:34 UTC

    This is much more a shell question than a Perl question, but as Perl file operators are quite similar to shell file operators, it's still valid..

    To append to a file, use >> (or open my $fh, '>>', ... ) instead of > alone.

    On the other hand, the pipe character is used for output piping in the shell, but is a logic operator in Perl. So print | $fh does not work. The syntax for printing to a filehandle is print { $fh } $string;, see also print.

    You don't show what SSH module you're using, so I'll assume Net::OpenSSH:

    my $cmd = "cat >> /home/vmsys/.ssh/authorized_keys"; my ($stdin, $stdout,$stderr,$pid) = $ssh->open_ex("$cmd"); print { $stdin } $mypubcert;
Re: Net::SSH::Perl push variable into remote file
by hippo (Bishop) on Jul 29, 2016 at 09:12 UTC

    See ssh-copy-id. No need to go reinventing that particular wheel.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1168696]
Approved by beech
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (5)
As of 2024-03-28 23:46 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found