我正在尝试从远程进行 scp,并且想要复制整个文件系统(它是一个小型嵌入式 Linux 设备)。 SCP 不喜欢我尝试的方式:
scp -r name@ip:/ ./local_folder
我收到以下错误:
error: unexpected filename:
如果我用 -v 运行它,最后一条消息看起来像这样:
debug1: Sending command: scp -v -r -f /
Entering directory: D0755 0
Sink: D0755 0
error: unexpected filename:
如果我这样做
scp -r name@ip:/etc ./local_folder
相同的调试片段如下所示:
debug1: Sending command: scp -v -r -f /etc
Entering directory: D0755 0 etc
Sink: D0755 0 etc
搜索起来有点困难,如果我尝试搜索“scp 根目录斜杠意外文件名”等搜索词,我找不到任何有同样问题的人。
答案1
由于scp
遵循任何遇到的符号链接,因此使用按原样复制文件的工具会更有意义。
该rsync
程序能够比以下更好地重新创建目录结构scp
:
rsync -av name@ip:/ ./local_folder
这不仅保留文件元数据(时间戳等),而且还复制/
目录中找到的隐藏文件(如果有)。
您可以rsync
通过另外使用来保留硬链接-H
。
rsync
用作ssh
其默认传输。
您还可以tar
在远程系统上使用ssh
:
ssh name@ip tar -c -f - -C / . >local_folder/filesystem.tar
或者
ssh name@ip tar -c -f - -C / . | tar -v -x -f - -C local_folder
答案2
tldr:尝试name@ip://
代替name@ip:/
我正在尝试类似的事情。我想使用 WINScp 运行 scp 脚本,并且不指定默认远程目录,我的脚本始终连接到相同的目录,看似随机,文件系统内的文件夹。我猜这是我的主目录username
。
如果 url 以/
ie 结尾,name@ip:/
则会导致连接到该地址随机主目录。即使该目录不存在(这会导致执行某些命令时出现奇怪的行为......)。显式执行后cd /
,我已经连接到根目录了。
我改成后/
,//
即name@ip://
scp连接到根目录,不需要执行cd /
。
答案3
使用scp -r name@ip:/. ./local_folder
。
或者,该dd
命令可用于逐位备份(请参见这)
答案4
所以实际上,对于我想要的,我找到了一个更快的选项,这也允许我忽略一些文件:
sshfs user@server: sshfsdir
rsync --recursive --exclude=whatever sshfsdir/path/on/server /where/to/store
(从https://stackoverflow.com/questions/15121337/recursively-use-scp-but-exclusion-some-folders)