如何将密码传递给scp?


296

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

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


2
另请参阅(稍后)问题:stackoverflow.com/questions/1462284/…其中一个答案提到了另一种可行的方法。(注意:这不是重复的问题-它是其他重复的问题。)
Jonathan Leffler

Answers:



528

使用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
    • brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb

14
在Ubuntu 12.04上,它仅对我有用,并在密码上使用单引号(例如,“ password”而不是“ password”)。
odedfos 2014年

6
@odedfos,是的,您需要使用单引号,因为某些密码生成的字符可能在双引号字符串插值中有特殊的解释
TerryE 2014年

7
这就是您安装sshpass的方式apt-get install sshpass
Jan-

6
在CentOS上是yum -y install sshpass
jgritty

19
最安全的方法是使用密码文件,例如:sshpass -f passwdfile` scp . This way, the password won't show up in ps`清单等,您可以使用文件权限保护密码。
Christopher Schultz,2015年

49

只需生成一个ssh密钥,例如:

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

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

确保远程计算机具有权限,0700 for ~./ssh folder并且0600 for ~/.ssh/authorized_keys


35
如我所写:不,我不能轻易切换到基于密钥的身份验证。
Argelbargel'3

3
您是说.authorized_keys而不是。授权密钥?
HelloWorld

2
一个有效的用法是bash脚本,它对要向用户询问远程服务器密码的服务器执行多次scp / ssh调用。这样,密码将不会显示在历史记录中,并且您仍然可以挑战密码...但是只能选择一次。我不想使用密钥文件,因为我仍要验证脚本用户。
Wes Grant

2
如果您不能轻松地在目标上启用基于密钥的身份验证,则是另一种有效的用法。示例:NAS的主要生产商之一-带有DSM 6.0的Synology甚至在2016年都不支持它。当然,您可能会弄乱配置文件,并希望更新不会再次覆盖它(频繁更新DSM确实会破坏自定义修改)。有时候-特别是当OP明确写出他们已经意识到这不是最佳方法时-人们只需要一个解决方案。
Aaa

3
您应该使用ssh-copy-id -i ~/.ssh/id_rsa.pub <remote_server>该密钥在远程服务器上复制密钥
RousseauAlexandre

39

如果要从Windows连接到服务器,则使用Putty版本的scp(“ pscp”)可以通过密码输入密码。 -pw参数。

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


1
请显示一个例子。
SDsolar

另外,可能想在路径中添加C:\ Program Files(x86)\ PuTTY以使用这些命令。
SDsolar

1
@SDsolar这是一个语法示例:(pscp -pw 'MyPa$$word' username@servername:/somedir/somefile ~/somedest我讨厌这样使用腻子,但它能起作用)
祖母传

29

curl可以替代scp复制文件,并且它在命令行上支持密码。

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

它比'scp'慢很多,但是可以正常工作。
维克多

当目标配置有巨大的密码提示延迟时,我发现这样做更快。 scp必须等待30秒钟以上才能让我输入密码,但curl立即可以使用。
Ghost8472

@ Ghost8472配置为是,但有时此延迟正在解析主机名,并且对于sftp也会发生。
mckenzm

1
我收到“ curl:(1)libcurl中不支持或禁用协议“ sftp””
kronuus

21

您可以在Unix /终端上使用'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 

希望对您有所帮助。


7
先决条件:sudo apt-get install
Expect

10

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

2
这是perl,对不起,我没有写。(5年前:))
Espo


3

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

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

如果存在:

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

3

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没有密码的情况下运行命令。


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 /root/scriptfile


1

这是基于此博客文章的一个穷人的类似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

0

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

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


4
问题是他不能使用基于密钥的身份验证。
Barmar 2015年

2
另外,如果是我,我假设我无法更改其他服务器-我只想复制一个文件。
SDsolar


-3

sshpass的步骤对于rhel / centos 6:

# wget http://epel.mirror.net.in/epel/6/i386/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm
# yum install sshpass

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


-9

我发现这个答案很有帮助 这里

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

您不仅可以在此处传递密码,而且在复制时还会显示进度条。非常棒。


22
以及您在这里到底如何提供密码?
infografnet 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.