【问题标题】:Unable to run a command that contains single quotes through ssh无法通过 ssh 运行包含单引号的命令
【发布时间】:2019-11-16 01:30:10
【问题描述】:

我可以在一台机器(我们称之为机器A)上执行以下命令。

find /foo/bar -name "*" -type f -exec md5sum {} + | awk '{print $1}' | sort

此命令列出了/foo/bar下文件的md5s。

但是,当我将此命令附加到 ssh 命令中时

ssh -i ~/.ssh/my_key my_user@123.123.123.123 'find /foo/bar -name "*" -type f -exec md5sum {} + | awk '{print $1}' | sort'

它会产生以下错误

awk: cmd. line:1: {print
awk: cmd. line:1:       ^ unexpected newline or end of string

123.123.123.123是机器A的IP地址。ssh命令是从另一台机器运行的。

是否可以将命令附加到 ssh 命令中?

我试过下面的命令,还是不行。

ssh -i ~/.ssh/my_key my_user@123.123.123.123 'find /foo/bar -name "*" -type f -exec md5sum {} + | awk \'{print $1}\' | sort'

【问题讨论】:

  • 您能否尝试通过在您的代码中执行\$ 来逃避awk 中的$,然后让我们知道?
  • 使用\$替换$会产生同样的错误信息。
  • 我认为您需要转义 awk 语句周围的单引号。你能试试吗?
  • 我试过了,但没有找到解决办法。
  • 切换到双引号怎么样?喜欢ssh -i ~/.ssh/my_key my_user@123.123.123.123 "find /foo/bar -name \"*\" -type f -exec md5sum {} + | awk '{print $1}' | sort"

标签: bash awk ssh


【解决方案1】:

awk 之后的单引号终止了find 之前的单引号。

在您的情况下,您的命令中没有进行参数扩展。因此,最简单的方法是对 ssh 命令使用双引号。

ssh -i ~/.ssh/my_key my_user@123.123.123.123 "find /foo/bar -name '*' -type f -exec md5sum {} + | awk '{print $1}' | sort"

另一种方法是将awk 参数周围的每个' 替换为'"'"',但这很难阅读。

【讨论】:

    【解决方案2】:

    单引号不能出现(甚至转义)在单引号字符串中。但它们可以出现(正确转义)在 ANSI 引用的字符串中。

    ssh -i ~/.ssh/my_key my_user@123.123.123.123 \
     $'find /foo/bar -name "*" -type f -exec md5sum {} + | awk \'{print $1}\' | sort'
    

    【讨论】:

      猜你喜欢
      • 2014-03-08
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多