Как добавить автозаполненную переменную окружения в crontab, чтобы она загружала $HTTP_PROXY, который автоматически генерируется моим WPAD и Windows 11?

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

У меня проблема с WSL: он не загружает информацию о прокси в /etc/environment/, но все остальное загружается.

Windows 11 заполняет переменную HTTP_PROXY через .wslconfig, который хранится в операционной системе Windows 11 на хосте.

#Это мой .wslconfig
[wsl2]
autoProxy=true

Когда я выполняю команду echo $HTTP_PROXY как пользователь внутри WSL, я получаю:

jon@Dell-Laptop:~$ echo $HTTP_PROXY
http://192.168.1.1:3128

Поэтому я подумал: почему бы не сделать bash-скрипт и не запрограммировать его на использование $HTTP_PROXY для создания пользовательской настройки автопрокси на стороне WSL.

Если я нахожусь за прокси, он изменяет файл /etc/environment; если нет, то меняет его обратно. (в теории) Это работает при ручном запуске моего временного кода, который показан ниже:

#!/bin/bash
source $HOME/.bash_profile
check_status=$HTTP_PROXY
echo $check_status
http="http"
if [[ $check_status == *"$http"* ]];
then
        echo "proy on"
        cp proxyon /etc/environment
else
        echo "proxy off"
        cp proxyoff /etc/environment
fi

Это работает, когда я запускаю его от имени пользователя в WSL, однако, если я создаю crontab, он не имеет автоматически заполненной переменной ОС Windows 11 $HTTP_PROXY, созданной для использования с crontab, пока я не войду в систему, как кажется.

#Ручной запуск моего кода: если вы не измените права доступа и chmod, вы должны запустить это с помощью "sudo -E ./autoproxy.sh", чтобы сохранить настройки окружения пользователя 
jon@Dell-Laptop:~$ ./autoproxy.sh
http://192.168.1.1:3128
proy on

Вот как я создал crontab:

jon@Dell-Laptop:~$ sudo crontab -u jon -e
@reboot sleep 10 && /home/jon/autoproxy.sh >> /var/log/autoproxy.log 2>&1

Каждый раз при загрузке он показывает отсутствие прокси, потому что $HTTP_PROXY пуст, пока я не войду в систему, так что crontab просто отключает мои изменения в файле /etc/environment и нормализует его, как если бы я был в сети без прокси.

Мои логи показывают, что он запускается без прокси каждый раз, созданные с помощью команды pipe logger выше. Вот логи:

jon@Dell-Laptop:~$ cat /var/log/autoproxy.log
#proxy

proxy off

jon@Dell-Laptop:~$

Как мне получить автоматически заполненные переменные окружения в crontab, чтобы загрузились $HTTP_PROXY, которые автогенерируются WPAD и Windows 11? Я пробовал множество вещей.

Этот bash-скрипт работает, если я вошел в систему, так что я его запускаю вручную, однако я хотел бы, чтобы он запускался автоматически.

Я адаптировал привилегии, создал логи для crontab, каждый раз отсутствует переменная $HTTP_PROXY, я нуждаюсь в этом, чтобы это работало с моим кодом для автозаполнения /etc/environment.

Мне хотелось бы просто поместить $HTTP_PROXY в /etc/environment, чтобы он загружался снова, но это не работает, я тоже пробовал это.

Перебор и поиск:

#как это должно работать /etc/environment должен использовать прокси, созданный Windows 11 WSL, но это не работает
GNU nano 7.2                                        /etc/environment                                                  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
export http_proxy=$HTTP_PROXY
export https_proxy=$HTTP_PROXY

Я хочу автоматически заполнить /etc/environment/ с помощью моего очень простого bash-скрипта, однако для этого мне нужно, чтобы автогенерируемая переменная Windows 11 $HTTP_PROXY использовалась внутри crontab.

Статус Crontab показывает, что я пользователь, который его запускает, и вывод в логи подтверждает, что он работает, просто он не видит $HTTP_PROXY, пока я не войду в систему как Jon.

PS: Когда я выполняю команду env, я вижу следующее: WSL_PAC_URL=192.168.1.6/proxy.pac HTTP_PROXY=192.168.1.1:3128 http_proxy=192.168.1.1:3128. Снова я не вижу $HTTP_PROXY и ничего нет в /etc/environment.

.

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

Для решения вашей проблемы с автозаполняемыми переменными окружения в WSL, которые не видны в crontab до входа в систему, необходимо понять, почему данная переменная окружения недоступна для cron-заданий. Дело в том, что crontab выполняет задачи в собственной сессии окружения, которая не загружает пользовательские переменные окружения, такие как $HTTP_PROXY, передаваемые из Windows 11 через WSL конфигурацию. Рассмотрим, как можно обойти эту проблему и заставить вашу скрипт работать правильно.

Теория

Утилита cron, используемая для автоматизации выполнения задач в Unix-системах, имеет свои собственные ограничения на доступ к переменным окружения. В отличие от обычной интерактивной сессии, cron запускает задания в минимальном окружении, где переменные, доступные во время обычной работы, могут быть недоступны. Поскольку создание окружения при запуске crontab происходит без пользовательского экземпляра сессии, переменные, установленные только при интерактивной работе (например, через .bashrc или аналогичные настройки), могут отсутствовать.

Переменная $HTTP_PROXY, генерируемая в WSL и доступная во время интерактивного входа, получается от настроек вашей Windows 11, передаваемой через .wslconfig. Тем не менее, crontab, который работает в более ограниченном окружении при загрузке системы, не получает доступа к этой переменной.

Пример

Вы упоминали, что переменная $HTTP_PROXY доступна только после входа в WSL. Это связано с тем, что переменные инициализируются через пользовательские скрипты, например, .bash_profile или .bashrc, которые не выполняются, когда cron запускает свои задания. Рассмотрим, как можно обойти это ограничение.

  1. Выявление текущей конфигурации: Вы видите, что $HTTP_PROXY устанавливается после запуска интерактивного сеанса. Это подтверждается командой echo $HTTP_PROXY, которая отображает значение переменной.

  2. Скрипт, выполняемый вручную: Ваш баш-скрипт работает корректно при ручном выполнении, потому что он запускается в окружении, где $HTTP_PROXY уже установлен.

  3. Проблемы с cron: Когда cron запускает ваш скрипт, он не видит $HTTP_PROXY, так как эта переменная окружения не установлена в его ограниченном окружении.

Применение

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

  1. Явное задание переменной: Одним из решений будет явное задание $HTTP_PROXY в вашем скрипте, на основании данных, доступных в системе и до выполнения задания cron. Вы можете получить значение переменной из вспомогательного файла или команды.

  2. Инициализация окружения: Создайте файл, включающий команду для инициализации необходимого окружения, используя такие конфигурации, как /etc/profile.d/, где можно настроить переменные окружения, применяемые для всех пользователей и сессий.

  3. SSH-специфические скрипты: Если WSL получает данные из файла конфигурации, вы можете исполнить их с помощью системного скрипта, который будет запускаться раньше других системных скриптов, например, через rc.local или аналогичные процедуры инициализации.

  4. Изменение cron-команды: Вы можете попробовать модифицировать команду cron, чтобы она явно загружала нужное окружение, например, используя:

    @reboot sleep 10 && source /path/to/your/environment_file && /home/jon/autoproxy.sh >> /var/log/autoproxy.log 2>&1
  5. Persistency конфигурации: Также попробуйте хранить текущее значение $HTTP_PROXY в отдельном файле, который будет считываться вашим скриптом при каждом выполнении crontab.

Применение указанных подходов может помочь вам корректно настроить окружение для cron и обеспечить доступ к необходимым переменным. Эти методы не только улучшат работу скрипта, но и позволят вам автоматизировать задачу изменяя /etc/environment без необходимости постоянного ручного вмешательства после запуска системы.

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

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