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

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


当前回答

我在这里找到了一个非常有用的答案。

rsync -r -v --progress -e ssh user@remote-system:/address/to/remote/file /home/user/

你不仅可以在那里传递密码,而且它还会在复制时显示进度条。真的太棒了。

其他回答

您可以使用像expect这样的工具编写脚本(也有方便的绑定,比如Python的Pexpect)。

我在这里找到了一个非常有用的答案。

rsync -r -v --progress -e ssh user@remote-system:/address/to/remote/file /home/user/

你不仅可以在那里传递密码,而且它还会在复制时显示进度条。真的太棒了。

没有人提到它,但是Putty scp (pscp)有一个-pw选项作为密码。

文档可以在这里找到:https://the.earth.li/~sgtatham/putty/0.67/htmldoc/Chapter5.html#pscp

下面是基于这篇博文的一个穷人的Linux/Python/ expect样例:将简单的shell升级为完全交互式 tty。对于无法安装Expect或向Python添加模块的旧机器,我需要这个功能。

代码:

(
    echo 'scp jmudd@mysite.com:./install.sh .'
    sleep 5
    echo 'scp-passwd'
    sleep 5
    echo 'exit'
) |

python -c 'import pty; pty.spawn("/usr/bin/bash")'

输出:

scp jmudd@mysite.com:install.sh .
bash-4.2$ scp jmudd@mysite.com:install.sh .
Password: 
install.sh                                 100%   15KB 236.2KB/s   00:00    
bash-4.2$ exit
exit

另一种方法是将用户密钥的公共部分添加到目标系统上的授权密钥文件中。在发起传输的系统上,可以运行ssh-agent守护进程,并将密钥的私有部分添加到代理中。然后可以将批作业配置为使用代理获取私钥,而不是提示输入密钥的密码。

这应该可以在UNIX/Linux系统或Windows平台上使用pageant和pscp实现。