由于某种原因,我无法再将文件夹从我的桌面 Mac 传输到我们的 Linux 服务器。
这是错误:
(base) my_computer:~ username$ scp -r /source_directory/filename user@server:/home/user/destination
user@server's password:
scp: realpath /home/user/filename: No such file
scp: upload "/home/user/filename": path canonicalization failed
scp: failed to upload directory /source_directory/filename to /home/user/destination
关于这个问题的一些注意事项:
- 所有文件确实存在。具体来说,
/source_directory/filename
存在,与 一样/home/user/destination
,但/home/user/filename
不存在,也不应该在复制之前存在(从源复制到目标后它将存在)。 - 无论我尝试从计算机的内部驱动器还是从连接到计算机的外部驱动器复制到服务器,我都会遇到与上述相同的错误
- 我在我们网络中的任何其他计算机上都没有收到此错误
- 我以前可以毫无问题地做到这一点
- 我可以毫无问题地复制单个文件(例如 .wav),但不能复制文件夹,即使它是空的并且即使我没有使用 -r 命令
- 我从服务器复制到我的计算机没有问题
- 我对 ssh 没有任何问题
可能是什么原因?我应该尝试什么解决方案?
更新1:
当我尝试这个时:https://www.reddit.com/r/linuxquestions/comments/uj2y65/strange_scp_r_error/
我只得到这个:
usage: scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-S program] [[user@]host1:]file1 ... [[user@]host2:]file2
更新2:
我的 macOS 是 Ventura 13.1。我的其他计算机都没有使用此版本,并且我可以从任何其他计算机成功地 scp 到服务器。
答案1
我猜测您已经破坏了问题中的路径,以避免泄漏您认为敏感的信息,但这样做时您稍微改变了实际使用的命令的结构。
该path canonicalization failed
错误是由于scp
默认情况下已更改为使用 SFTP 协议而导致的,并且现在它对路径的要求比以前更加严格。具体来说,新版本要求目录不得有尾部斜杠,并且路径名中的空格必须使用前面的反斜杠 ( \
) 进行转义。
这将失败:
scp -r /source_directory/filename user@server:/home/user/destination/
这将成功:
scp -r /source_directory/filename user@server:/home/user/destination
您可以暂时恢复使用原始scp
协议,scp -O
但不建议这样做,甚至不会持续很长时间。有关更改原因的更多详细信息,请阅读问题的答案scp不安全吗?应该换成sftp吗?,特别是那些引用CVE-2019-6111。
答案2
我使用的是 WIN10 和 Cygwin,从版本更新 Cygwin 后我遇到了同样的问题。 2.895 至 2.921。
我正在使用本地文件夹的设置
cd "${0%/*}" || exit
然后我们使用scp -r -o
将本地相对文件夹(./folder1
)传输到远程位置/home/root/folder1
。
我也尝试更改目标文件夹,/home/root
但这并没有解决问题,我仍然收到以下错误:
scp: realpath /home/root/folder1: No such file
scp: upload "/home/root/folder1": path canonicalization failed
scp: failed to upload directory ./JPSApps to /home/root
即使chmod
命令失败并显示消息
chmod: /home/root/folder1: No such file or directory
但那是因为我无法转移要授予权限的文件夹。
我怀疑还有其他事情发生。
现在,我通过复制C:\Cygwin64
我复制的上一个文件夹来代替新文件夹来解决我的问题,现在它可以工作了。但这是Cygwin。