我想使用scp
.
scp -rp local-file my.server.com:/tmp/
Run Code Online (Sandbox Code Playgroud)
有时我忘记指定应该将文件复制到远程服务器上的哪个位置:
scp -rp local-file my.server.com
Run Code Online (Sandbox Code Playgroud)
或者,其他时间我输错:
一个;
:
scp -rp local-file my.server.com;/tmp/
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,scp
都应该失败。但相反,它的行为完全是愚蠢的,并且cp
会像往常一样在本地复制本地文件。
cp local-file my.server.com
Run Code Online (Sandbox Code Playgroud)
甚至man scp
说scp
是remote file copy program
。那么为什么它会默默地失败,并且表现得像cp
?
有任何解决这个问题的方法吗 ?
我的版本openssh-client
是1:6.0p1-4+deb7u6
简短的回答是你不能。
请注意,man scp
提及远程主机是可选的:
scp(删除了 scp 选项)[[user@]host1:]file1 ... [[user@]host2:]file2
现在,当您发出命令时
scp arg1 arg2
Run Code Online (Sandbox Code Playgroud)
scp
将自行决定是通过寻找远程主机:
中arg1
或arg2
(和两个远程主机可permited(Solaris中,Ubuntu的)altough这是情况并非总是如此)。
如果既没有arg1
也arg2
没有冒号,则scp
简单地表现为cp
.
在 bash 中,您可以编写这样的包装函数。
function scp {
if grep -q ':[^ $]' <<< "$*" ; then
command "${FUNCNAME[0]}" "$@"
else
echo "missing or invalid hostname:path in scp command"
return 1
fi
}
Run Code Online (Sandbox Code Playgroud)
这是一个非常粗略的示例,它所做的只是检查:
命令行中是否至少有一个非空格字符(这对于概念验证示例来说已经足够了,但对于实际使用来说还不够)。如果有,它运行scp
命令。如果没有,它会打印一条错误消息并返回退出代码 1。
或者您可以将其编写为脚本 - 无论哪种方式都没有什么区别。
顺便说一句,我在上面说“在 bash 中”,那是因为我只在 bash 中测试了上述功能。这并不意味着只有 bash 可以做到这一点。大多数其他 sh 实现允许您执行相同或类似的操作。语法可能略有不同,您可能需要硬编码command scp ...
而不是更通用的command "${FUNCNAME[0]} ..."
.
PS:我不判断 scp 是否“应该”表现得像这样。这由您决定自己的系统。但是,当您必须在没有所有自定义黑客/拐杖的情况下在系统上工作时,变得依赖于这样的东西会使您处于严重的劣势。