通过 SSH 在 sudo 下运行命令

通过 SSH 在 sudo 下运行命令

我正在使用 Bash 脚本访问 Linux 中的远程计算机。我的代码如下

 #!/bin/bash
 ssh -i manu_bp.pem [email protected] <<EOF
 sudo -s
 cat /opt/revsw-config/apache/rijomon2_revsw_net/ui-config.json > r1.txt
 echo `$(jq ".rev_component_co.mode" r1.txt)`
 EOF

我无法打印 jq 值。如果我echo $(jq '.rev_component_co.mode' r1.txt)在远程计算机的终端中编写此命令,它将显示确切的结果。但是如果我把它写在脚本中并尝试执行,它会显示错误

jq: r1.txt: No such file or directory

答案1

您正在jq本地计算机上运行,​​因为您使用的是“未加引号”的此处文档,其中\`$插入了字符。要在远程 shell 中运行该命令,请安排此处文档中传递的文本以包含该命令。由于您不使用任何局部变量或命令替换,因此最简单的方法是使用文字此处文档。

ssh -i manu_bp.pem [email protected] <<'EOF'
sudo -s
cat /opt/revsw-config/apache/rijomon2_revsw_net/ui-config.json > r1.txt
echo "$(jq ".rev_component_co.mode" r1.txt)"
EOF

我认为在美元括号周围使用反引号是一个错误 - 这会获取命令的输出jq并依次使用该输出作为要执行的命令。

您可以简化这一点:echo "$(somecommand)"这是一种打印输出的复杂方式somecommand(有一些差异,例如剥离最后的换行符以及在某些 shell 中进行反斜杠扩展,但如果这些很重要,那么使用echo可能是错误的方法)。

ssh -i manu_bp.pem [email protected] <<'EOF'
sudo -s
cat /opt/revsw-config/apache/rijomon2_revsw_net/ui-config.json > r1.txt
jq ".rev_component_co.mode" r1.txt
EOF

您可以只在一个命令中编写此内容(换行符可选),但请注意您需要两级引用,一层用于本地 shell,一层用于删除 shell。

ssh -i manu_bp.pem [email protected] 'sudo sh -c "
  cat /opt/revsw-config/apache/rijomon2_revsw_net/ui-config.json > r1.txt;
  jq .rev_component_co.mode r1.txt"'

如果您不需要jq以 root 身份运行,只需以 root 身份读取文件,请使用

ssh -i manu_bp.pem [email protected] '
  sudo cat /opt/revsw-config/apache/rijomon2_revsw_net/ui-config.json > r1.txt;
  jq .rev_component_co.mode r1.txt'

相关内容