The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]



"Как экранировать символы гравис и $ в переменной с помощью sed"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"Как экранировать символы гравис и $ в переменной с помощью sed"  +/
Сообщение от Владимирemail (??), 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. Если есть идеи, буду очень признателен.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по времени | RSS]


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

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

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

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

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


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

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

Ответить | Правка | Наверх | Cообщить модератору

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

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

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру