如何将密码传递给scp?

时间:2020-03-05 18:49:27  来源:igfitidea点击:

我知道不建议这样做,但是是否可以将用户密码传递给scp?

作为批处理作业的一部分,我想通过scp复制文件,接收服务器当然需要密码,不,我不能轻易地将其更改为基于密钥的身份验证。

解决方案

回答

我们可以使用诸如Expect之类的工具编写脚本(也有方便的绑定,例如Pexpect for Python)。

回答

以下是使用"期望"工具的方法示例:

sub copyover {
    $scp=Expect->spawn("/usr/bin/scp ${srcpath}/$file $who:${destpath}
+/$file");
    $scp->expect(30,"ssword: ") || die "Never got password prompt from
+ $dest:$!\n";
    print $scp 'password' . "\n";
    $scp->expect(30,"-re",'$\s') || die "Never got prompt from parent 
+system:$!\n";
    $scp->soft_close();
    return;
}

回答

一种替代方法是将用户密钥的公共一半添加到目标系统上的授权密钥文件中。在从其开始传输的系统上,我们可以运行ssh-agent守护程序并将密钥的私有一半添加到代理。然后可以将批处理作业配置为使用代理来获取私钥,而不是提示输入密钥的密码。

这应该可以在UNIX / Linux系统上或者在使用Pageant和pscp的Windows平台上执行。

回答

如果要从Windows连接到服务器,则使用Putty版本的scp(" pscp")可以使用-pw参数传递密码。

在此处的文档中对此进行了提及。