2017-11-25 399 views
0

我试图在几台远程主机上并行运行多组命令。 我已经创建了构建这些命令,然后在本地文件沿线的写入输出,事情的脚本:向远程主机发出bash命令 - 写入本地输出文件时出错

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 
      - ... 

我从家里/用户/桌面运行bash脚本/服务器。 该脚本创建需要在远程服务器上运行的命令。首先,脚本创建文件将被存储的目录。

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

脚本然后继续创建将遥控器上的主机被称为命令,并且它们各自的输出将被放置在所创建的目录中。 目录在那里。运行这些命令会给我带来错误,但是打印然后将这些命令复制到同一位置会出于某种原因。我也试图给出目录的完整路径,仍然是同样的问题。

希望我已经更清楚了一点。

+1

必须存在重定向才能工作的路径(中间目录不是自动创建的)。所以'mkdir -p path/to/file'在重定向'> path/to/file/newFile.txt'之前。 –

+0

您的问题似乎并未包含足够的相关信息以允许投机以外的任何内容。请提出问题的[最小,完整和可验证的示例](https://stackoverflow.com/help/mcve),以便所有相关信息(以及最小不相关信息)都在这里。 –

+0

你的问题*仍然*没有包含足够的信息来真实地告诉发生了什么 - 这就是创建一个MCVE的要点。但是你提到的“创建命令”让我感到怀疑 - 你是否试图在执行它们之前将命令存储在变量中?如果是这样,有很多事情可能会出错。参见[BashFAQ#50:我试图把一个命令放在一个变量中,但复杂的情况总是失败!](http://mywiki.wooledge.org/BashFAQ/050)。 –

回答

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或其他类似的东西。

+0

是个好主意,但我再次检查过,并且有一个空间。 – dtam

1

我不相信你已经证明足以正确回答这个问题。

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

你说你正在将这些命令写入一个文件中......假设你正在将该文件作为脚本运行。你可以展示你用来做这件事的代码吗?我相信那是你的问题。

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

+0

当我复制并粘贴它时,我在与正在运行的脚本相同的位置执行此操作。如果有帮助,我已经编辑了一些更多信息的原始文章。 – dtam

0

我是新来的bash脚本,并基于我见过的另一个建立我的脚本。我简单地调用存储已命令变量“运行”命令:

$cmd 

解决使用:

eval $cmd 

代替。我的不好,应该从一开始就给出完整的脚本。