使 scp 表现得像它应该的那样(远程文件复制程序)

Mar*_*ter 7 scp cp

我想使用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 scpscpremote file copy program。那么为什么它会默默地失败,并且表现得像cp

有任何解决这个问题的方法吗 ?

我的版本openssh-client1:6.0p1-4+deb7u6

Arc*_*mar 7

简短的回答是你不能。

请注意,man scp提及远程主机是可选的:

scp(删除了 scp 选项)[[user@]host1:]file1 ... [[user@]host2:]file2

现在,当您发出命令时

scp arg1 arg2
Run Code Online (Sandbox Code Playgroud)

scp将自行决定是通过寻找远程主机:arg1arg2(和两个远程主机可permited(Solaris中,Ubuntu的)altough这是情况并非总是如此)。

如果既没有arg1arg2没有冒号,则scp简单地表现为cp.


cas*_*cas 7

在 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 是否“应该”表现得像这样。这由您决定自己的系统。但是,当您必须在没有所有自定义黑客/拐杖的情况下在系统上工作时,变得依赖于这样的东西会使您处于严重的劣势。


小智 0

为什么不试试sftp呢?您可以cd在远程服务器上和lcd本地文件系统上,然后put将本地文件上传到远程。