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

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


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


下面是一个如何使用expect工具的示例:

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系统或Windows平台上使用pageant和pscp实现。


如果您从Windows连接到服务器,Putty版本的scp(“pscp”)允许您使用-pw参数传递密码。

这里的文档中提到了这一点。


只需生成一个SSH密钥:

ssh-keygen -t rsa -C "your_email@youremail.com"

复制~/.ssh/id_rsa.pub的内容 最后将它添加到远程计算机~/.ssh/authorized_keys

确保远程机器拥有~的权限0700。~/.ssh/authorized_keys文件夹为0600


使用sshpass:

sshpass -p "password" scp -r user@example.com:/some/remote/path /some/local/path

所以密码不会显示在bash历史记录中

sshpass -f "/path/to/passwordfile" scp -r user@example.com:/some/remote/path /some/local/path

上面的操作将路径的内容从远程主机复制到本地。

安装:

ubuntu / debian 安装sshpass centos / fedora Yum安装sshpass MAC / macports 端口安装sshpass MAC / brew brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb


您可以在unix/terminal上使用'expect'脚本

例如,创建'test。经验值:

#!/usr/bin/expect
        spawn scp  /usr/bin/file.txt root@<ServerLocation>:/home
        set pass "Your_Password"
        expect {
        password: {send "$pass\r"; exp_continue}
                  }

运行脚本

expect test.exp 

我希望这对你有所帮助。


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

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

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


确保你有“期望”工具之前,如果没有,就这样做 # apt-get install expect 创建具有以下内容的脚本文件。(# vi /root/脚本文件) 生成SCP /path_from/file_name user_name_here@to_host_name:/path_to 预计“密码: 发送put_password_here \ n; 交互 使用“expect”工具执行脚本文件 # expect /root/scriptfile


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

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


您可以使用ssh-copy-id添加ssh密钥:

$which ssh-copy-id #check whether it exists

如果存在:

ssh-copy-id  "user@remote-system"

一旦像上面解释的那样设置了ssh-keygen,就可以这样做了

SCP -i ~/。Ssh /id_rsa /local/path/to/file remote@ip.com:/path/in/remote/server/

如果希望减少每次输入的次数,可以修改.bash_profile文件并将

alias remote_scp='scp -i ~/.ssh/id_rsa /local/path/to/file remote@ip.com:/path/in/remote/server/

然后从您的终端执行source ~/.bash_profile。然后,如果您在终端中输入remote_scp,它应该运行没有密码的scp命令。


Curl可以用作SCP的替代方案来复制文件,并且它支持在命令行上设置密码。

curl --insecure --user username:password -T /path/to/sourcefile sftp://desthost/path/

上面提到的所有解决方案都可以工作,只有当你安装了应用程序,或者你应该有管理权限安装除sshpass。

我发现这个非常有用的链接可以简单地在后台启动scp。

$ nohup scp file_to_copy user@server:/path/to/copy/the/file > nohup.out 2>&1

https://charmyin.github.io/scp/2014/10/07/run-scp-in-background/


下面是基于这篇博文的一个穷人的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

Make sure password authentication is enabled on the target server. If it runs Ubuntu, then open /etc/ssh/sshd_config on the server, find lines PasswordAuthentication=no and comment all them out (put # at the start of the line), save the file and run sudo systemctl restart ssh to apply the configuration. If there is no such line then you're done. Add -o PreferredAuthentications="password" to your scp command, e.g.: scp -o PreferredAuthentications="password" /path/to/file user@server:/destination/directory


如果你观察到一个严格的主机密钥检查错误,那么使用-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null选项。

完整示例如下 sshpass -p "password" scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@domain-name.com:/tmp/from/psoutput /tmp/to/psoutput


将文件从一个服务器复制到另一个服务器(在脚本上)

在ubuntu或其他Linux机器上安装putty。Putty随pscp附带。我们可以用pscp复制文件。

apt-get update
apt-get install putty 
echo n |  pscp -pw "Password@1234" -r user_name@source_server_IP:/copy_file_path/files /path_to_copy/files

有关更多选项,请参阅pscp help。


您可以使用以下步骤。这对我很管用!

步骤1 - 创建一个普通的文件,假设“fileWithScpPassword”,其中包含目标服务器的ssh密码。

Step2-使用sshpaas -f后跟密码文件名,然后是正常的scp命令。

sshpass -f“scppassword”scp / filepathtou上传user@ip:/目的地目的地/


我有一个简单的方法:

使用相同的scp cmd,因为您使用ssh密钥,即

scp -C -i <path_to打开sshkey> <'local file_path'> user@<ip_address_VM>: <'remote file_path'>

用于从本地传输文件到远程

但是不要提供正确的<path_to_opensshkey>,而是使用一些垃圾路径。由于错误的密钥路径,您将被要求输入密码,而不是你现在可以简单地通过密码来完成工作!


从Windows以非交互方式使用SCP:

安装社区版netcmdlets 导入模块 使用Send-PowerShellServerFile -AuthMode password -User MyUser -Password not-secure -Server YourServer -LocalFile C:\downloads\test.txt -RemoteFile C:\temp\test.txt发送非交互式密码的文件