我想在不同目录中从/复制文件到远程服务器。
例如,我想一次运行这4条命令。最简单的方法是什么?

评论

编写脚本时,必须为每个命令输入密码。我可以避免吗?

避免以这种方式重复密码:scp远程:“ A / 1.txt A / 2.txt B / 1.txt C / 1.txt”本地:./

stackoverflow.com/a/23748561/874188(被提名为与此副本的副本)具有很好的附加技术。

我建议您看一下rsync,也许它可以在这种情况下以及将来的许多情况下为您提供帮助。然后,为避免输入密码(多次输入密码),您应该阅读有关ssh公钥/私钥的信息,例如digitalocean.com/community/tutorials/how-to-set-up-ssh-keys--2

基于@JohnMudd答案的示例:scp root@192.168.56.120:'/ etc / openvpn / ca.crt /etc/openvpn/client/client0.crt /etc/openvpn/client/client0.key / etc / openvpn / client / ta.key'./。

#1 楼

将多个文件从远程复制到本地:

$ scp your_username@remote.edu:/some/remote/directory/\{a,b,c\} ./


将多个文件从本地复制到远程:从远程复制多个文件:

$ scp foo.txt bar.txt your_username@remotehost.edu:~
$ scp {foo,bar}.txt your_username@remotehost.edu:~
$ scp *.txt your_username@remotehost.edu:~


来源:http://www.hypexr.org/linux_scp_help.php

评论


第一个命令省略了结尾的“。”,并且'{a,b,c}'等于\ {a,b,c \}。

–杜莱士
2014年5月5日6:04



我认为OP试图将多个本地文件夹中的多个文件复制到多个远程文件夹中,这些示例将无法完成工作,因为它们全部会将文件压缩到〜或./。

– aesede
15年4月28日在17:09

当心:大括号内逗号后没有空格。我只花了10分钟的时间来弄清楚为什么我的命令不起作用,原因是因为空格。

– Deepak
15年9月28日在15:42

从远程复制到本地时,@ duleshi {a,b,c}不完全等于\ {a,b,c \},因为第一个文件要求输入密码,而第二个文件仅要求输入密码。

– Marcelo Ventura
15年11月11日,0:24

@ MarceloVentura,@ duleshi:另外,我想补充一点,使用\ {a,b,c \}将在单个连接/批处理中传输文件(因为它们将在远程主机上扩展) {a,b,c}将打开多个连接,并且在传输许多文件时的开销非常明显

–全能性
16-4-9在10:39



#2 楼

从本地到服务器:

scp file1.txt file2.sh username@ip.of.server.copyto:~/pathtoupload

从服务器到本地:

scp -T username@ip.of.server.copyfrom:"file1.txt file2.txt" "~/yourpathtocopy"

评论


这应该是最重要的答案,因为服务器不需要输入每个文件的密码:)

– motagirl2
19年1月30日在12:57

在Ubuntu 18(zsh)的客户端上不起作用。不知道在哪里应该工作。 ```(venv)➜git:(master)✗scp root @ 172.29..xxx.yyy:“ / usr / local / bin / kubectl /root/.kube/config” / tmp / root @ 172.29..xxx。 yyy的密码:协议错误:文件名与请求```不匹配

– jseguillon
19-4-26在12:24



@ motagirl2最好的答案是不要求输入每个文件的密码,只要您用反斜杠转义大括号即可。这个答案给我一个错误,找不到文件。

–冥王星
19年7月2日在22:00

@jseguillon添加-T选项以抑制该错误。

–恢复莫妮卡
19年8月30日在19:41

第二个可以在我的机器上运行,但仅不带-T选项

–Richard DiSalvo
19-09-29在20:28

#3 楼

您可以使用-r开关复制整个目录,因此,如果可以将文件隔离到自己的目录中,则可以一次复制所有内容。

scp -r ./dir-with-files user@remote-server:upload-path

scp -r user@remote-server:path-to-dir-with-files download-path


例如

scp -r root@192.168.1.100:/var/log ~/backup-logs


或者如果它们很少,则可以使用:

scp 1.txt 2.txt 3.log user@remote-server:upload-path


评论


如果我的目的地是根目录,并且正在执行etc目录,例如:scp -r / backups / etc root @ linuxbox:/,这是否有效?我的源代码是一个非常稀疏的目录,其中包含“ hosts”和nginx / sites -可用等?

– Tomachi
18年4月20日在13:21

#4 楼

如Jiri所述,您可以使用scp -r user@host:/some/remote/path /some/local/path递归复制文件。假设存在一个目录,其中包含要传输的所有文件(没有其他内容)。

但是,如果您要从多个不同的目录传输文件,则SFTP提供了另一种选择不一致:

sftp user@host << EOF
  get /some/remote/path1/file1 /some/local/path1/file1
  get /some/remote/path2/file2 /some/local/path2/file2
  get /some/remote/path3/file3 /some/local/path3/file3
EOF


它使用“ here doc”语法定义一系列SFTP输入命令。或者,您可以将SFTP命令放入文本文件并执行sftp user@host -b batchFile.txt

评论


这是实际回答问题的唯一答案。谢谢。我一直在谷歌搜索和分析scp手册已有很长时间了,以试图找到此功能,我想scp没有它。

– sudo
17年9月15日在22:14



这似乎是最好,最灵活的答案。注意:我被绊倒了,直到意识到需要使用/ home / vagrant / Code /之类的完整路径,而不是〜/ Code /。

–瑞安
18年8月15日在21:57

这是最好的答案,只是不要忘记添加-r表示目录

– Chris_Rands
18年8月27日在12:44



#5 楼

{file1,file2,file3}的答案仅适用于bash(远程或本地)

真正的方法是:

scp user@remote:'/path1/file1 /path2/file2 /path3/file3' /localPath


评论


太棒了!有时我会使用非bash外壳,这将带来不可估量的帮助。不仅是真实的方法,而且是正确的方法。

– Paul B.
18年6月14日在14:32

用{…,…,…}进行通配不仅在Bash中而且在许多shell中都有效。但是,这适用于任何外壳,因此显然更好。

–彼得·多布罗格斯特(Piotr Dobrogost)
18-10-8在15:08

需要更多报价。这些路径可以包含空格。

–阿米特·奈杜(Amit Naidu)
19年7月25日在1:56

好了!我会投票很多次,但是我只能做一次!谢谢Vouze!

–AndréPacheco
19年7月25日在18:38

#6 楼

与scp玩了一段时间后,我找到了最可靠的解决方案:

(请注意单引号和双引号)

本地到远程:

scp -r "FILE1" "FILE2" HOST:'"DIR"'


如果文件都在同一目录中,我们可以使用*来匹配它们,例如as

scp -r HOST:'"FILE1" "FILE2"' "DIR"


与仅受某些shell支持的“ {}”语法相比,这是通用的

评论


感谢您为文件名中的空格提供帮助。我使用的是{}方法,因此引用后还必须用\对其进行转义。

–本体
19-2-22在23:16

如果要在路径中的主目录中使用波浪号(〜)。请注意〜和/必须位于引号之外。 scp -r robwaa@192.168.1.101:'〜/“ bin / set-vpn-kill-switch”〜/“ bin / flush-iptables”'〜/“”```

–罗布·瓦(Rob Waa)
19年4月11日在16:09



{}语法使从同一目录中复制多个文件变得更加容易,是否可以通过scp -r做到这一点,以便“ FILE1”和“ FILE2”可以是相对路径,而不是文件的绝对路径?

– dtasev
20年1月6日,11:07

#7 楼

最简单的方法是

local$ scp remote:{A/1,A/2,B/3,C/4}.txt ./


所以{..}列表可以包含目录(A,B和C是目录;“ 1.txt”和“ 2.txt” “是那些目录中的文件名)。

尽管它会将所有这四个文件复制到一个本地目录中-不确定那不是您想要的。

您将最终将远程文件A / 1.txt,A / 2.txt,B / 3.txt和C / 4.txt复制到单个本地目录中,文件名分别为./1.txt、./2。 txt,。/ 3.txt和./4.txt

评论


这会不会在本地计算机上用B / 1.txt的内容覆盖A / 1.txt的内容?

–伊夫·多夫斯曼(Yves Dorfsman)
16年6月7日在4:03

好点..调整示例(因此现在不会覆盖)并添加了描述。谢谢。

–塔加尔
16年6月7日在15:46



像这样的Brace扩展是Bash功能,不能移植到例如POSIX sh。

–tripleee
16年7月31日在9:41

@tripleee,谢谢。它可能不是posix,但不仅适用于bash。我一直在使用ksh,它也在那里工作。

–塔加尔
16年7月31日在18:36

您还可以通过执行以下操作来混合目录和文件:local $ scp -r remote:{A / 1.txt,A / 2.txt,B / 3.txt,C / 4.txt,D,F} ./

–捐赠人
16-10-19在6:40



#8 楼

问题:使用单个SCP命令将多个目录从远程服务器复制到本地计算机,并保留每个目录在远程服务器中的位置。

解决方案:SCP可以轻松做到这一点。这解决了使用多个文件夹的SCP时多次输入密码的烦人问题。因此,这也节省了很多时间!使用单个命令



基于注释,这在Windows上的Git Bash中也可以正常工作

评论


附言不要在项目之间添加空格。即\ {t1,t2,t3 \} ------>我在这里浪费了十分钟...大声笑

– Kenberkeley
18/12/20在4:58

这是最佳答案,因为当您转义括号时,它将被解释为单个命令,并且每次输入时都不会要求输入密码

– Amaynut
19年7月19日在21:35

@Amaynut是的,完全是!那当然可以节省很多时间和精力:)

– kmario23
19-10-23在13:57

#9 楼

复制多个目录:

scp -r dir1 dir2 dir3 admin@127.0.0.1:~/


评论


问题是如何从远程目录复制到本地目录,而不是其他方式。

–塔加尔
16-4-19的1:50

#10 楼

您可以这样操作:

scp hostname@serverNameOrServerIp:/path/to/files/\{file1,file2,file3\}.fileExtension ./


这会将列出的所有文件名下载到您所在的任何本地目录中。要在每个文件名之间放置空格,只能使用逗号,

评论


当扩展名相同时,这很好。如果文件具有不同的扩展名,则可以将其写为/ path / to / files / \\ {file1.ext,file2.ext,file3.ext \\}。注意PowerShell的人(现在MS已加入聚会),您需要使用`来代替:/ path / to / files /`{file1.ext,file2.ext,file3.ext`}

– dtasev
20年1月6日11:00



#11 楼

注意:我只为回答上述问题的一部分而致歉。但是,我发现这些命令对于我当前的unix需求很有用。

将特定文件从本地计算机上传到远程计算机:

~/Desktop/dump_files$ scp file1.txt file2.txt lab1.cpp etc.ext your-user-id@remotemachine.edu:Folder1/DestinationFolderForFiles/

将整个目录从本地计算机上传到远程计算机:

~$ scp -r Desktop/dump_files your-user-id@remotemachine.edu:Folder1/DestinationFolderForFiles/

将整个目录从远程计算机下载到本地计算机:

~/Desktop$ scp -r your-user-id@remote.host.edu:Public/web/ Desktop/

#12 楼

就我而言,我只能使用sftp命令。
因此,我必须对sftp使用批处理文件。我创建了如下脚本。假定您正在/ tmp目录中工作,并且要将文件放在远程系统上的destdir_on_remote_system中。这也仅适用于非交互式登录。您需要设置公钥/私钥,以便无需输入密码即可登录。根据需要进行更改。

#!/bin/bash

cd /tmp
# start script with list of files to transfer
ls -1 fileset1* > batchfile1
ls -1 fileset2* >> batchfile1

sed -i -e 's/^/put /' batchfile1
echo "cd destdir_on_remote_system" > batchfile
cat batchfile1 >> batchfile
rm batchfile1

sftp -b batchfile user@host


#13 楼

scp使用ssh以相同的身份验证进行数据传输,并提供与ssh相同的安全性。

此处的最佳实践是实施“ SSH密钥和公共密钥认证”。这样,您就可以编写脚本而不必担心身份验证。就这么简单。

请参阅什么是SSH-KEYGEN

#14 楼

在所有文件具有相同扩展名但后缀不同(例如日志文件编号)的特定情况下,请使用以下命令:

scp user_name@ip.of.remote.machine:/some/log/folder/some_log_file.* ./


这将复制所有文件从远程给定文件夹中命名为some_log_file,即-some_log_file.1,some_log_file.2,some_log_file.3 ....

#15 楼

scp remote:"[A-C]/[12].txt" local:


评论


谢谢,但这只是一个例子,实际的文件或目录名称更为复杂。但是我有他们的清单。

–user987654
2013年6月2日19:07

您可以用正则表达式描述它们吗?

– unxnut
13年6月3日,下午1:43

是否可以通过使用正则表达式在目标目录中保留相同的目录结构?

–user987654
13年6月3日在21:36

是的,您应该可以使用-r选项来完成该操作。您可以使用-p选项保留其他属性(例如时间戳)。

– unxnut
2013年6月4日在2:49



#16 楼

不使用scp会更简单: >也在此处和此处发布。