带有选定文件和目录以供下载的SCP命令询问每个新文件或目录的密码


9

在我的Fedora 20系统上,我经常使用scp,这是我第二次在运行此命令时遇到此问题:

scp -r -P PORT user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/

它要求我为它传输的每个文件/目录输入密码。

user@host's password: "password here"

题:

这是怎么回事

这是正常现象,我认为这是非常特殊的行为吗?

Answers:


13

您的本地shell(可能是bash)正在扩展

user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4}

变成:

user@host:/home/user/something/file1 user@host:/home/user/something/folder1 user@host:/home/user/something/folder2 user@host:/home/user/something/folder3 user@host:/home/user/something/folder4

相反,您可以执行以下操作:

scp -r -P PORT user@host:"/home/user/something/file1 /home/user/something/folder1 /home/user/something/folder2 /home/user/something/folder3 /home/user/something/folder4" folder/folder2/

或者,如果您知道远程用户的登录外壳是bash,则也可以使用大括号扩展:

scp -r -P PORT user@host:"/home/user/something/{file1,folder1,folder2,folder3,folder4}" folder/folder2/

使远程外壳程序将字符串拆分为参数而不是本地外壳程序。


5

是的,很正常。发生的情况是您的外壳在运行命令之前先展开了括号,因此您实际正在运行的是

scp -r -P PORT user@host:/home/user/something/file1 \ 
               user@host:/home/user/something/folder1 \ 
               user@host:/home/user/something/folder3 \ 
               user@host:/home/user/something/folder4 folder/folder2

基本上,scp看到多个连接请求,因此为每个请求打开一个新连接。单程最简单的方法(使用@geirha建议的引号对一次性操作更简单)解决此问题的方法是设置无密码ssh/ scp

$ ssh-keygen 
$ ssh-copy-id -p PORT user@host

在运行完这两个命令一次(并根据需要回答提示)之后,您将能够ssh/ scp无需为以后的所有ssh连接使用密码。这是我)其实更安全和ii)方便多了。


+1,不错的方法(当然,ssh-keygen和ssh-copy-id必须只创建一次)。我要说的是,它更安全... 当您确保私有部分被该用户以外的任何人“无法访问”时……这并不总是那么容易。
奥利维尔·杜拉克

@OlivierDulac是什么意思?默认情况下,id.rsa将具有600权限,ssh如果没有,该权限甚至将不起作用。这意味着它对任何人都是安全的,但是对于密码,绝对不是root安全的root
terdon

我只是想添加此评论,以便使设置无密码访问权限的人员考虑到(并且嘲笑)以下事实:私钥必须处于安全环境中且不可读取/不可共享/等。(即,这是指出这一点的一种温和方法,因为询问的人可能不知道共享/释放私钥的所有可能的影响)
Olivier Dulac

@OlivierDulac啊,很公平。我认为这不值得一提,因为1)使用时它会自动发生,ssh-keygen以及2)ssh / scp会抱怨并要求输入密码,以防其他人读取该文件。无论如何,至少在Linux上。
terdon

4

scp 并不是很聪明:给定多个命令行参数(它们是来自同一远程主机的文件)时,它将为每个参数打开一个新连接。

您可以使用rsync代替scp,这样(和其他方式)更智能。

rsync -r -e 'ssh -P PORT' user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/

另一种方法是将一个参数传递给scp它描述多个文件

另一种方法是设置系统,以使您不必一直进行身份验证。优选地,设置密钥认证,这在大多数情况下既更方便也更安全。或者,或者另外,设置连接共享,因此您只需要对每个会话进行一次身份验证。无论如何,都设置一个别名,这样您就不必每次都指定用户名和端口。在您的~/.ssh/config

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Host nick
HostName real-host-name.example.com
User bob
Port 1234

运行ssh -Nf nick以打开一个连接,然后所有后续连接nick将背负现有连接。现在您可以运行

scp -r nick:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/
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.