带有选定文件和下载目录的 SCP 命令要求输入每个新文件或目录的密码

带有选定文件和下载目录的 SCP 命令要求输入每个新文件或目录的密码

在我的 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"

问题:

这里发生了什么?

这是正常的吗?我会认为这是非常奇怪的行为吗?

答案1

您的本地 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/

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

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

让远程 shell 而不是本地 shell 将字符串拆分为参数。

答案2

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

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)很多更方便。

答案3

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/

相关内容