Символьная ссылка все подкаталоги в каталоге к другому каталогу

В среде стандартного процесса нет ничего для создания переменной только для чтения, только не окружает, имеют то понятие для их собственной среды/переменных (эти два накладываются способами, но они должны быть поняты как отличные). То же касается свойств типа как целое число, массив, функция и т.д.

Вы рассмотрели использование ограниченной оболочки, как rbash? Вы могли установить rbash работать readonly TEST_ENV) в его сценарии запуска. rbash может быть слишком строгим, хотя, но это обращается до хорошей степени к повышению проблем комментариев.

Среда является частью чтения-записи каждого процесса (см. здесь и здесь для деталей), мало того, что процесс может записать непосредственно в часть данных (через environ[]), это может изменить указатели на него. Вы смогли делать что-то с этим (т.е. перемещать к странице только для чтения), если Вы являетесь опытными в блоке и можете найти свой путь вокруг crt запустите код, но я не рекомендую это ;-)

Если существуют определенные команды, которые пользователи выполняют, который должен иметь определенную среду, Вы можете устанавливать только группу - выполняют и используют sudo установить корректные переменные (например, через /etc/environment или env_file директива) и выполненный команда как определенная группа (сохраняющий uid). Поддержка последних версий noexec на большинстве платформ, которые могут использоваться для предотвращения выполнения новой оболочки (хотя банка может повредить программы который законно fork() и exec()).

Как последняя опция Вы можете использовать LD_PRELOAD и Ваша собственная библиотека для установки управляемой среды для некоторых/всех пользовательских процессов путем обертывания соответствующих функций libc (getenv() putenv() и т.д.). libfaketime делает точно это в течение времени связанные функции libc. Существует менее известный инструмент, названный timetravel, который делает подобный, но также и рычаги setenv() и getenv() чтобы удержать контроль над LD_PRELOAD перед лицом бедственной ситуации.

Самый устойчивый подход должен отфильтровать setenv() unsetenv() putenv() (и возможно clearnv()) вызовы для предотвращения модификации и фильтра getenv() так, чтобы это всегда возвратило необходимое значение (возможно из файла). Этот подход не предотвратит непосредственное управление памятью среды через environ[], но, пока Вы управляете getenv() любой процесс, который полагается на libc API, должен видеть Ваше значение. bash использование environ[] непосредственно, когда это инициализирует, но также и вызовы getenv().

7
18.03.2014, 05:08
4 ответа

Предполагая этот макет:

% tree -L 2
.
├── top-1
└── top-2
    ├── sub-1
    ├── sub-2
    └── sub-3

И этот желаемый результат:

% tree -L 2
.
├── top-1
│   ├── sub-1 -> /tmp/sf-582772/top-2/sub-1
│   ├── sub-2 -> /tmp/sf-582772/top-2/sub-2
│   └── sub-3 -> /tmp/sf-582772/top-2/sub-3
└── top-2
    ├── sub-1
    ├── sub-2
    └── sub-3

И эта версия find :

% find --version
find (GNU findutils) 4.4.2

Использование:

find /tmp/sf-582772/top-2/ -maxdepth 1 -mindepth 1 -type d -exec ln -s '{}' /tmp/sf-582772/top-1/ \;

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

% pwd
/tmp/sf-582772
% find top-2 -maxdepth 1 -mindepth 1 -type d -exec ln -s ../'{}' top-1/ \;

Дает:

% tree -L 2
.
├── top-1
│   ├── sub-1 -> ../top-2/sub-1
│   ├── sub-2 -> ../top-2/sub-2
│   └── sub-3 -> ../top-2/sub-3
└── top-2
    ├── sub-1
    ├── sub-2
    └── sub-3
12
27.01.2020, 20:15
[119994]Я бы попробовал:

Я не поклонник аргумента -exec, чтобы найти, и не поклонник того, чтобы выяснить, как точно избежать литералов, поэтому я обычно качаюсь, чтобы найти + xargs.[119997].

1
27.01.2020, 20:15

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

ln -s /base/* /target && ls -l /target
1
27.01.2020, 20:15

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

Итак, главное убедиться, что целевой каталог еще не существует!

Пример:

  1. Удалить целевой каталог:target-directory
  2. Выполнить:ln -s /path/to/base-directory/ /path/to/target-directory

Итак, по исходному вопросу:

  1. Удалить каталог:folder2
  2. Выполнить:ln -s /home/chris/folder1/ /home/john/folder2

Надеюсь, это поможет.

0
24.05.2020, 09:07

Теги

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