【问题标题】:running ssh command from a shell script从 shell 脚本运行 ssh 命令
【发布时间】:2015-02-11 12:41:01
【问题描述】:

我是 shell 脚本的新手,我正在尝试从 shell 脚本运行以下命令。

 diff <(ssh user@remote_host 'cat remote_file.txt') <(ssh user2@remote_host2 'cat remote_file2.txt')

但出现错误:

./a.sh: syntax error at line 1: `(' unexpected

我通过谷歌搜索尝试了一些示例,它说要在代码周围使用 $() ,但它不起作用,请任何人帮助我。

【问题讨论】:

  • 听起来您正在为不支持进程替换的脚本使用/bin/sh。尝试使用/bin/bash
  • 嗨 Etan,我尝试了 #!/bin.sh#!/bin/bash 在这两种情况下都收到错误 ./a.sh: syntax error at line 2: vars=$' unexpected``
  • 你是如何运行脚本的?它有执行权限吗?那 sn-p 只有一行。如果您从第 2 行得到错误,我们可能无法帮助您(第 2 行的错误意味着 bash 接受了 &lt;() 语法)。

标签: shell scripting sh


【解决方案1】:

我了解您想在“差异”中使用两个远程文件的输出。您的解决方案有很多问题:

  • 您不能将两个输出流重定向到一个输入流
  • diff 仅适用于文件,不适用于标准输入
  • 使用一个命令的输出作为另一个命令的输入是使用管道完成的。重定向是从文件到命令或从命令到文件。
  • 括号用于捆绑命令,例如“( echo a ; echo b ) | cat” 将导致 'echo a' 和 'echo 'b' 的输出在一个流中传递到 'cat 的输入',这将简单地打印它。

我会做的(完成我认为你想做的事)是将它变成三个单独的命令:

ssh user@remote_host 'cat remote_file.txt' > file1
ssh user2@remote_host2 'cat remote_file.txt' > file2
diff file1 file2

【讨论】:

  • 大家好,我创建了一个带有以下想法的shell脚本,如下所示:
    `#!/usr/local/bin/bash srchost=echo $1 | cut -d ':' -f 1srcpath=@ 987654323@ dishost=echo $2 | cut -d ':' -f 1 dispath=echo $2 | cut -d ':' -f 2 echo $srchost echo $srcpath echo $dispath echo $dishost ssh $srchost cat $srcpath > file1 ssh $dishost cat $dispath > file2 diff file1 file2 ` 
    **这个脚本卡住了**
  • &lt;() 不是输入重定向。它是进程替换,在一个命令行上使用两次是非常好的。这使得这篇文章中的所有四个点都不正确(在此处应用)。
  • 为此使用文件是一个完全合理的答案,但这并不是因为 OP 中的概念有任何问题,当然,还有两次写入和读取磁盘的成本(可能缓存但仍然)。
  • 感谢指正。我认为我是这方面的专家。 :P
【解决方案2】:

我只是制作这个 bash 脚本没有问题

#!/bin/bash
diff <(ssh user@remote_host cat remote_file.txt) <(ssh user2@remote_host2 cat remote_file2.txt)
exit 0

这适用于以下条件:
-remote_host 和 remote_host2 留在~/.ssh/known_hosts列表中
-user 和 user2 存在且有权限
-remote_host 和 remote_host2 正在运行,并且有 ssh 服务器
-user@remote_host 和 user2@remote_host2 已将 ssh 配置为无需密码即可工作
如果你不知道怎么做,请看http://www.linuxproblem.org/art_9.html

也许你的错误会留在',但如果你不使用'remote_file.txt'而只使用remote_file.txt,它一定能正常工作

【讨论】: