LINUX.ORG.RU
ФорумAdmin

[bash] Экранирование спецсимволов

 


0

1

Я не совсем понял, каким образом в баше можно нормально экранировать переменные, так чтобы ни кавычки (" и ""), ни \ | / ` ~ не обрабатывались сами башем, если они есть в переменной.

Пример:
cat text_so_spetssivolami | ( while read line; do
echo $line
if [ $line == «1» ];
then
echo YES
fi
done

Ещё пример:
~# cat /tmp/lol
;:'":'«\/.;|\/`~`@#23!$%^&*()+_}{[]{}][
~# cat /tmp/lol | ( read line; echo »${line}" )
;:'":'«/.;|/`~`@#23!$%^&*()+_}{[]{}][

Как бы я не экранировал $line, всё-равно какие-то спец-символы (в зависимости от вида экранирования) заставляют bash работать некорректно.

Особенно меня интересует, как можно писать на баше безопасно. Т.е. чтобы даже если входящем потом (тут cat) мог управлять злоумышленник, то всё-равно они никак не мог бы преодолеть экранирование.

☆☆☆

Последнее исправление: ktulhu666 (всего исправлений: 2)

grep '^1$' text_so_spetssivolami

anonymous
()
Ответ на: комментарий от sdio

Обновил пост. Уже написал, что это не катит. :(

ktulhu666 ☆☆☆
() автор топика

В последнем примере пропали обратные слеши. Мне кажется, что это произошло ещё во время read.

gentoo_root ★★★★★
()
Ответ на: комментарий от gentoo_root

cat /tmp/lol | ( read -r line; echo «$line» )

А вот так работает. Т.е. получается, что двойных скобок всегда достаточно?

ktulhu666 ☆☆☆
() автор топика

ktulhu666

Особенно меня интересует, как можно писать на баше безопасно.

ABS читайте. Никак.

drBatty ★★
()
Ответ на: комментарий от ktulhu666

ktulhu666

На чём можно безопасно писать для работы с текстом, в основном?

на С, если фанатично придерживаться аккуратной работе. Ещё лучше на С++, но там нужно быть полностью оголтелым фанатиком. Скриптовые ЯП для написания безопасного ПО подходят плохо. Ну а вообще можно и на скриптовых писать безопасно, если знаешь все грабли и ловушки. И не усложнять, как это делаете вы, и все новички.

drBatty ★★
()
Ответ на: комментарий от ktulhu666

Питон и Перл прекрасно для работы с текстом подходят.

schizoid ★★★
()
Ответ на: комментарий от ktulhu666

ruby

безопасно

баги есть везде. ничто не безопасно, в какой-то степени

anonymous
()
Ответ на: комментарий от ktulhu666

cat /tmp/lol | ( read -r line; echo «$line» )

echo «$(cat /tmp/lol)»

Т.е. получается, что двойных скобок всегда достаточно?

Нет. Двойные кавычки экранируют далеко не всё. НО. bash выполняет подстановки ОДИН раз. Если нужно больше, используется eval.

a=5
b='$a'

echo "$b"
eval echo "$b"

Одинарные кавычки экранируют вообще всё

router ★★★★★
()
Ответ на: комментарий от router

Я про одинарные кавычки знаю. Они позволяют экранировать всё, что внутри них (кстати, с eval тоже?). Мой же вопроос бы в том, чтобы экранировать любые символы в значении переменной, чтобы они, в любом случае, были переданы скрипту, а не выполнились bash.
За eval спасибо.

ktulhu666 ☆☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.