Как я могу запустить OpenVPN как root в фоновом режиме, в сценарии?
Я хотел бы написать скрипт, который вызывает openvpn сначала следует ssh, При наборе команды
sudo openvpn ~/my_connection.ovpn
в командной строке я получаю следующий вывод:
...
Wed Jan 4 21:04:35 2017 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Wed Jan 4 21:04:35 2017 /sbin/ip link set dev tun0 up mtu 1500
Wed Jan 4 21:04:35 2017 /sbin/ip addr add dev tun0 local IP_FOO peer IP_FOO
Wed Jan 4 21:04:35 2017 Initialization Sequence Completed
Эта команда блокирует и оболочка не освобождается. Чтобы потом запустить ssh-соединение, мне нужно отодвинуть процесс openvpn в фоновый режим, набрав Ctrl+Z, а затем bg,
Однако я бы хотел вызвать шаг соединения openvpn и ssh автоматически, вызвав только мой bash-файл. Как мне удается эмулировать Ctrl+Z и bg шаги в этом файле?
Я пытался добавить & к openvpn командовать и разместить nohup перед ней. Ни то, ни другое не работает.
3 ответа
TL;DR: использовать sudo -b или лучше, openvpn [...] --daemon,
Так как ты бежишь openvpn (и, менее конкретно, поскольку вы хотите запускать программу от имени пользователя root в фоновом режиме), наиболее распространенная информация о том, как выполнять команды в фоновом режиме, не решает вашу ситуацию. Вы сказали:
Я попытался добавить команду & к команде cpenvpn и поставить перед ней nohop. Оба не работают.
Ваша команда:
sudo openvpn ~/my_connection.ovpn
Под sudo по умолчанию, если вы недавно не вводили пароль для sudo в том же контексте (для интерактивного использования, как правило, это означает, что тот же терминал), то он будет запрашивать ваш пароль. Но если вы запустите команду в фоновом режиме, добавив & тогда вам не покажут [sudo] password for user: линии или дали возможность ввести его.
Таким образом, в этой ситуации выполнение команды, ввод пароля и последующая отправка его в фоновый режим - разумный способ сделать это для интерактивного использования.
Но это не единственный способ, и, как вы говорите, вы не захотите делать это в сценарии.
Способ 1: убедитесь, что sudo имеет свежую метку времени.
Вы можете убедиться, что sudo имеет текущую временную метку, когда она используется для запуска вашей команды, сначала запустив:
sudo -v
Затем, после этого, вы можете запустить:
sudo openvpn ~/my_connection.ovpn &
Тем не менее, обычно лучше избегать & (а также nohup) вообще, когда вы хотите запустить команду в фоновом режиме с sudo, Это особенно касается сценариев.
Способ 2: использование sudo -b, В общем, обычно это то, что вы хотите.
Вместо этого вы можете запустить sudo сама на переднем плане, но передать -b флаг так sudo вызывает выполнение команды в фоновом режиме.
sudo -b openvpn ~/my_connection.ovpn
Обычно это лучший способ, особенно если вы помещаете команду в сценарий. С sudo -b вы не получаете управление заданиями, но в сценарии оболочки управление заданиями по умолчанию отключено, и вы обычно не должны его использовать.
Как man sudo объясняет:
-b, --background
Run the given command in the background. Note that it is not
possible to use shell job control to manipulate background
processes started by sudo. Most interactive commands will
fail to work properly in background mode.Это работает, потому что ничего не работает в фоновом режиме до тех пор, пока sudo не получит ваш пароль (если необходимо) и не определит, что вам разрешено запускать команду.
Способ 3: но для openvpn вы, вероятно, должны просто запустить его с --daemon,
openvpn будет работать в фоновом режиме автоматически, если вы запустите его с --daemon опция:
sudo openvpn ~/my_connection.ovpn --daemon
Проходить --daemon после вашего .opvn имя файла, а не раньше; следующий аргумент --daemon если есть, интерпретируется как имя, которое демонизировал openvpn Процесс должен использовать. (Не добавлять &.)
Является ли это уместным, зависит от того, должно ли происходить какое-либо взаимодействие после openvpn был запущен, но до того, как он демонизируется. И это зависит, отчасти, от того, что установлено в ~/my_connection.ovpn, Но если openvpn не может сразу демонизироваться, тогда все другие способы немедленного запуска его в фоновом режиме тоже сломаются.
Поэтому в любой ситуации, когда вы знаете, что вы хотите openvpn чтобы начать работать в фоновом режиме, и вы знаете, что вы не захотите вернуть его на передний план, вам следует строго рассмотреть метод вызова его с --daemon вариант. Это специфично для openvpn - большинство программ не поддерживают --daemon вариант, хотя многие серверные программы имеют такую возможность. (Однако название и синтаксис могут быть разными.)
Чтобы решить, следует ли использовать эту опцию (и как вы хотите ее использовать), я рекомендую вам прочитать openvpn страница руководства, особенно в разделе --daemon, В нем много полезной информации, и я цитирую только первый абзац здесь:
--daemon [progname]
Become a daemon after all initialization functions are
completed. This option will cause all message and error output
to be sent to the syslog file (such as /var/log/messages),
except for the output of scripts and ifconfig commands, which
will go to /dev/null unless otherwise redirected. The syslog
redirection occurs immediately at the point that --daemon is
parsed on the command line even though the daemonization point
occurs later. If one of the --log options is present, it will
supercede syslog redirection.
The optional progname parameter [...]Способ 4: иногда разумно запускать весь скрипт от имени root.
Если у вас есть сценарий, который выполняет несколько действий от имени пользователя root, он не выполняет каких-либо значительных действий, которые могли бы разумно выполняться не от имени пользователя root, и при запуске сценария от имени пользователя без полномочий root ничего полезного не возникает, тогда Пользователь сценария, вероятно, должен просто запустить его от имени пользователя root.
Если это так, то вы должны удалить sudo из команд в скрипте. Когда скрипт запускается от имени root, нет необходимости sudo, (Хотя пользователь root по умолчанию может выполнить любую команду как любой пользователь, включая себя sudo и не нужен пароль для этого. Так что если вы оставите экземпляры sudo в сценарии, вероятно, все еще будет работать.)
Если у вас есть какие-либо случаи sudo в сценарии, которые фактически используются для запуска команд от имени другого пользователя, кроме root (с -u user), тогда вы все равно должны сохранить эти экземпляры.
Если весь сценарий запускается от имени пользователя root, то применяются большинство типичных способов выполнения команд в фоновом режиме, включая добавление & и, при необходимости, использование nohup (о котором вы уже знаете). Для этого, тем не менее, вы все равно должны настоятельно рассмотреть возможность использования openvpn с --daemon вариант.
TL;DR Запустить его в режиме демона: openvpn --config Windscribe-Japan.ovpn --daemon
Передача файла конфигурации (.ovpn) в openvpn Команда работает, только если не указаны другие параметры. Если я укажу --daemon option затем openvpn пытается разобрать имя файла как параметр options и выдает ошибку Options: я пытаюсь проанализировать "Windscribe.ovpn" как параметр --option, но я не вижу начальный "-".
Ответ:
Чтобы избежать этого, имя файла должно быть указано с --config вариант. Например, openvpn --config Windscribe.ovpn --daemon, Затем следите за системным журналом tail -f /var/log/syslog, для дальнейшей проверки.
Вы также можете проверить до и после вывода этой команды curl curl ifconfig.co чтобы убедиться, что VPN подключен.
Примечание. Это будет поддерживать работу демона даже после выхода из сеанса SSH.
Вы можете просто скопировать свой
Файл.conf в /etc/openvpn/
Затем попросите 'service openvpn@confName start' обработать все демонизацию и sudo для вас.