Как запустить sed на удаленном сервере, используя ssh внутри сценария оболочки (переменные включены) - PullRequest
0 голосов
/ 30 октября 2018

У меня здесь есть ситуация, я пытаюсь запустить команду sed на удаленной оболочке внутри моего сценария оболочки и использую переменные, которые являются динамическими и в итоге снова и снова получают одну и ту же ошибку.

Это команда sed, которая отлично работает на локальной оболочке без каких-либо ошибок. Я использовал это регулярное выражение после тщательного тестирования и, поверьте, проблем с ним нет.

sed -i 's/  #0\t30718/ 0\t30718/' ./config.txt

Попытка запустить это в удаленной оболочке, используя ssh:

ssh root@sys_name sed -i 's/  #0\t30718/ 0\t30718/' /absolute-path/vconfig.txt

И когда я пытаюсь запустить эту команду, используя переменные. (30718 и путь к файлу являются переменными):

ssh root@sys_name 'sed -i "s/0\t${pe_list[0]}/#0\t${pe_list[0]}/g" $file_path'

или как это:

ssh root@sys_name "sed -i 's/0\t${pe_list[0]}/#0\t${pe_list[0]}/g' $file_path"

Я либо получаю выражение sed: -e # 1, char 2: неопределенная команда `s ' ошибка, либо команда sed выполняется с нежелательным выводом, совпадающим с именами переменных, как есть. Короче говоря, я хочу выполнить команду sed на удаленной оболочке, используя ssh, и ограничение состоит в том, что вся команда является частью сценария, а значения, которые должны быть сопоставлены, и имя файла являются переменными в этом файле.

1 Ответ

0 голосов
/ 30 октября 2018

В вашей локальной оболочке установлена ​​переменная, но она не является sed переменной, поэтому вы должны выйти из sed окружения, закрыв ее одинарной кавычкой, поместив переменную, затем открыв снова с одинарной кавычкой и продолжением sed stuff:

sed -e 's/Red Hat/'${z}'/' /etc/redhat-release

Если ваша переменная $ z содержит пробелы, ее необходимо заключить в двойные кавычки:

sed -e 's/Red Hat/'"${z}"'/' /etc/redhat-release

Наконец, когда вы отправляете команду через ssh, вы также добавляете двойные кавычки вокруг всей команды, поэтому все двойные кавычки, используемые в этой команде, должны быть экранированы, иначе все между ними будет оцениваться локально на вашем исходном хосте. Так что сделайте так:

z="BLACK HAT"    
ssh root@sys_name "sed -e 's/Red Hat/'\"${z}\"'/' /etc/redhat-release"

Вы получите:

BLACK HAT Enterprise Linux Server release 6.10 (Santiago)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...