Как вызвать `nix -оболочку `с содержимым URL-адреса (, например, необработанной ссылкой GitHub )?

Причина, по которой это не удается, связана с разрешениями и подстановочным знаком *. Мы можем воспроизвести это в локальной файловой -системе, подобной этой:

  1. Настройте сценарий, дерево каталогов в/tmp/top:

    sudo -s <<'x'
    mkdir -p /tmp/top/{a,b}/dir/sub/
    touch /tmp/top/{a,b}/dir/sub/file
    chown root /tmp/top/?/dir
    chmod go= /tmp/top/?/dir
    x
    
  2. Обратите внимание, что у нас, как у обычного пользователя, нет разрешения опускаться ниже/tmp/top/*/dir:

    find /tmp/top/?/dir -type f
    find: ‘/tmp/top/a/dir’: Permission denied
    find: ‘/tmp/top/b/dir’: Permission denied
    
  3. Попробуйте спуститься с привилегиями root из каталога, который мы не можем получить как обычный пользователь:

    sudo find /tmp/top/*/dir/sub -type f
    find: ‘/tmp/top/*/dir/sub’: No such file or directory
    

    Помните, что оценка подстановочных знаков оболочки происходит до выполнения команды. Итак, здесь происходит расширение пути, содержащего подстановочный знак *. Ваша обычная учетная запись пользователя не может проверить существование sub, поэтому весь путь не может быть проверен. Подстановочный знак остается в виде звездочки (— поведение по умолчанию, когда совпадение не удается )и привилегированному пользователю root findпредоставляется буквальный путь /tmp/top/*/dir/subдля нисхождения. Этот путь не существует, отсюда и ошибка.

  4. Попробуйте спуститься с привилегиями root из каталога, к которому мы можем получить доступ как обычный пользователь:

    sudo find /tmp/top/*/dir -type f
    /tmp/top/a/dir/sub/file
    /tmp/top/b/dir/sub/file
    

    Здесь происходит то же самое, но с более полезными последствиями. Путь /tmp/top/*/dirможно полностью оценить как обычного пользователя, в результате чего получится два пути /tmp/top/a/dirи /tmp/top/b/dir. Они передаются корневому привилегированному find, и он может впоследствии спуститься по ним -через корневой -только подкаталог -и составить список обнаруженных файлов.

В вашей ситуации весьма вероятно, что каталоги .localв вашем пути с подстановочными знаками не могут быть доступны без привилегий суперпользователя, но каталоги более высокого уровня вполне доступны. Пока вы указываете путь, который можно оценить как вашу обычную учетную запись пользователя, findможет продолжить работу с расширенным набором путей. Как только вы укажете путь, который не может быть оценен в контексте вашей обычной учетной записи пользователя, раскрытие завершится ошибкой, и findбудет передан путь, содержащий буквальный символ *. Это, конечно, не совпадает, и findне работает.

Чтобы решить эту проблему, вам просто нужно отложить оценку пути, пока ваша команда не будет запущена от имени пользователя root:

sudo bash -c "find /nfshome/*/.local/ -type f -size +1G -exec ls -lh {} \;"
1
04.04.2021, 22:18
1 ответ

Это похоже на ошибку Nix, вот похожая ошибка дляnix eval.

Пока это не будет исправлено, вы можете использовать nix-shell -E "$(curl $url)". Или просто с помощью Nix, nix-shell -E "import (builtins.fetchurl $url)".

Просто убедитесь, что вы можете доверять выражению перед его выполнением — выражение shellHookможет содержать произвольный код bash, и оболочка nix -запустит его.

1
28.04.2021, 22:54

Теги

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