【问题标题】:How to pass password to scp?如何将密码传递给scp?
【发布时间】:2022-01-12 02:44:53
【问题描述】:

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

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

【问题讨论】:

标签: linux scp io-redirection


【解决方案1】:

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

【讨论】:

  • 链接到expect.nist.gov 已损坏。也许是这个?:expect.sourceforge.net
  • sudo apt-get install expect
  • >> brew info sshpass 错误:没有名称为“sshpass”的可用公式 我们不会添加 sshpass,因为它使 SSH 新手很容易破坏 SSH 的安全性。 ;)
【解决方案2】:

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

【讨论】:

  • 这是在 perl 中,抱歉我没有写。 (5年前:))
【解决方案3】:

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

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

【讨论】:

  • 问题说他不能使用基于密钥的身份验证。
  • 另外,如果是我,我认为我无法更改其他服务器 - 我只想复制一个文件。
【解决方案4】:

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

This is mentioned in the documentation here.

【讨论】:

  • 请举个例子。
  • 另外,可能需要将 C:\Program Files (x86)\PuTTY 添加到您的路径以使用这些命令。
  • @SDsolar 这是一个语法示例:pscp -pw 'MyPa$$word' username@servername:/somedir/somefile ~/somedest(我讨厌像这样使用 putty,但它确实有效)
  • @geneorama 密码对我有用,但只有没有单引号..谢谢..
【解决方案5】:

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

【讨论】:

  • 正如我所写:不,我不能轻易切换到基于密钥的身份验证。
  • 你的意思是 .authorized_keys 而不是 .授权密钥?
  • 对此的有效用途是一个 bash 脚本,该脚本对要向用户询问远程服务器密码的服务器进行多次 scp/ssh 调用。然后密码将不会显示在历史记录中,您仍然可以挑战密码......但只有一次。我不想使用密钥文件,因为我仍想对脚本用户进行身份验证。
  • 另一个有效的用途是如果您不能轻松地在目标上启用基于密钥的身份验证。示例:主要的 NAS 生产商之一 - Synology 及其 DSM 6.0 - 即使在 2016 年也不支持它。当然,您可能会弄乱配置文件并希望更新不会再次覆盖它(频繁更新 DSM 确实会破坏自定义修改)。有时——尤其是当 OP 明确表示他们已经意识到它不是最优的时——人们只需要一个解决方案。
  • 你应该使用ssh-copy-id -i ~/.ssh/id_rsa.pub <remote_server>复制远程服务器上的密钥
【解决方案6】:

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

【讨论】:

  • 在 Ubuntu 12.04 上,它只适用于我在密码上加上单引号(例如“密码”而不是“密码”)。
  • @odedfos,是的,您需要使用单引号,因为某些密码生成的字符在双引号字符串插值中可能有特殊解释
  • 这是安装 sshpass apt-get install sshpass
  • 在 CentOS 上是yum -y install sshpass
  • 最安全的方法是使用密码file,例如:sshpass -f passwdfile` scp [...]. This way, the password won't show up in ps` 列表等. 并且您可以使用文件权限保护密码。
【解决方案7】:

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

我希望这会有所帮助。

【讨论】:

  • 先决条件:sudo apt-get install expect
【解决方案8】:

我发现这个非常有用的答案here

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

不仅可以传递密码,而且复制时会显示进度条。真棒。

【讨论】:

  • 你是如何在这里提供密码的?
【解决方案9】:
  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】:

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

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

    【讨论】:

    • 5年前user524607's answer提到过。
    • 找到它,并将 C:\Program Files (x86)\PuTTY 添加到我的路径中。
    • 在 WINE 下?在 Windows 上使用 plink。 BTW 人们 putty-tools 是一个包。
    【解决方案11】:

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

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

    如果存在:

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

    【讨论】:

    • 好极了。简单、有效,无需 3rd 方包或 ssh-keygen 设置。
    【解决方案12】:

    一旦你按照上面的解释设置了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 命令。

    【讨论】:

      【解决方案13】:

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

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

      【讨论】:

      • 它比 'scp' 慢很多,但它做得很好。
      • 我发现当目的地配置有巨大的密码提示延迟时,这会更快。 scp 必须等待 30 多秒才能让我输入密码,但 curl 立即生效。
      • @Ghost8472 配置为是,但有时此延迟正在解析主机名,并且也会发生在 sftp 中。
      • 我得到“curl:(1) 协议“sftp”在 libcurl 中不受支持或禁用”
      • 我收到一条错误消息,说 curl 无法将 -T 识别为参数。
      【解决方案14】:

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

      【讨论】:

      • 后台运行scp如何输入密码??
      【解决方案15】:

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

      【讨论】:

        【解决方案16】:
        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
          

        【讨论】:

        • 你如何指明实际密码?
        • @Osmar 运行命令时会提示您输入密码
        【解决方案17】:

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

        【讨论】:

          【解决方案18】:

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

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

          【讨论】:

            【解决方案19】:

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

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

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

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

            【讨论】:

              猜你喜欢
              • 2011-02-23
              • 2013-06-23
              • 1970-01-01
              • 1970-01-01
              • 2020-11-02
              • 1970-01-01
              • 2017-03-14
              • 2021-02-11
              相关资源
              最近更新 更多