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"인용되지 않은" 여기 문서를 사용하고 있기 때문에 로컬 컴퓨터에서 실행 중 입니다 . \`$원격 셸에서 명령을 실행하려면 여기 문서에 전달된 텍스트를 정렬하여 명령을 포함하세요. 로컬 변수나 명령 대체를 사용하지 않으므로 가장 쉬운 방법은 리터럴 here 문서를 사용하는 것입니다.

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(마지막 줄 바꿈을 제거하고 일부 쉘에서 백슬래시 확장을 수행하는 것과 같은 몇 가지 차이점이 있지만 이것이 중요하다면 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

단 하나의 명령(개행은 선택 사항)으로 이를 작성할 수 있지만 두 가지 수준의 인용이 필요합니다. 하나는 로컬 셸용이고 다른 하나는 삭제 셸용입니다.

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단지 루트로 파일을 읽으려는 경우 다음을 사용하십시오.

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'

관련 정보