Разрешите “отказ в доступе” при выполнении .sh файлов на WSL 2 через проводник Windows.

Вопрос или проблема

Я использую этот метод, чтобы запускать .sh файлы в Проводнике Windows с помощью bash.exe:

"C:\Windows\System32\bash.exe" -c " \"./$(grep -oE '[^\\]+$' <<< '%L')\"; cd ~; bash;"

Это работает отлично для файлов вне моего дистрибутива WSL2, однако для файлов, таких как \\wsl$\Ubuntu\home\davidg\example.sh, я получаю Отказ в доступе.

Из PowerShell я могу запустить bash.exe ./example.sh из рабочей директории, и он выполняется без проблем.

Почему это происходит и как я могу это решить?

АПДЕЙТ:
Обходной путь заключается в том, чтобы запустить pushd \\wsl$\Ubuntu из cmd.exe и выполнить .sh файлы из смонтированного диска в Проводнике Windows вместо UNC-пути.

Это, похоже, работает, хотя я не совсем уверен, почему:

"C:\Windows\System32\bash.exe" -c "bash \"./$(grep -oE '[^\\]+$' <<< '%L')\"; cd ~; bash;"

На сколько я понимаю, внешний вызов bash необходимо вызывать с -c, так как есть последовательность команд. Вызов .sh файла извлекает выгоду из внутреннего вызова bash без опций командной строки (т.е. передавая только ссылку на файл с командой оболочки согласно справочной странице).

Ответ или решение

Решение проблемы "Permission Denied" при выполнении .sh файлов в WSL 2 через Windows Explorer

Введение

Проблема "Permission denied" при запуске .sh файлов на Windows Subsystem for Linux 2 (WSL 2) через Windows Explorer может возникнуть из-за различий в правовых системах и особенностей работы компиляции между Windows и Linux. В этой статье мы проанализируем проблему и предложим детальные решения.

Проблема

Исходя из вашего описания, вы используете следующую команду для запуска .sh файлов:

"C:\Windows\System32\bash.exe" -c " \"./$(grep -oE '[^\\]+$' <<< '%L')\"; cd ~; bash;"

Эта команда работает для файлов вне дистрибутива WSL, но когда вы пытаетесь выполнить файл, расположенный по пути \\wsl$\Ubuntu\home\davidg\example.sh, вы получаете сообщение об ошибке "Permission denied".

Анализ ошибки

Здесь важно учитывать, что WSL 2 и Windows имеют разные модели управления доступом. Доступ к файлам через UNC путь \\wsl$ может приводить к проблемам с правами доступа, поскольку Windows может не корректно обрабатывать настройки прав Linux.

Решения

  1. Использование Pushd: Вы уже обнаружили обходной путь, используя команду pushd \\wsl$\Ubuntu и запуск скриптов из перемещения в этот каталог. Этот подход позволяет избежать проблем с разрешениями, так как вы работаете непосредственно с файловой системой, доступной для WSL.

  2. Корректное использование Bash:
    Вариант вашего кода, который вы выделили как рабочий:

    "C:\Windows\System32\bash.exe" -c "bash \"./$(grep -oE '[^\\]+$' <<< '%L')\"; cd ~; bash;"

    Этот вариант действительно исправляет проблему с правами, так как добавление второго вызова bash позволяет корректно интерпретировать и выполнять команды внутри скрипта.

  3. Изменение прав доступа к скрипту: Убедитесь, что файл example.sh имеет необходимые разрешения для выполнения. Вы можете установить эти разрешения с помощью следующей команды в Bash:

    chmod +x ~/example.sh

    Это позволяет исполнять файл без проблем.

  4. Проверка настроек WSL: Убедитесь, что ваша версия WSL 2 актуальна. Вы можете проверить его версию с помощью команды:

    wsl --list --verbose
  5. Проверка настроек файловой системы: Проанализируйте, действительно ли файл существует по указанному вами пути и имеет ли он корректные атрибуты. Для этого можно использовать команду:

    ls -l ~/example.sh

Заключение

Работа с WSL 2 через Windows Explorer может вызывать сложности из-за различий в управлении правами и особенностей сети. Однако, используя указанные выше методы, вы сможете успешно выполнить .sh файлы, избежав проблем с правами доступа. Рекомендуется использовать подход с pushd для навигации и выполнения скриптов, а также внимательно следить за правами доступа и корректной версией WSL.

Оцените материал
Добавить комментарий

Капча загружается...