Это - на самом деле функция, не проблема. Архивы с абсолютными местоположениями являются угрозой безопасности. Взломщики могли использовать такие архивы для обманывания пользователей в установку файлов в критических системных местоположениях.
Да, Вы могли использовать -P
. Но что случилось с разрешением tar удалить наклонную черту вправо и просто требование, чтобы пользователь архива явно сделал извлечение в корневом каталоге? Затем они сознательно влияют на критические системные местоположения и не могут сделать этого случайно.
Массив мог сделать строковый парсинг без потребности во временном файле. Не забывайте выключать globbing.
set -f
IFS=: Hosts=($HostFull)
HostMain=${Hosts[0]}
HostMid=${Hosts[1]}
HostSub=${Hosts[2]}
set +f
Я соглашаюсь с @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
Выше мы видим то, во что пишется файл Вашей последовательностью команды.
read
это открывает файл для записи (который был бы глуп), это <<<
.
– Gilles 'SO- stop being evil'
03.11.2013, 01:59
/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
$1
, $2
, $3
материал: помните, что в сценарии, это будет обычно обозначать аргумент, переданный самому сценарию. - И в то время как мы в нем: если IFS будет предназначена, чтобы быть пространством, *то IFS = * не сделает в этом синтаксисе; необходимо будет указать IFS =' 'явно.
– syntaxerror
03.11.2013, 14:01
IFS
, если Вы уверены, что нет никаких пробелов в$HostFull
как так:Hosts=( ${HostFull//:/ } )
. Или даже если существуют пробелы:HostMain=${HostFull%%:*}; HostMid=${HostFull#*:}; HostSub=${HostMid#*:}; HostMid=${HostMid%:*}
(или что-то подобное, я запутываюсь:D
). – gniourf_gniourf 03.11.2013, 01:33