Answers:
您的本地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/
使远程外壳程序将字符串拆分为参数而不是本地外壳程序。
是的,很正常。发生的情况是您的外壳在运行命令之前先展开了括号,因此您实际正在运行的是
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)多方便多了。
id.rsa
将具有600
权限,ssh
如果没有,该权限甚至将不起作用。这意味着它对任何人都是安全的,但是对于密码,绝对不是root
安全的root
。
ssh-keygen
以及2)ssh / scp会抱怨并要求输入密码,以防其他人读取该文件。无论如何,至少在Linux上。
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/