Press "Enter" to skip to content

scp拷贝文件symlink变成文件问题

背景

我一直在使用 Nginx Proxy Manager 这个软件来当我的主NGINX使用,他提供了友好的管理界面和便捷SSL证书管理功能。

作为一个企图将一切容器化的狂热分子,我的NGINX Proxy Manager(后面我简称npm)也是使用容器部署的。某天我尝试进行迁移演练的时候发现我将npm的配置文件使用scp命令迁移到另一台主机之后,npm会报奇怪的错误日志:

Renewal configuration file /etc/letsencrypt/renewal/npm-2.conf is broken.
The error was: expected /etc/letsencrypt/live/npm-2/cert.pem to be a symlink

The error was: expected /etc/letsencrypt/live/npm-2/cert.pem to be a symlink

字面意思是,他期待这个文件是符号链接,结果这个文件不是的。

我进入npm的容器shell

[root@docker-MikroTik:/etc/letsencrypt]# ls -l live/npm-2/cert.pem 
-rw-r--r-- 1 root root 1602 Apr 29 04:37 live/npm-2/cert.pem

好像这个文件还真不是个链接,他现在是个文件,我又去源服务器上面看了一眼:

[root@localhost nginx]# ls -l letsencrypt/live/npm-2/cert.pem
lrwxrwxrwx. 1 root root 30 Apr 17 08:02 letsencrypt/live/npm-2/cert.pem -> ../../archive/npm-2/cert1.pem

嗯,源文件没问题,是一个链接,指向一个相对位置。

好嘛,问题找到了!

解决问题

根据网上查的资料

If I understand what you want correctly. You want to exactly mirror dir on the local machine to dir_target on linux, and it is copying the contents of the symlink, rather than copy the symlink itself. To make an exact duplicate, you need to use rsync instead of scp.
rsync -Wav --progress dir linux:dir_target
I suspect that will have the desired result. I generally use rsync anyway because it will only copy files that need to be copied, and generally is more intelligent than scp.

https://superuser.com/questions/233036/scp-copy-the-symlinks

使用scp命令来拷贝文件的话,似乎他会将连接对应的源文件拷贝过去。

如果你是真的想拷贝链接本身的话,你应该使用rsync来拷贝而不是scp命令。

好吧,那我们使用scp来拷贝我们的证书:

rsync -Wav letsencrypt root@192.168.1.1:/data/data/nginx_cloud

然后再来检查下:

[root@docker-MikroTik:/etc/letsencrypt]# ls -l live/npm-2/cert.pem 
lrwxrwxrwx 1 root root 30 Apr 17 12:02 live/npm-2/cert.pem -> ../../archive/npm-10/cert1.pem

好滴,变成链接了,npm也不报错了!

结论

我们在尝试Linux主机之间拷贝文件的时候,如果使用的是scp命令,他会尝试将你的文件链接对应的文件拷贝过去,而不是拷贝链接本身。

如果你的应用软件对文件做检查,发现文件不对劲的时候,就会报错。

如果你想要拷贝链接本身,则使用rsync工具来替代scp命令!

参考资料:

https://superuser.com/questions/233036/scp-copy-the-symlinks

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注