【问题标题】:bash commands to remote hosts - errors with writing local output filesbash 命令到远程主机 - 写入本地输出文件时出错
【发布时间】:2017-11-28 01:52:28
【问题描述】:

我正在尝试在几个远程主机上并行运行几组命令。 我创建了一个构建这些命令的脚本,然后将输出写入本地文件,类似于:

ssh <me>@<ip1> "command" 2> ./path/to/file/newFile1.txt & ssh <me>@<ip2> 
"command" 2> ./path/to/file/newFile2.txt & ssh <me>@<ip2> "command" 2> 
./path/to/file/newFile3.txt; ...(same repeats itself, with new commands and new 
file names)...

我的问题是,当我的脚本运行这些命令时,我收到以下错误:

bash:  ./path/to/file/newFile1.txt: No such file or directory
bash:  ./path/to/file/newFile2.txt: No such file or directory
bash:  ./path/to/file/newFile3.txt: No such file or directory
...

这些文件不存在,但会被写入。话虽如此,目录路径是有效的。

奇怪的是,如果我复制并粘贴整个大命令,那么它可以正常工作。我宁愿让它自动化;)。

有什么想法吗?

编辑 - 更多信息:

我的文件系统如下:

- home
  - User
    - Desktop
      - Servers
        - Outputs
          - ...

我正在从 home/User/Desktop/Servers 运行 bash 脚本。 该脚本创建需要在远程服务器上运行的命令。首先,脚本创建将存储文件的目录。

outputFolder="./Outputs"
...
mkdir -p ${outputFolder}/f{fileNumb}
...

然后脚本继续创建将在远程主机上调用的命令,它们各自的输出将放置在创建的目录中。 目录在那里。运行命令会给我错误,但是出于某种原因,打印然后将命令复制到同一位置是可行的。我也试过给出目录的完整路径,还是一样的问题。

希望我说得清楚一点。

【问题讨论】:

  • 路径必须存在才能进行重定向(中间目录不会自动创建)。所以mkdir -p path/to/file在重定向之前&gt; path/to/file/newFile.txt
  • 您的问题似乎没有包含足够多的相关信息,因此只能进行猜测。请提供问题的minimal, complete, and verifiable example,以便所有相关信息(以及最少的不相关信息)都在这里。
  • 你的问题 still 没有包含足够的信息来实际说明正在发生的事情——这就是创建 MCVE 的重点。但是您提到“创建命令”让我感到怀疑——您是否尝试在执行命令之前将命令存储在变量中?如果是这样,有很多事情可能会出错。见BashFAQ #50: I'm trying to put a command in a variable, but the complex cases always fail!
  • 我刚刚意识到我的错误是没有在包含我的命令字符串的变量上调用“eval”。应该从一开始就给出完整的脚本,你是对的。将确保我的下一个问题包含 MCVE。
  • @dtam eval 在 shell 脚本中几乎从来都不是正确的答案。当你测试它们时编写完美运行的脚本真的很容易,但是通常会在一些数据中出现一些意想不到的元字符,改变所有内容的解析方式,突然间你认为只是数据的东西正试图作为命令执行.. . 基本上,它是一个巨大的footgun。几乎总是有更好的方法来做到这一点。 BashFAQ #50 有一些很好的建议,但如果它们都不适合您的情况,我建议您询问最好的方法(作为一个新问题)。

标签: bash file unix ssh remote-server


【解决方案1】:

如果这是您收到的确切错误消息:

bash:  ./path/to/file/newFile1.txt: No such file or directory

然后你会注意到冒号和点之间有一个额外的空格,所以它实际上是在尝试打开一个名为 " ./path/to/file/newFile1.txt" 的文件(不带引号)。

但是,要做到这一点,您需要在重定向中的文件名周围使用引号,如

something ... 2> " ./path/to/file/newFile1.txt"

或者第一个字符必须是常规空格以外的其他字符。可能是一个不间断的空格,如果您点击 alt-space 等,某些编辑器可能会创建一些内容。

【讨论】:

  • 是个好主意,但我再次检查并有一个空格。
【解决方案2】:

我认为你的表现不足以正确回答问题。

这看起来不像 ssh 的问题,而是您调用 (ssh) 命令的方式。

您说您正在将命令写入文件...大概您随后将该文件作为脚本运行。你能展示你用来做那件事的代码吗?我相信这是你的问题。

我怀疑您对运行脚本时工作目录的更改方式做出了错误的假设。它没有。您正在列出相对路径,因此了解它们相对于什么很重要。这是您复制和粘贴它时它工作的最可能原因......您正在从不同的工作目录执行。

【讨论】:

  • 当我复制和粘贴它时,我会在与我正在运行的脚本相同的位置执行此操作。如果有帮助,我已经用更多信息编辑了我的原始帖子。
【解决方案3】:

我是 bash 脚本的新手,我正在根据我见过的另一个脚本来构建我的脚本。我通过简单地调用存储命令的变量来“运行”命令:

$cmd

通过使用解决:

eval $cmd 

相反。我的错,应该从一开始就给出完整的脚本。

【讨论】:

    猜你喜欢
    • 2018-01-10
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2020-08-13
    相关资源
    最近更新 更多