how to give user name and password as a input in s

2019-08-10 16:24发布

问题:

I am trying to copy a files from one host to another host using :

  Net::SCP::Expect

here is my program.

use strict;
use Net::SCP::Expect;

print "enter user name\n";
my $username = <>;

print "enter password\n";
my $pass = <>;


print "enter host name\n";
my $host = <>;

my $src_path = "/";
my $dst_path = "/";




my $scpe = Net::SCP::Expect->new(user=>$username, password=>$pass,     auto_yes=> '1');
$scpe->scp($host.":".$src_path, $dst_path);

I am getting error as bad password.how to give user name and password as a input in scp module?

回答1:

All three variables you are reading also contain the \n at the end.

Remove it with chomp

chomp $username;
chomp $pass;
chomp $host;

Beware that the password will be visible on the user's screen. You could take a look at Term::ReadPassword to avoid echoing of the characters on the screen.

Edit

chomp modifies the supplied variable and return the number of characters removed. In your case chomp($username) will return 1 as it removed one character. You have to call it before scp

#!/usr/bin/perl
use strict;
use warnings;

use Net::SCP::Expect;

print "enter user name\n";
my $username = <>;
chomp($username);             ### Here

print "enter password\n";
my $pass = <>;
chomp($pass);                 ### Here

print "enter host name\n";
my $host = <>;
chomp($host);                 ### Here

my $src_path = '/';
my $dst_path = '/';

my $scpe = Net::SCP::Expect->new(
    user     => $username,
    password => $pass,
    auto_yes => '1'
);
$scpe->scp( $host . ':' . $src_path, $dst_path );

From the linked documentation (emphasis mine)

    chomp( LIST )
    chomp   This safer version of "chop" removes any trailing string that
            corresponds to the current value of $/ (also known as
            $INPUT_RECORD_SEPARATOR in the "English" module). It returns the
            total number of characters removed from all its arguments. It's
            often used to remove the newline from the end of an input record
            when you're worried that the final record may be missing its
            newline. When in paragraph mode ("$/ = """), it removes all
            trailing newlines from the string. When in slurp mode ("$/ =
            undef") or fixed-length record mode ($/ is a reference to an
            integer or the like; see perlvar) chomp() won't remove anything.
            If VARIABLE is omitted, it chomps $_. Example:

                while () {
                    chomp;  # avoid \n on last field
                    @array = split(/:/);
                    # ...
                }

            If VARIABLE is a hash, it chomps the hash's values, but not its
            keys, resetting the "each" iterator in the process.

            You can actually chomp anything that's an lvalue, including an
            assignment:

                chomp($cwd = `pwd`);
                chomp($answer = );

            If you chomp a list, each element is chomped, and the total number
            of characters removed is returned.

            Note that parentheses are necessary when you're chomping anything
            that is not a simple variable. This is because "chomp $cwd =
            `pwd`;" is interpreted as "(chomp $cwd) = `pwd`;", rather than as
            "chomp( $cwd = `pwd` )" which you might expect. Similarly, "chomp
            $a, $b" is interpreted as "chomp($a), $b" rather than as
            "chomp($a, $b)".