我正在编写一个 shell 脚本,用于使用scp
.如果目标目录不存在,我会收到一条误导性的错误消息。 IE:
scp user@remote-host:/path/to/existing/file /local/non-existing/directory/
我收到的错误是:
/local/non-existing/directory/: Is a directory
这是令人费解的......我希望是这样的:
Directory /local/non-existing/directory/ does not exist
- 这对任何人都有意义还是只有我有意义?
- 你认为这是scp的缺陷吗?
- 我运行的是 Ubuntu 14.04.3 LTS,其他操作系统也一样吗?
答案1
漏洞
找到了相关错误。它似乎在 Ubuntu 14.04.5 中已修复(openssh 1:6.6p1-2ubuntu2.8)
有一个关于a的解释红帽错误报告:
这个问题在原始 openSSH 中也存在,当您尝试将某些内容复制到具有现有父目录的不存在目录中时,就会出现此问题。缺少对该边界条件的检查。当 scp 进程尝试写入上述文件时,会抛出错误消息,但该文件以斜杠结尾(这是目录的解释),这就是当前错误消息的原因。
原答案
无法重现(在 Ubuntu 14.04.5 LTS 和 Linux Mint 17 上测试)
如果
/local/non-existing/directory
不存在,则scp
失败并显示:/local/non-existing/directory: No such file or directory
如果
/local/existing/directory
存在,scp
则复制file
到/local/existing/directory/file
如果
remote-host:/path/to/existing/file
是目录,则scp
失败并显示:scp: file: not a regular file
故障排除
ssh user@remote-host "file /path/to/existing/file"
应该为您提供有关远程文件(或可能的目录)的信息。
file /local/non-existing/directory/
应该为您提供有关本地目录的信息
mkdir -p /local/non-existing/directory/
将递归创建目录以及任何父目录(如果需要)。
之后mkdir -p
,如果file
确实是一个文件并且/local/non-existing/directory/
确实是一个目录,那么您的scp
命令应该可以工作。