377

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

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

4

19 回答 19

645

使用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/sshpass.rb
于 2012-12-19T15:17:15.563 回答
62

只需生成一个 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

于 2012-02-21T22:17:21.303 回答
51

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

这在此处的文档中有所提及。

于 2010-11-30T02:41:39.380 回答
40

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

于 2008-09-08T16:38:10.297 回答
37

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

curl --insecure --user username:password -T /path/to/sourcefile sftp://desthost/path/
于 2017-11-16T11:28:32.810 回答
22

您可以在 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 

我希望这会有所帮助。

于 2013-01-16T15:01:41.170 回答
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;
}
于 2008-09-08T16:42:03.160 回答
8

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

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

于 2015-05-13T17:16:26.900 回答
8

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

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

如果存在:

ssh-copy-id  "user@remote-system"
于 2016-11-22T09:35:16.993 回答
4

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

于 2017-10-20T07:08:58.833 回答
3
  1. 确保在目标服务器上启用密码验证。如果它运行 Ubuntu,然后/etc/ssh/sshd_config在服务器上打开,找到行PasswordAuthentication=no并将它们全部注释掉(放在#行的开头),保存文件并运行sudo systemctl restart ssh以应用配置。如果没有这样的行,那么你就完成了。
  2. 添加-o PreferredAuthentications="password"到您的scp命令中,例如:
    scp -o PreferredAuthentications="password" /path/to/file user@server:/destination/directory
    
于 2020-09-14T03:57:31.260 回答
2

这是基于这篇博文的一个穷人的 Linux/Python/Expect-like 示例:Upgradeing 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
于 2019-12-09T15:55:48.410 回答
1
  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

于 2014-03-21T06:04:33.367 回答
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

于 2020-12-02T15:55:38.063 回答
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 帮助。

于 2021-04-12T19:23:06.027 回答
-1

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

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

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

sshpass -f "fileWithScpPassword" scp /filePathToUpload user@ip:/destinationPath/

于 2021-08-31T13:07:38.230 回答
-2

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

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

于 2008-09-16T08:16:54.850 回答
-5

上面提到的所有解决方案只有在您安装了应用程序或者您应该拥有安装除了或 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/

于 2019-09-05T14:18:53.270 回答
-10

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

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

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

于 2014-02-25T07:08:10.197 回答