SCP 通过 .sh 文件执行的奇怪行为

SCP 通过 .sh 文件执行的奇怪行为

我在 cygwin 上使用 SCP 时遇到了一个奇怪的问题,

scp $HOME/deploy.sh user@host:/tmp

运行良好,文件被复制到远程系统。

但是,在 a 中执行相同的命令test.sh却不起作用。我可以看到 scp 命令的输出与最后一个 stdout 相同,但是当我转到远程系统时,这些文件不存在!

测试文件

#!/bin/sh
scp $HOME/deploy.sh user@host:/tmp

看起来这和 cygwin 有关,这种行为在 Linux 系统上是看不到的。但不幸的是我的开发设置在 Windows 上,无法轻松切换。

答案1

我现在才遇到这种情况,问题在于换行。(^M)

尝试使用 dos2unix 转换脚本文件。它帮我解决了问题。

答案2

这可能是一个错误,但我不确定。

以下情况未出现该问题:

scp $HOME/deploy.sh user@host:/tmp/deploy.sh

当将文件夹名称作为目标时,会出现问题:

scp $HOME/deploy.sh user@host:/tmp

答案3

我很确定这是你脚本中的拼写错误。要验证

1) 在 /tmp 下创建一个目录。假设为 script_test。

2)cd 到 script_test 并使用 sh /path/to/script 运行脚本。

3)验证远程服务器上是否存在文件

4)检查script_test目录中是否有任何新创建的文件。

答案4

我认为在某些情况下(很多时候取决于操作系统),scp 行为会根据情况以不同的方式解释目录尾部斜杠。对于 rsync 等实用程序来说,实际上总是如此,但 scp 往往依赖于操作系统。

因此,如果我在脚本中使用 scp 将文件复制到远程目录并希望它保留原始文件名,我总是在目录末尾添加一个斜杠。我刚刚确认这有效:

Cygwin Bash 脚本:

#!/bin/bash
scp /cygdrive/c/users/jamey/desktop/program.sh 10.0.0.254:/tmp/

远程验证:

$ ssh 10.0.0.254
Password:
~/.bash_profile LOADED.
cnu326bxdx:~ Jamey$ ls -l /tmp/program.sh
-rwxr-xr-x  1 Jamey  wheel  77 Sep 24 09:51 /tmp/program.sh

另一个需要注意的重要事项是您要复制到的目录的权限。如果您的用户没有您要复制到的目录的访问权限,则文件显然不会被写入。这应该是显而易见的,但有时最明显的警告会造成最大的问题。

最后一件事(我并不是这方面的专家,但我只是提出另一个可能的建议)是,如果您的 $HOME 变量解析到的任何目录中有空格,则该变量可能会在 shell 中扩展,从而使命令正常工作。或者,如果您在脚本中没有用双引号将变量括起来,则可能不会扩展它 - 但这通常会导致可见的错误,这让我相信这种特定情况并非如此。无论哪种方式,使用双引号括住变量都不会出错。

相关内容