Как я могу запустить OpenVPN как root в фоновом режиме, в сценарии?

22

Я хотел бы написать сценарий, который вызывает 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перед ней. Ни то, ни другое не работает.

значение NULL
источник
Такого рода вопрос задавался несколько раз. Если вам нужна помощь, вам действительно нужно опубликовать свой сценарий.
Пантера
использовать sudo -bдля запуска команды, которая следует за ним в фоновом режиме
Ник Sillito
1
Мне кажется, что это на самом деле не дубликат этого вопроса , который вряд ли охватывает запуск фоновых программ от имени пользователя root и совсем не описывает, как правильно демонтировать OpenVPN.
Элия ​​Каган
Затем мы должны снова изменить заголовок, чтобы указать, что я пытался запустить фоновую программу от имени пользователя root.
нуль
@null Я заново отредактировал заголовок, как и просил. OpenVPN часто запускается от имени пользователя root, и в ситуациях, когда это не так, --daemonопция все еще может быть использована, но вы правы, что часть о том, как запускать ее от имени пользователя root, занимает центральное место в этом вопросе и должна быть отражена в ее названии. , Спасибо за указание на это!
Элия ​​Каган

Ответы:

35

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.

Это работает , потому что ничего не работает в фоновом режиме , пока после Суда не получил свой пароль (если необходимо) и определил , что вам разрешено запускать команду.

Способ 3: Но openvpn, вероятно, вы должны просто запустить его --daemon.

openvpnбудет работать в фоновом режиме автоматически, если вы запустите его с --daemonпараметром:

sudo openvpn ~/my_connection.ovpn --daemon

Передайте --daemonпосле вашего .opvnимени файла, а не до; следующий за ним аргумент --daemonинтерпретируется как имя, которое openvpnдолжен использовать демонизированный процесс. (У не также Append &.)

Уместно ли это, зависит от того, должно ли происходить какое-либо взаимодействие после того, как 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. (Хотя корневой пользователь может, по умолчанию, выполнить любую команду как любой пользователь , включая себя sudoи не нужен пароль , чтобы сделать это. Так что если вы делаете отпуска экземпляров sudoв сценарии , то это, вероятно , все еще работает.)

Если у вас есть какие-либо экземпляры sudoв сценарии, которые фактически используются для запуска команд от имени другого пользователя, кроме root (с ), то вам все равно следует сохранить эти экземпляры.-u user

Если весь сценарий выполняется от имени пользователя root, то применяется большинство типичных способов выполнения команд в фоновом режиме , включая добавление &и, где необходимо, использование nohup(о котором вы уже знаете). Для этого, тем не менее, вы все равно должны рассмотреть возможность использования openvpnс этой --daemonопцией.

Элия ​​Каган
источник
Удивительно полный и вдумчивый ответ. Отлично сработано.
gwideman
2

TL; DR Запустить его в режиме демона:openvpn --config Windscribe-Japan.ovpn --daemon

Передача имени файла конфигурации (.ovpn) openvpnкоманде работает, только если не указаны другие параметры. Если я укажу --daemonoption, то openvpn пытается проанализировать имя файла как параметр options и выдает ошибку Options: я пытаюсь разобрать «Windscribe.ovpn» как параметр --option, но я не вижу начальный «-» .

Ответ:

Чтобы избежать этого, имя файла должно быть указано с --configпараметром. Например, openvpn --config Windscribe.ovpn --daemon. Затем следите за системным журналом tail -f /var/log/syslogдля дальнейшей проверки.

Вы также можете проверить до и после вывода этой команды curl, curl ifconfig.coчтобы убедиться, что VPN подключен.

Примечание. Это будет поддерживать работу демона даже после выхода из сеанса SSH.

RajaRaviVarma
источник
0

Вы можете просто скопировать свой

Файл .conf в / etc / openvpn /

Затем попросите 'service openvpn @ confName start' обработать все демонизацию и sudo для вас.

См. Https://unix.stackexchange.com/a/366680/198666.

user18099
источник