【问题标题】:How to handle single quotes inside an ssh command with double quotes如何使用双引号处理 ssh 命令中的单引号
【发布时间】:2020-10-10 01:43:26
【问题描述】:

我有一个要求,我需要在当前和远程服务器中使用具有单引号的参数,如下所示

var1=$2
var2=`echo $var1|sed -r "s/'/\\\\\'/g"`
echo "echo \\\"$var2\\\" && ssh id@server \\\" echo \\\"$var2\\\" \\\" " > sql1.txt
xargs --arg-file=sql1.txt --max-procs=$1 --replace --verbose /bin/sh -c "{}"

转义引号后,参数在当前服务器中完美填充,但在远程服务器上未显示单引号。

ksh script.ksh 2 "tablename where last_load_dt = '2020-06-19'"

输出

/bin/sh -c echo "tablename where last_load_dt = '2020-06-19'" && ssh id@server "echo "tablename where last_load_dt = '2020-06-19'" "
tablename where last_load_dt = '2020-06-19'
---ssh to remote server---
tablename where last_load_dt = 2020-06-19 

如何在远程服务器中正确填充单引号?

【问题讨论】:

  • @thatotherguy 写给sql1.txt
  • 暂时忽略如何,你想做什么?多层引用和转义通常意味着您以错误的方式处理此问题。
  • SSH 需要额外的转义层。这是一个更简单的复制:echo "'hi'"; ssh localhost echo "'hi'"; ssh localhost "echo \"'hi'\""。不过,您绝对应该退后一步重新考虑这种方法,因为这种方法既麻烦又容易出错。如果要并行运行命令,可以使用带有semprintf "%q" 的简单循环来转义

标签: linux bash shell unix ksh


【解决方案1】:

如果bash(你已经作为标签)可以使用,这是一种解决方案:

printf "%s\0" "echo \"$2\" && ssh id@server echo \"${2@Q}\"" > sql1.txt
xargs -0 --arg-file=sql1.txt --max-procs=$1 --replace --verbose /bin/sh -c "{}"

${2@Q} 用于正确转义单引号。

还有xargs -0 防止双引号被取消。

调用方法:

bash script.bash 2 "tablename where last_load_dt = '2020-06-19'"

【讨论】:

  • test2.bash: 第 4 行: echo "$var2" && ssh id@server " echo "${2@Q}" " : 替换错误。得到这个错误,ssh 之后的输出仍然没有显示单引号。你能解释一下这是什么 - "${2@Q}" 是什么意思。此外,我在当前 shell 中的一系列操作很少,并且保留在远程 shell 中。所有这些都由 && 连接。是否有任何简单的方法来逃避引用,希望通过对我的代码进行最小的更改来实现它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 2018-03-19
相关资源
最近更新 更多