ChatGPT解决这个技术问题 Extra ChatGPT

如何将密码传递给scp?

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

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

另请参阅(稍后)问题:stackoverflow.com/questions/1462284/…,其中一个答案提到了另一种可能的方法。 (注意:这不是重复的问题 - 这是其他重复的原始问题。)
您可以先使用 ssh 设置主连接,然后运行 scp 以通过主连接复制文件,而不是通过 scp 登录和复制,而无需密码。请参阅unix.stackexchange.com/a/2869/17823

j
jbaums

使用 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 安装 sshpass

安装 sshpass

centos/fedora yum 安装 sshpass

百胜安装 sshpass

mac w/macports 端口安装 sshpass

端口安装 sshpass

mac w/brew brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb

酿造安装 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` 列表等,您可以使用以下命令保护密码文件权限。
m
mustafaturan

只需生成一个 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> 复制远程服务器上的密钥
H
Haldean Brown

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

This is mentioned in the documentation here.


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

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


指向 expect.nist.gov 的链接已损坏。也许是这个?:expect.sourceforge.net
sudo apt-get install 期望
>> brew info sshpass Error: No available formula with name "sshpass" 我们不会添加 sshpass,因为它让 SSH 新手很容易破坏 SSH 的安全性。 ;)
M
MBerg

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

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

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

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

我希望这会有所帮助。


先决条件:sudo apt-get install expect
R
RomanHotsiy

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

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

如果存在:

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

高超。简单、有效,无需 3rd-party 软件包或 ssh-keygen 设置。
g
glenn jackman

以下是您如何使用 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年前 :) )
S
SDsolar

没有人提到它,但是 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 是一个包。
h
hi15

如上所述设置 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 命令。


F
Finesse

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


但是,您如何指示实际密码?
@Osmar 运行命令时会提示您输入密码
J
JohnMudd

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

K
Kevin Chui

确保之前有“expect”工具,如果没有,请执行 # apt-get install expect 创建一个包含以下内容的脚本文件。 (# vi /root/scriptfile) spawn scp /path_from/file_name user_name_here@to_host_name:/path_to expect "password:" send put_password_here\n;与“expect”工具交互执行脚本文件#expect /root/scriptfile


R
Robert

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

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


S
Sachin Rastogi

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


R
Rakesh Raushan

我这样做的一种简单方法:

使用与 ssh 密钥相同的 scp cmd,即

scp -C -i <path_to opens sshkey> <'local file_path'> user@<ip_address_VM>: <'remote file_path’>

用于将文件从本地传输到远程

但不是提供正确的 ,而是使用一些垃圾路径。由于错误的密钥路径,您将被要求输入密码,您现在只需传递密码即可完成工作!


v
vishal sahu

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

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

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

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


r
rjray

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

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


问题是他不能使用基于密钥的身份验证。
另外,如果是我,我认为我无法更改另一台服务器 - 我想要的只是复制一个文件。
Y
Yash

上面提到的所有解决方案只有在您安装了应用程序或者您应该拥有安装除了或 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如何输入密码?
C
Community

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

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

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


你究竟是如何在这里提供密码的?