我经常使用SCP来复制文件-特别是与Web相关的文件。问题是,每当执行此操作时,我都无法获得复制隐藏文件(例如.htaccess)的命令。

我通常会调用此命令:

scp -rp src/ user@server:dest/


这不会复制隐藏文件。我不想再次调用它(通过执行类似scp -rp src/.* ...的操作-无论如何都具有奇怪的...含义。

我在scp手册页中没有看到有关“包括隐藏文件”。

我该如何完成?

评论

我假设src /.*也会复制src / ..(父目录),对吗?

#1 楼

那应该绝对匹配隐藏文件。源代码末尾的/表示“此目录下的每个文件”。但是,测试和研究可以帮助您。这是愚蠢的行为。

“答案”是在源的末尾添加一个点:

scp -rp src/. user@server:dest/

真正的答案是使用rsync。

评论


好招,我还没有意识到这一点。

–颅骨
09年6月7日在19:06

rsync -avz -e ssh --progress src / user @ server:dest /

– MikeyB
09年7月7日在23:23

我无法重现该行为。 scp -r source / host:source2复制点文件。从2007开始可在OpenSSH 5.1中使用。

– Mikel
11年8月8日在20:33

请注意,添加。最终由于安全问题而不再有效(2019)。此处说明:superuser.com/questions/1403473/scp-error-unexpected-filename

–Stéphane
19年2月12日在21:44

#2 楼

您可以尝试rsync。它更适合此工作:


rsync -av src / user @ server:dest /


(其手册页值得阅读。)

评论


我总是对rsync使用--progress选项,没有它我就无法生存= D

–霍法
09年7月7日在21:21

@Hofa我通常使用-P因为它更短,它已经包括--progress并且还包括--partial,如果我已经对它的进度感兴趣的话,它就很有意义;-)

–颅骨
2012年3月31日上午10:27

如果您需要其他端口,请使用此端口:rsync -av -e“ ssh -p 2222” src / user @ server:dest /

–脑90
20-2-5在12:57

#3 楼

不要在源目录后加斜杠。您的代码将如下所示:

scp -rp src user@server:dest/


这将在远程计算机上的“ dest”下创建目录“ src”,其中包括所有隐藏文件。这可能不是您想要的,但是它将在src中复制隐藏的文件。

#4 楼

以下将解决问题,这已在我们的持续集成环境中进行了全面测试

scp -rp src/. user@server:dest/
example scp -rp /usr/src/code/. content001@172.11.11.11:/usr/dest/code/


希望对您有所帮助

评论


在最近更新scp之后,现在会导致scp:错误:意外的文件名:。 。一定要测试一下它是否适合您的发行版,其他Googler :)

–莫里茨·弗里德里希(Moritz Friedrich)
19年2月11日在11:39

#5 楼

要仅复制隐藏文件,请使用以下命令

scp -rp /path_to_copy_hidden/.[!.]* user@host:/path_to_paste/


实际的游戏是/.[!.]*标记,它引用以.开头的文件(隐藏)

#6 楼

上面的scp解决方案都不适合我。
但是,我的确发现以下内容适用于cygwin:
scp -r directory / * host:directory
'*'匹配所有可见文件并跳过不可见的内容。

#7 楼

如果在远程计算机上禁用了密码登录,并且唯一的登录方式是通过公用密钥登录,则可以使用此方法:

$ rsync -av -s 'ssh -i /path/to/your/private/SSH/key' --progress user1@remote.host:/remote/source/directory/ /local/destination/directory/


它也复制隐藏文件。

还请注意,“ user1”必须具有读取这些文件的权限,例如,您不能使用此方法复制其他用户的ssh文件夹。

#8 楼

由于scp支持正则表达式,因此可以很好地为您解决问题:

scp -rp src/(*|.*) user@server:dest/

#9 楼

分布式修订版本控制处理隐藏文件
由于CVE-2018-20685漏洞,/.技巧不能再与scp一起使用。
但是,分布式修订版本控制(例如git或Hg Mecurial)将处理隐藏文件,例如任何其他文件。以下是我最喜欢的汞汞的命令:
server:$ sudo apt install mercurial
client:$ sudo apt install mercurial
client:$ hg init src
client:$ cd src/
client:$ hg addr
client:$ hg com -m "first commit"
client:$ cd
client:$ hg clone src ssh://user@server/dest/

随后的更改将需要使用client:$ hg com -m "commit message"再次提交,然后使用client:$ hg push命令进行推送。从此汞汞汞备忘单中了解有关推动变革的更多信息。