удар: Некоторая проблема при использовании чтения <<<“$VARIABLE” на корневом разделе только для чтения. Какие-либо известные обходные решения?

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

Да, Вы могли использовать -P. Но что случилось с разрешением tar удалить наклонную черту вправо и просто требование, чтобы пользователь архива явно сделал извлечение в корневом каталоге? Затем они сознательно влияют на критические системные местоположения и не могут сделать этого случайно.

11
13.04.2017, 15:13
3 ответа

Массив мог сделать строковый парсинг без потребности во временном файле. Не забывайте выключать globbing.

set -f
IFS=: Hosts=($HostFull)
HostMain=${Hosts[0]}
HostMid=${Hosts[1]}
HostSub=${Hosts[2]}
set +f
8
27.01.2020, 19:58
  • 1
    или даже без IFS, если Вы уверены, что нет никаких пробелов в $HostFull как так: Hosts=( ${HostFull//:/ } ). Или даже если существуют пробелы: HostMain=${HostFull%%:*}; HostMid=${HostFull#*:}; HostSub=${HostMid#*:}; HostMid=${HostMid%:*} (или что-то подобное, я запутываюсь :D). –  gniourf_gniourf 03.11.2013, 01:33
  • 2
    Вы правы, поскольку Вы показываете, что расширение параметра является хитрым бизнесом... –  xae 03.11.2013, 02:02

Я соглашаюсь с @gniourf_gniourf, Вашим, вероятно, нуждающимся доступом для записи, но не к дескрипторам файлов, скорее всего, файл.

Вы могли протестировать это путем трассировки выполнения команды когда в разделе только для чтения.

{ strace -p "$$" & sleep 1; read var1 <<< "hi"; sleep 1; kill "$1"; }

Вышеупомянутое будет работать strace на оболочке Bash (процесс $$). Это затем спит в течение 1 секунды, и затем работает read от ЗДЕСЬ ПРЕДСТАВЛЯЮТ В ВИДЕ СТРОКИ. Я поместил строку "hi" в этом положении. Я затем sleep в течение еще одной секунды и затем kill strace.

Пример

При парсинге этого вывода Вы заметите, что файл открыт как O_WRONLY, который является для записи в файл.

open("/tmp/sh-thd-4137571604", O_WRONLY|O_CREAT|O_EXCL|O_TRUNC, 0600) = 3

Выше мы видим то, во что пишется файл Вашей последовательностью команды.

4
27.01.2020, 19:58
  • 1
    Не “создать дескрипторы файлов” (который не имеет никакого смысла). Создать файл. Это не read это открывает файл для записи (который был бы глуп), это <<<. –  Gilles 'SO- stop being evil' 03.11.2013, 01:59
  • 2
    @Gilles - спасибо, я не вполне понял то, что она говорила мне. Очищенный A. –  slm♦ 03.11.2013, 02:19
  • 3
    ! Очень хорошая техника, которая могла бы даже помочь мне многократно в будущем с подобными проблемами. Однако одна вещь волнует меня, и это - факт это /tmp путь hardcoded. И вероятно Вы предположили это, /tmp Уже ЕСТЬ ЛИ, но только для чтения также! И начиная с работы над той консолью восстановления войдут в меня моя живая файловая система, я не хотел бы смешивать там symlinking или безотносительно (даже в то время как в той консоли). –  syntaxerror 03.11.2013, 13:04

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

$ HostFull=main:mid:sub    
$ oldIFS=$IFS; IFS=:; set -- $HostFull; IFS=$oldIFS
$ echo $1
main
$ echo $2
mid
$ echo $3
sub
3
27.01.2020, 19:58
  • 1
    хороший подход!Спасибо. Плюс, мне нравится он, что это не требует никаких внешних инструментов (что мы, как должны обычно ожидать, не найдем в тех ограниченных средах во всяком случае). Единственная вещь, которая может доставить некоторые неприятности, $1, $2, $3 материал: помните, что в сценарии, это будет обычно обозначать аргумент, переданный самому сценарию. - И в то время как мы в нем: если IFS будет предназначена, чтобы быть пространством, *то IFS = * не сделает в этом синтаксисе; необходимо будет указать IFS =' 'явно. –  syntaxerror 03.11.2013, 14:01

Теги

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