我在 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 中扩展,从而使命令正常工作。或者,如果您在脚本中没有用双引号将变量括起来,则可能不会扩展它 - 但这通常会导致可见的错误,这让我相信这种特定情况并非如此。无论哪种方式,使用双引号括住变量都不会出错。