如何将密码传递给scp?

Arg*_*gel 261 linux scp io-redirection

我知道不推荐,但是可以将用户的密码传递给scp吗?

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

Kev*_*inS 481

使用sshpass:

sshpass -p "password" scp -r user@example.com:/some/remote/path /some/local/path
Run Code Online (Sandbox Code Playgroud)

或者,密码不会显示在bash历史记录中

sshpass -f "/path/to/passwordfile" scp -r user@example.com:/some/remote/path /some/local/path
Run Code Online (Sandbox Code Playgroud)

以上复制从远程主机到本地的路径内容.

安装:

  • 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

  • 最安全的方法是使用密码*文件*,如下所示:`sshpass -f`passwdfile` scp [...]`.这样,密码就不会显示在"ps"列表等中,您可以使用文件权限保护密码. (17认同)
  • 在Ubuntu 12.04上,它仅对我使用密码的单引号(例如'密码'而不是"密码"). (14认同)
  • 这是你安装sshpass`apt-get install sshpass`的方法 (7认同)
  • @odedfos,是的你需要使用单引号,因为一些密码生成的字符可以在双引号字符串插值中有一个特殊的解释 (6认同)
  • 在CentOS上,它是`yum -y install sshpass` (6认同)
  • 不使用sshpass时,scp显示进度。有可能找回来吗? (3认同)
  • 在OSX`brew上安装https:// raw.githubusercontent.com / kadwanev / bigboybrew / master / Library / Formula / sshpass.rb` (2认同)
  • 它可以工作,但是`scp`的控制台输出是隐藏的。 (2认同)
  • `brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb` 不再有效 @jbaums > 错误:不支持从任意 URL 对 sshpass 公式文件进行非校验和下载!“brew extract”或“brew create”和“brew tap-new”可在 GitHub 上的 Tap 中创建公式文件。 (2认同)

mus*_*ran 43

只需生成一个ssh键,如:

ssh-keygen -t rsa -C "your_email@youremail.com"
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 35

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

这在这里的文档中提到.

  • @SDsolar 这是一个语法示例:`pscp -pw 'MyPa$$word' username@servername:/somedir/somefile ~/somedest` (我讨厌像这样使用腻子,但它有效) (4认同)
  • 请举个例子。 (2认同)
  • @geneorama 密码对我有用,但只有没有单引号..谢谢.. (2认同)

Pat*_*otz 28

您可以使用期望的工具编写脚本(也有方便的绑定,例如Pexpect for Python).

  • >>brew info sshpass 错误:没有名为“sshpass”的可用公式 我们不会添加 sshpass,因为它让 SSH 新手用户很容易破坏 SSH 的安全性。;) (2认同)

小智 22

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

curl --insecure --user username:password -T /path/to/sourcefile sftp://desthost/path/
Run Code Online (Sandbox Code Playgroud)

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

Pra*_*eet 21

您可以在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}
                  }
Run Code Online (Sandbox Code Playgroud)

运行脚本

expect test.exp 
Run Code Online (Sandbox Code Playgroud)

我希望有所帮助.

  • 先决条件:sudo apt-get install expect (7认同)

Esp*_*spo 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这是在perl,对不起,我没有写.(5年前 :) ) (2认同)

小智 7

没有人提到它,但是Putty scp(pscp)有一个-pw选项用于输入密码.

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

  • 5年前在[user524607的回答](http://stackoverflow.com/a/4310068/1491895)中提到过它. (8认同)

小智 5

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

$which ssh-copy-id #check whether it exists
Run Code Online (Sandbox Code Playgroud)

如果存在:

ssh-copy-id  "user@remote-system"
Run Code Online (Sandbox Code Playgroud)