我正在使用 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'