Использование ярлыков в Windows для упрощения запуска программ внутри WSL

Работая в операционной системе Windows, я активно использую программы, запущенные внутри WSL. У этого подхода есть минус - лишние действия. Чтобы запустить программу, сначала приходится открыть консоль WSL, а затем набрать в ней соответствующую команду. Поэтому я решил упростить запуск часто используемых программ и использовать привычные ярлыки Windows.

Самый простой пример – запуск файлового менеджера Midnight Commander (mc) в дистрибутиве WSL, установленном по умолчанию. Для этого достаточно создать обычный ярлык Windows и указать в качестве команды:

wsl.exe -- mc

Ярлык для запуска Midnight Commander внутри дистрибутива WSL

При запуске ярлыка Windows выполнит wsl.exe, который запустит команду mc внутри WSL.

Так же, как и при запуске программ непосредственно в консоли WSL, им можно передать параметры.

Например, для Midnight Commander можно задать директории для левой и правой панелей:

wsl.exe -- mc /home/wslusername/Downloads /mnt/c/Users/WindowsUserName/Downloads

В этом примере в левой панели Midnight Commander будет открыта директория, находящаяся внутри WSL, а в правой – внутри Windows. Если путь к директории содержит пробелы, его необходимо заключить в кавычки.

Если вы используете несколько дистрибутивов WSL и хотите запускать программу в конкретном дистрибутиве, то в команде ярлыка следует явно указать его имя с помощью параметра --distribution или -d.

wsl.exe --distribution Debian -- mc

В этом примере Midnight Commander будет запущен внутри дистрибутива WSL с названием Debian от имени пользователя по умолчанию.

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

wsl.exe --distribution Debian -u wslusername – mc

Запуск программ, требующих прав суперпользователя без ввода пароля

При запуске программы внутри WSL при помощи ярлыка, требующей прав суперпользователя, следует использовать команду sudo – так же, как при использовании консоли. При этом пользователь, от имени которого запускается программа, должен быть добавлен в группу sudo, а при запуске программы, придётся ввести пароль пользователя.

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

Например, я регулярно использую веб-сервер Apache внутри дистрибутива WSL. Для запуска и остановки Apache я использую команды:

sudo service apache2 start
sudo service apache2 stop

Для того, чтобы не вводить каждый раз пароль пользователя, я создал отдельный файл sudoers:

sudo visudo -f /etc/sudoers.d/apache

С таким содержанием:

wslusername ALL=(root) NOPASSWD: /usr/sbin/service apache2 start, /usr/sbin/service apache2 stop, /usr/sbin/service apache2 restart, /usr/sbin/service apache2 status

Правило в этом файле даёт право пользователю с условным именем wslusername выполнять без пароля только нужные команды для работы с Apache, а не весь sudo. Это важно для безопасности.

Для проверки корректности новых правил sudoers, можно выполнить следующие команды:

sudo -k
sudo service apache2 start

Здесь sudo -k принудительно сбросит сохранённые полномочия, затем, если правила настроены корректно, следующая команда выполнится без запроса пароля пользователя.

Теперь, после настройки правила sudoers, запуск Apache через ярлык не потребует ввода пароля пользователя.

wsl.exe --distribution Debian -u wslusername -- sudo service apache2 start

Запуск нескольких программ последовательно

Если с запуском одной конкретной программы теперь всё понятно, можно пойти дальше и задаться вопросом о том, можно ли использовать ярлык для последовательного запуска нескольких программ внутри WSL?

Первый пример, который приходит на ум - проверка и установка обновления программ. В Debian это делается так:

sudo apt update
sudo apt upgrade

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

wsl.exe --distribution Debian -u wslusername -- bash -c "sudo apt update && sudo apt upgrade"

В этом примере используется bash -c "". И эта конструкция здесь не лишняя. Она явно говорит: “всё, что находится внутри кавычек, выполнить как командную строку Bash внутри WSL”. При этом && говорит, что следующую команду надо выполнять только при успешном завершении предыдущей.

Если запуск следующей программы не зависит от результата запуска предыдущей, следует использовать ;.

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

wsl.exe --distribution Debian -u wslusername -- bash -c "sudo apt update && sudo apt upgrade; mc"

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