Сценарий sed bash неожиданно заменяет символ пробелом вместо новой строки

В Livejournal Дэна Уолша за 2014 год есть описание unconfined_service_t, хотя оно настолько тяжелое на жаргоне SELinux, что я боюсь, что вы не сможете извлечь из него много пользы при вашем нынешнем уровне знаний SELinux.

Согласно вашим комментариям, метки SELinux для процесса были:

  • при запуске с файлом.service:system_u:system_r:unconfined_service_t:s0
  • при ручном запуске:unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

Метки SELinux состоят из четырех частей:

  • Пользователь SELinux (с суффиксом _u)
  • Роль SELinux (с суффиксом _r)
  • Тип SELinux (с суффиксом _t)
  • и определение уровня SELinux, которое используется только с полной многоуровневой -безопасностью уровня политикой SELinux (военной безопасностью и т. п. ), а не с таргетингом по умолчанию политика.

В политике SELinux по умолчанию идентификатор пользователя SELinux отличается от вашего обычного имени пользователя. :По сути, SELinux не заботит, кому именно принадлежат какие-либо файлы или процессы, а только то, являетесь ли вы важным системным процессом или чем-то еще. запущен одним (system_u), администратором (sysadm_u), обычным пользователем(user_u)или чем-то, что было указано как неограниченное политикой SELinux (unconfined_u).

Часть роли может использоваться для указания нескольких ролей «частичных -администратора», например dbadm_rдля администрирования базы данных или logadm_rдля доступа к системным журналам.

Наиболее важной частью целевой политики SELinux является спецификация типа или часть с суффиксом _t.

unconfined_service_tдолжен быть неограниченным типом, поэтому я не уверен, что там пойдет не так. Возможно, все файлы в дереве каталогов /APIX/не помечены,и из-за этого могут быть проблемы?

Как и процессы, файлы также должны иметь метку SELinux, которую можно просмотреть с помощью ls -Z. Как правило, SELinux дает default_tдля любых файлов, для которых не указана метка. Столкнувшись с default_t, SELinux «думает» :«Я не знаю, что это такое; это может быть Ultra Top Secret, который потерял свою маркировку, поэтому давайте сохраним ее в дополнительной безопасности, пока какой-нибудь администратор не сообщит нам правильную маркировку. для этого." Короче говоря, default_t— это то, что вам нужно исправить.

Файлы обычно наследуют маркировку каталога, в котором они находятся во время создания, если не указано иное правило SELinux. Но если вы создадите новый каталог верхнего уровня -, такой как /APIX, вам нужно будет решить, как его пометить, иначе вы получите default_t, что может вызвать проблемы.

Вы можете попробовать установить semanage permissive -a unconfined_service_t:, чтобы разрешить любым службам, использующим unconfined_service_tсвободный доступ, при этом все нарушения политики SELinux регистрировались в /var/log/auth/, как если бы для них был полностью включен SELinux. Затем запуск audit2whyв соответствующей части журнала аудита должен дать вам более четкое описание того, почему SELinux блокирует выполнение программой того, что она хочет сделать.

Правильным решением может быть просто пометка каталога /APIX/подходящей меткой файловой системы.

1
28.04.2020, 12:10
1 ответ

Вы не заключаете в кавычки переменную OUT_TXT, когда используете ее с echo. Это приводит к тому, что оболочка разделяет значение переменной на пробелы, табуляции и новые строки на слова, которые затем передаются в качестве аргументовecho(после дополнительного расширения имени файла ). Затем echoвыводит эти аргументы с пробелами в -между ними.

Всегда цитируйте расширения переменных:

echo "$OUT_TXT"

Также обратите внимание, что у вас есть проблема в echo $IN_TXT. Если расширение переменной IN_TXTне заключено в кавычки как "$IN_TXT", ее значение будет использоваться в качестве шаблона подстановки и будет заменено любым подходящим именем файла (проверьте это с помощью IN_TXT='*', например ).

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

См. также:

Кроме того, вашу команду sedлучше писать как sed 'y/*/\n/'как стандартную sedпросто нельзя вставлять новые строки с помощью команды s///(GNU sedявляется исключением ). Команда sedy///знает , как заменить одиночные символы на новые строки, независимо от того, какая реализация sedиспользуется.

Или вы можете просто использовать команду trкак tr '*' '\n'или быструю замену переменной в оболочке:

printf '%s\n' "${IN_TXT//\*/ }"

или,

OUT_TXT=${IN_TXT//\*/ }
printf '%s\n' "$OUT_TXT"
2
19.03.2021, 02:21

Теги

Похожие вопросы