URL: https://www.opennet.dev/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 10447
[ Назад ]

Исходное сообщение
"Как экранировать символы гравис и $ в переменной с помощью sed"

Отправлено Владимир , 19-Июл-23 11:13 
Добрый день!
есть переменная a, в  которой предполагается хранить команды shell любой сложности для последующей записи этой команды в БД. Для этого мне нужно экранировать все спецсимволы $, чтобы bash не обрабатывал конструкцию $(..), которая будет возвращать результат выполнения команды.
Я думаю решить эту задачу с помощью sed, как указано в скрипте:

#!/bin/bash
a="for personal in $(/bin/awk -F":" '{ if ( $5 ~ /Admin / && $3 > 100 ) print $1 }' /etc/passwd); do passwd -S $personal;done"
b=$(sed 's,$,\\$,g' <<< $a)
echo $b

Но результат получается не тот, который я ожидал:  
for personal in user1\$ user2\$ user3;do passwd -S ;done\$
Очевидно сработала обработка bash подстановки команды.

Если бы я в строке руками экранировал все символы $:
#!/bin/bash
a="for personal in \$(/bin/awk -F":" '{ if ( \$5 ~ /Admin / && \$3 > 100 ) print \$1 }' /etc/passwd); do passwd -S \$personal;done"
echo $a

То результат был бы правильным:
for personal in $(/bin/awk -F":" '{ if ( $5 ~ /Admin / && $3 > 100 ) print $1 }' /etc/passwd); do passwd -S $personal;done

Видимо, что-то я не так делаю в команде sed. Если есть идеи, буду очень признателен.


Содержание

Сообщения в этом обсуждении
"Как экранировать символы гравис и $ в переменной с помощью sed"
Отправлено Ann None , 19-Июл-23 15:45 
вместо муйней хаяться для начала можно посмотреть на разницу в обработке строк в одинарных и в двойных кавычках и понять какие когда нужны. потом не забыть посмотреть на экранирование этих самых кавычек внутри кавычек. на закуску почитать про мультилайн переменные и прочий cat << EOF и переосмыслив подход подойти к задаче с правильной стороны.

"Как экранировать символы гравис и $ в переменной с помощью sed"
Отправлено Аноним , 20-Июл-23 10:44 
Аффтар, опиши реальную задачу, которая перед тобой стоит. А не одно из ошибочных решений. https://xyproblem.info/

"Как экранировать символы гравис и $ в переменной с помощью sed"
Отправлено ыы , 20-Июл-23 21:32 
> Добрый день!
> есть переменная a, в  которой предполагается хранить команды shell любой сложности
> для последующей записи этой команды в БД. Для этого мне нужно

проблема как вы очевидно понимаете, в том что вы задаете переменную в самом теле скрипта, и уже на момент ее определения - интерпретатор выполняет все необходимые подстановки.

если вы будете брать строки из файла- то в момент чтения такой строки в переменную- спец-символы будут просто символами и их можно экранировать регекспом.


> экранировать все спецсимволы $, чтобы bash не обрабатывал конструкцию $(..), которая

вы уверены что в БД нужно хранить именно строки "как есть" с экранированием? ведь можно сразу, ничего не экранируя закодировать строку в base64 и хранить в базе строки base64...


"Как экранировать символы гравис и $ в переменной с помощью sed"
Отправлено Аноним , 30-Июл-23 20:22 
> есть переменная a, в  которой предполагается хранить команды shell любой сложности
> для последующей записи этой команды в БД.

Автор, ты столько проблем себе создаешь на ровном месте. Не забудь еще что БД, если это SQL какой-то, тоже надо экранирование. При том - отличное от экранирования shell. И в целом написать такую конструкцию в безопасном виде - будет очень нетривиально, особенно если ты не эксперт. Так что закончиться это все может довольно печально, взломамми и уязвимостями. Может, какие-то более подходящие для работы инструменты взять?