The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Как экранировать символы гравис и $ в переменной с помощью 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, 15:45 , 19-Июл-23 (1) +1
    вместо муйней хаяться для начала можно посмотреть на разницу в обработке строк в одинарных и в двойных кавычках и понять какие когда нужны. потом не забыть посмотреть на экранирование этих самых кавычек внутри кавычек. на закуску почитать про мультилайн переменные и прочий cat << EOF и переосмыслив подход подойти к задаче с правильной стороны.
  • Как экранировать символы гравис и $ в переменной с помощью sed, !*! Аноним, 10:44 , 20-Июл-23 (2)
    Аффтар, опиши реальную задачу, которая перед тобой стоит. А не одно из ошибочных решений. https://xyproblem.info/
  • Как экранировать символы гравис и $ в переменной с помощью sed, !*! ыы, 21:32 , 20-Июл-23 (3)
    > Добрый день!
    > есть переменная a, в  которой предполагается хранить команды shell любой сложности
    > для последующей записи этой команды в БД. Для этого мне нужно

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

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


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

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

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

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




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

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