我的开发机器运行在 Fedora(36)上。
最近我尝试将一个文件 scp 到远程服务器(CentOS 7)并收到一条神秘的错误消息:
scp:目标打开(“”):没有该文件或目录
该命令类似于:
scp -C foo.ext user@internal-vpn-ip:~/
没什么特别的,多年来已经多次这样做了,没有问题。奇怪的是,我想,一切都正常运转,但 scp 找不到远程路径。经过一些实验,我扩展了远程用户路径:
scp -C foo.ext user@remote-ip:/path/to/user/
瞧!成功了!
问题是,为什么~路径扩展不再起作用?
答案1
看起来在 RedHat 9+ SCP 现在在底层使用 SFTP。
在里面OpenSSH SCP 弃用页面上列出了与 RedHat 9 之前系统和 RedHat 9+ 系统相关的不兼容性和注意事项,包括此相关代码片段。
协议之间的另一个区别在于基于 ~ 的路径处理的扩展。OpenSSH 8.7 及更高版本支持特殊的 SFTP 扩展来处理此扩展。不幸的是,早期版本不支持此扩展,因此如果使用 ~ 路径处理,将文件夹从新版本的 RHEL 复制到旧版本将会失败。在这种情况下,建议的修复方法是提供绝对路径。
所以这就解释了为什么需要手动扩展路径。虽然很烦人,但至少现在我们知道为什么了 :)