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

som*_*ing 9 password scp file-transfer

在我的 Fedora 20 系统上,我经常使用 scp,这是我第二次遇到这种情况,当我运行以下命令时:

scp -r -P PORT user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/
Run Code Online (Sandbox Code Playgroud)

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

user@host's password: "password here"
Run Code Online (Sandbox Code Playgroud)

题:

这里发生了什么?

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

gei*_*rha 13

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

user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4}
Run Code Online (Sandbox Code Playgroud)

进入:

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
Run Code Online (Sandbox Code Playgroud)

相反,你可以这样做:

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/
Run Code Online (Sandbox Code Playgroud)

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

scp -r -P PORT user@host:"/home/user/something/{file1,folder1,folder2,folder3,folder4}" folder/folder2/
Run Code Online (Sandbox Code Playgroud)

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


ter*_*don 5

是的,这很正常。发生的情况是您的 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
Run Code Online (Sandbox Code Playgroud)

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

$ ssh-keygen 
$ ssh-copy-id -p PORT user@host
Run Code Online (Sandbox Code Playgroud)

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