Как я могу получить доступ к каталогу вне chroot из него?

[ команда является обычной командой. Хотя большинство оболочек обеспечивает его как встроенное для эффективности, это соблюдает нормальные синтаксические правила оболочки. [ точно эквивалентно test, за исключением того, что [ требует a ] как его последний аргумент и test не делает.

Двойные скобки [[ … ]] специальный синтаксис. Они были представлены в ksh (спустя несколько лет после этого [) потому что [ может быть неприятным для использования правильно и [[ позволяет некоторым новым хорошим дополнениям ту оболочку использования специальные символы. Например, можно записать

[[ $x = foo && $y = bar ]]

потому что все условное выражение анализируется оболочкой, тогда как [ $x = foo && $y = bar ] был бы сначала разделен на две команды [ $x = foo и $y = bar ] разделенный && оператор. Столь же двойные скобки включают вещи как синтаксис сопоставления с образцом, например. [[ $x == a* ]] протестировать ли значение x запускается с a; в одиночных скобках это расширилось бы a* к списку файлов, имена которых запускаются с a в текущем каталоге. Двойные скобки были сначала представлены в ksh и только доступны в ksh, ударе и zsh.

В одиночных скобках необходимо использовать двойные кавычки вокруг подстановок переменных, как в большинстве других мест, потому что они - просто аргументы команде (который, оказывается, [ команда). В удваивают скобки, Вам не нужны двойные кавычки, потому что оболочка не делает разделения слова или globbing: это анализирует условное выражение, не команду.

Исключение, хотя [[ $var1 = "$var2" ]] где Вам нужны кавычки, если Вы хотите сделать сравнение байта к строке байтов, иначе, $var2 был бы шаблон для соответствия $var1 против.

Одна вещь Вы не можете сделать с [[ … ]] использование переменная как оператор. Например, это совершенно законно (но редко полезно):

if [ -n "$reverse_sort" ]; then op=-gt; else op=-lt; fi
…
if [ "$x" "$op" "$y" ]; then …

В Вашем примере

dir="/home/mazimi/VirtualBox VMs"
if [ -d ${dir} ]; then …

команда в if [ с этими 4 аргументами -d, /home/mazimi/VirtualBox, VMs и ]. Синтаксические анализы оболочки -d /home/mazimi/VirtualBox и затем не знает, что сделать с VMs. Необходимо было бы предотвратить разделение слова на ${dir} получить правильно построенную команду.

Вообще говоря, всегда используйте двойные кавычки вокруг переменной и управляйте заменами, если Вы не знаете, что хотите выполнить разделение слова и globbing на результате. Основные места, где безопасно не использовать двойные кавычки:

  • в присвоении: foo=$bar (но обратите внимание необходимость в двойных кавычках в export "foo=$bar" или в присваивании массива как array=("$a" "$b"));
  • в a case оператор: case $foo in …;
  • в удваивают скобки за исключением правой стороны = или == оператор (если Вы действительно не хотите сопоставления с образцом): [[ $x = "$y" ]].

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

33
15.11.2012, 01:27
1 ответ

Символьные ссылки являются по существу просто указателями на другой файл, Вы не можете указать на что-то вне chroot, потому что он ищет файл с тем именем (/var/www, который не существует в chroot). Hardlinks, с другой стороны, являются указателями на inode. По сути, если Вы хотите сделать это, необходимо использовать жесткую ссылку путем исключения -s. Однако Вы не можете жесткая ссылка каталог (кроме . и ..) в Linux по ряду причин (основной, являющийся, что те файловые системы являются DAG).

Возможно, лучший способ состоял бы в том, чтобы использовать связывание, монтируются. Попробуйте это:

mount --bind /var/www /home/username/www
52
27.01.2020, 19:37
  • 1
    ln: '/var/www': hard link not allowed for directory –  Doc 14.11.2012, 17:53
  • 2
    @Doc - Каталоги не могут быть трудно связаны в Linux. Связывание монтирования должно работать. –  Chris Down 14.11.2012, 18:03
  • 3
    Я могу добавить это к fstab для создания этого персистентным? –  Kornel 31.08.2017, 17:43
  • 4
    Вы могли рекурсивно вызвать через каталоги и копировать дерево с жесткими ссылками? Например, если родитель имеет /foo/a.txt и /foo/bar/b.txt затем Вы могли сделать mkdir -p ./chroot/foo/; mkdir -p ./chroot/foo/bar; ln /foo/a.txt ./chroot/foo/a.txt; ln /foo/bar/b.txt ./chroot/foo/bar/b.txt? Или это все еще не работало бы по некоторым причинам? (Очевидно, это - что-то, что Вы записали бы сценарию, чтобы сделать, вместо того, чтобы делать вручную). –  shadowtalker 02.11.2017, 22:39
  • 5
    @Kornel можно использовать none режим наряду с bind опция: serverfault.com/questions/613179 / … –  Yvan 08.02.2018, 18:48

Теги

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