sudo, &, -b или --daemon: как перевести клиент OpenVPN в фон
Амперсанд освобождает терминал, но не вход. Сравните sudo -b, --daemon и экземпляр службы по тому, кому принадлежит процесс и кто отвечает на запросы.
В фразе «запусти это в фоне» скрыты два вопроса. Первый — может ли этот пользователь вообще запускать привилегированный процесс; второй — может ли сеанс продолжаться, если никто ничего не вводит в терминале. Амперсанд оболочки не отвечает ни на один, а сценарий, хранящий пароль sudo в переменной, плохо отвечает на первый и оставляет второй нетронутым. Разделите их, и варианты станет легко сравнить.
Сравнивайте три варианта по владельцу, а не по удобству.
Три способа покинуть терминал, три разных владельца
Если добавить амперсанд к команде, оболочка запустит её как фоновую задачу, и задача по-прежнему принадлежит этой оболочке. sudo может запросить данные ещё до запуска программы, а OpenVPN может затем запросить парольную фразу ключа или вход. Запуск в фоне команды, ожидающей ввода, создаёт процесс, ждущий терминал, за которым никто не следит. Терминал освобождается; взаимодействие — нет.
Это самый дешёвый вариант и тот, который отказывает наиболее запутанно, потому что запрос появляется там, откуда оператор уже ушёл.
sudo -b — не обработчик учётных данных
sudo -b запускает команду в фоне с точки зрения самого sudo, что звучит как недостающая функция, но ею не является. Согласно руководству sudo, интерактивные команды в этом режиме обычно ведут себя неправильно, а управление заданиями оболочки не может управлять создаваемыми процессами. Он перемещает процесс, не давая ему способа отвечать на вопросы. Ничто в нём не обеспечивает парольную фразу закрытого ключа или вход на шлюз.
Если соединению нужно взаимодействие, решение — поддерживаемая неинтерактивная схема аутентификации, а не другой способ запустить тот же запрос.
--daemon меняет программу, а не вход
--daemon просит сам OpenVPN отделиться после инициализации. Руководство версии 2.6 отмечает, что перенаправление syslog происходит при разборе параметра, хотя отделение происходит позже, поэтому сообщения могут перестать появляться в терминале раньше, чем ожидалось. Тишина после этой точки ничего не доказывает о туннеле. Добавьте явный --log или --log-append чтобы вывод попадал туда, где вы можете его прочитать.
Режим демона также навсегда убирает консоль. Защищённому закрытому ключу в этом режиме нужен askpass , а учётные данные, введённые в консоли, вместе с параметрами кэширования могут оставить последующую повторную аутентификацию без места для запроса. Проверьте модель аутентификации с установленной версией, прежде чем предполагать, что фоновый запуск переживёт первое обновление ключа.
Что даёт и чего не даёт проверка sudo
sudo -v проверяет или обновляет кэшированные локальные учётные данные и аутентифицируется, если этого требует политика. Он не запускает OpenVPN, не аутентифицируется на шлюзе и не гарантирует, что последующая команда в сценарии будет разрешена. sudo -n означает обратное: не спрашивай, а падай. Это делает локальный отказ авторизации явным, что полезно, и ничего не говорит о том, что OpenVPN запросит позже.
Ни один из вариантов не является причиной выдавать всем команды без пароля или передавать пароль администратора в сценарий.
Предпочитайте владельца, которого можно наблюдать
Для туннеля, принадлежащего машине, используйте экземпляр службы, поддерживаемый дистрибутивом. Такой владелец даёт запуск, остановку, статус и журналы, и он переживает завершение вашего сеанса. Собирать фоновый запуск оболочки, демонизацию и цикл перезапуска друг вокруг друга — это три владельца на один туннель и никакого ясного ответа, какой из них работает.
Что бы вы ни выбрали, проверьте ресурс, для которого существует туннель. Успешный запрос запуска — это событие процесса, а не доказательство работающего соединения.