如何将密码传递给scp?

时间:2008-09-08 16:35:09

标签: linux batch-file io-redirection

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

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

19 个答案:

答案 0 :(得分:425)

使用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的
    • apt install sshpass
  • 的centos / fedora的
    • yum install sshpass
  • mac w / macports
    • port install sshpass
  • mac w / brew
    • brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master‌​/Library/Formula/ssh‌​pass.rb

答案 1 :(得分:40)

只需生成一个ssh键,如:

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

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

确保远程计算机具有权限0700 for ~./ssh folder0600 for ~/.ssh/authorized_keys

答案 2 :(得分:32)

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

This is mentioned in the documentation here.

答案 3 :(得分:25)

您可以使用expect之类的工具编写脚本(也有方便的绑定,例如Python的Pexpect)。

答案 4 :(得分:18)

您可以在unix / terminal

上使用'expect'脚本

例如,创建'test.exp':

#!/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 

我希望有所帮助。

答案 5 :(得分:14)

curl可以用作scp的替代方法来复制文件,它在命令行上支持密码。

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

答案 6 :(得分:9)

以下是使用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;
}

答案 7 :(得分:6)

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

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

答案 8 :(得分:3)

  1. 确保在目标服务器上启用了密码认证。如果它运行Ubuntu,则在服务器上打开/etc/ssh/sshd_config,找到PasswordAuthentication=no行并将其注释掉(在行的开头放置#),保存文件并运行{{ 1}}以应用配置。如果没有这样的行,那么您就完成了。
  2. sudo systemctl restart ssh添加到您的-o PreferredAuthentications="password"命令中,例如:
    scp

答案 9 :(得分:2)

  1. 确保您之前有“期待”工具,如果没有,请执行

    # apt-get install expect

  2. 使用以下内容创建脚本文件。 (#vi / root / scriptfile)

    spawn scp /path_from/file_name user_name_here@to_host_name:/path_to

    expect "password:"

    send put_password_here\n;

    interact

  3. 使用“expect”工具

    执行脚本文件

    # expect /root/scriptfile

答案 10 :(得分:2)

如上所述设置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命令而不使用密码。

答案 11 :(得分:1)

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

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

如果存在:

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

答案 12 :(得分:0)

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

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

答案 13 :(得分:0)

这里有个穷人的类似Linux / Python / Expect的示例,该博客基于Upgrading simple shells to fully interactive TTYs。对于无法安装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

答案 14 :(得分:0)

如果您发现严格的主机密钥检查错误,请使用-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

答案 15 :(得分:0)

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

在 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 帮助。

答案 16 :(得分:-1)

上述所有解决方案仅在安装了应用程序后才有效,或者您应该具有安装权限(sshpass或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/

答案 17 :(得分:-3)

获取sshpass的步骤对于rhel / centos 6:

def pick_date(date)
  @browser.td(aria_label: /#{date.strftime(%A, %B %e, %Y)}/).click
end

来源:https://community.mapr.com/thread/9040

答案 18 :(得分:-9)

我发现这真的很有帮助here

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

您不仅可以传递密码,还可以在复制时显示进度条。真棒。