Execute um comando sob sudo sobre SSH

2

Estou acessando a máquina remota no Linux usando o script Bash. Meu código é o seguinte

 #!/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

Não consigo imprimir o valor de jq. Se eu escrever esse comando como echo $(jq '.rev_component_co.mode' r1.txt) no terminal da máquina remota, ele mostrará o resultado exato. Mas se eu escrevo em um script e tento executar, ele mostra o erro

jq: r1.txt: No such file or directory
    
por Rijo Mon 21.01.2015 / 08:40

1 resposta

1

Você está executando jq na máquina local, já que está usando um documento "sem aspas" aqui, em que os caracteres \'$ são interpolados. Para executar o comando no shell remoto, organize o texto passado no documento here para conter o comando. Como você não usa nenhuma variável local ou substituição de comando, a maneira mais fácil de fazer isso é usar um documento literal aqui.

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

Assumo que o uso de backquotes em torno de parênteses em dólar foi um erro - isso levaria a saída do comando jq e usaria essa saída como um comando para executar.

Você pode simplificar isso: echo "$(somecommand)" é uma maneira complicada de imprimir a saída de somecommand (com algumas diferenças, como descartar novas linhas finais e, em alguns casos, fazer a expansão de contrabarra, mas se isso for importante, usar echo é provavelmente o método errado).

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

Você poderia escrever isso em um único comando (novas linhas opcionais), mas cuidado com a necessidade de dois níveis de cotação, um para o shell local e outro para o shell de remoção.

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"'

Se você não precisa executar jq como root, apenas para ler o arquivo como root, use

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'
    
por 22.01.2015 / 01:15