问题描述
我正在尝试使用以下命令将文件从一台主机复制到另一台主机:
I am trying to copy a files from one host to another host using :
Net::SCP::Expect
这是我的程序.
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);
我收到错误的密码错误.如何在scp模块中输入用户名和密码?
I am getting error as bad password.how to give user name and password as a input in scp module?
推荐答案
您正在读取的所有三个变量的末尾也包含\n
.
All three variables you are reading also contain the \n
at the end.
使用 chomp
chomp $username;
chomp $pass;
chomp $host;
请注意,密码将在用户的屏幕上可见.您可以查看 Term :: ReadPassword 以避免在屏幕上回显字符.
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.
修改
chomp
修改提供的变量并返回删除的字符数.在您的情况下,chomp($username)
将返回1,因为它删除了一个字符.您必须在scp
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)".
这篇关于如何在scp模块中提供用户名和密码作为输入?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!