如何从具有变量作为文件路径的服务器进行 scp?

How do I scp from a server with a variable as the file path?

我正在尝试编写一个 bash 脚本来 (1) 在服务器上找到与字符串模式匹配的最新文件,以及 (2) 将该文件从服务器复制到本地。我已经完成了第一部分,但在第二部分遇到了问题。

我已经尝试了使用引号、大括号、转义冒号、对服务器上的根文件夹进行硬编码的所有组合,但 none 行得通。

file_name=$(ssh -t id@server.com "ls -t /path/to/file/on/server/file_name_* | head -1; bash -l") echo $file_name #this works scp id@server.com:$file_name path/to/local #this does not work

第 2 行有效,所以我假设第 1 行有效。当我使用 file_name 硬编码将命令键入终端时,我可以 运行 第 3 行没有问题。当我 运行 这个脚本时,我收到一条错误消息,说 No such file or directoryhalf/of/the/path/to/the/file.csv 基本上是错误消息,没有 space,然后是第 2 行回声的一半路径。感谢任何帮助。

不明白你为什么用"ssh -t"和"bash -l"。不需要它们。它们在我的测试环境中引起问题。

也就是说,这种问题很可能是由不可见字符引起的。要检查是否是这种情况,您可能需要 echo "[$file_name]" 以便您可以查看其中的内容。

在这种特殊情况下,请在下面查看我发现的内容:

   $ file_name=$(ssh -t testbox "ls -t /home/ec2-user/hello* | head -1")
   Connection to xxx closed. 

   $ echo "[$file_name]"
   ]/home/ec2-user/hello  # <--- the expected output is [/home/ec2-user/hello]

   $ scp testbox:$file_name ./
   : No such file or directory

相比之下,没有 -tssh 给了我们预期的结果:

$ file_name=$(ssh testbox  "ls -t /home/ec2-user/hello* | head -1")

$ echo "[$file_name]"
[/home/ec2-user/hello]

$ scp testbox:$file_name ./
hello                                    100%    0     0.0KB/s   00:00