Запустите команду в sudo через SSH

Я получаю доступ к удаленной машине в Linux, используя скрипты Bash. Мой код выглядит следующим образом

#!/bin/bash ssh -i manu_bp.pem ubuntu@54.68.67.68 <<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 

One Solution collect form web for “Запустите команду в sudo через SSH”

Вы запускаете jq на локальном компьютере, так как вы используете «неуказанный» здесь документ, где символы \`$ интерполируются. Чтобы запустить команду в удаленной оболочке, упорядочьте текст, переданный в этом документе, чтобы содержать команду. Поскольку вы не используете локальную переменную или подстановку команд, самый простой способ сделать это – использовать литерал здесь.

 ssh -i manu_bp.pem ubuntu@54.68.67.68 <<'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 

Я предполагаю, что использование backquotes вокруг круглой скобки в долларах было ошибкой – это привело бы к выходу команды jq и использовало бы этот вывод в качестве команды для выполнения.

Вы можете упростить это: echo "$(somecommand)" – это echo "$(somecommand)" способ печати вывода somecommand (с несколькими отличиями, например, отключение окончательной новой строки и в некоторых оболочках, выполняющих обратную косую черту, но если это вообще имеет значение, то использование echo , вероятно, является неправильным методом).

 ssh -i manu_bp.pem ubuntu@54.68.67.68 <<'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 ubuntu@54.68.67.68 '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 ubuntu@54.68.67.68 ' sudo cat /opt/revsw-config/apache/rijomon2_revsw_net/ui-config.json > r1.txt; jq .rev_component_co.mode r1.txt' 
  • Как работает туннелирование SSH
  • Как выполнить удаленную команду для существующей сессии ssh
  • SSH замедляется при стартовой сессии
  • Переадресация X11 через SSH и su
  • Что такое пересылка порта ssh и какая разница между локальной и удаленной пересылкой портов
  • Неисправна debian
  • Возможно ли, что * можно напрямую украсть закрытый ключ, если он не использует кодовую фразу?
  • Расширение GLX отсутствует на дисплее «localhost: 10.0»
  • Что произойдет, если я удалю все пароли пользователей?
  • ssh-agent завершает смену сети
  • Linux: Как обновить ssh-keygen?
  • Linux и Unix - лучшая ОС в мире.