Я хотел бы написать сценарий, который вызывает 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
перед ней. Ни то, ни другое не работает.
command-line
bash
scripts
openvpn
job-control
значение NULL
источник
источник
sudo -b
для запуска команды, которая следует за ним в фоновом режиме--daemon
опция все еще может быть использована, но вы правы, что часть о том, как запускать ее от имени пользователя root, занимает центральное место в этом вопросе и должна быть отражена в ее названии. , Спасибо за указание на это!Ответы:
TL; DR: Использование
sudo -b
или, лучше, .openvpn [...] --daemon
Поскольку вы работаете
openvpn
(и, реже, поскольку вы хотите запускать программу от имени пользователя root в фоновом режиме), наиболее распространенная информация о том, как выполнять команды в фоновом режиме, не решает вашу ситуацию. Вы сказали:Ваша команда:
В
sudo
конфигурации по умолчанию, если вы недавно не вводили свой парольsudo
в том же контексте (для интерактивного использования обычно это означает тот же терминал), он запросит ваш пароль. Но если вы запустите команду в фоновом режиме, добавив ее,&
вам не будет показана строка или предоставлена возможность ввести ее.[sudo] password for user:
Таким образом, в этой ситуации выполнение команды, ввод пароля и последующая отправка его в фоновый режим - разумный способ сделать это для интерактивного использования .
Но это не единственный способ, и, как вы говорите, вы не захотите делать это в сценарии .
Способ 1: убедитесь, что у вас
sudo
есть новая отметка времени.Вы можете убедиться, что у вас
sudo
есть текущая временная метка, когда она используется для запуска вашей команды, сначала запустив:Затем, после этого, вы можете запустить:
Однако, как правило, лучше избегать
&
(иnohup
) вообще, когда вы хотите выполнить команду в фоновом режимеsudo
. Это особенно касается сценариев.Способ 2: использование
sudo -b
. В общем, обычно это то, что вы хотите.Вместо этого вы можете запустить
sudo
себя на переднем плане, но передать-b
флаг, чтобыsudo
команда выполнялась в фоновом режиме.Обычно это лучший способ, особенно если вы помещаете команду в сценарий. При этом
sudo -b
вы не получаете контроль над заданиями , но в сценарии оболочки управление заданиями по умолчанию отключено, и вы обычно не должны его использовать .Как
man sudo
объясняет:Это работает , потому что ничего не работает в фоновом режиме , пока после Суда не получил свой пароль (если необходимо) и определил , что вам разрешено запускать команду.
Способ 3: Но
openvpn
, вероятно, вы должны просто запустить его--daemon
.openvpn
будет работать в фоновом режиме автоматически, если вы запустите его с--daemon
параметром:Передайте
--daemon
после вашего.opvn
имени файла, а не до; следующий за ним аргумент--daemon
интерпретируется как имя, котороеopenvpn
должен использовать демонизированный процесс. (У не также Append&
.)Уместно ли это, зависит от того, должно ли происходить какое-либо взаимодействие после того, как
openvpn
оно было выполнено, но до того, как оно будет демонтировано. И это зависит, отчасти, от того, что установлено в~/my_connection.ovpn
. Но еслиopenvpn
не удалось немедленно демонизировать, то все другие способы немедленного запуска его в фоновом режиме также будут нарушены .Таким образом, в любой ситуации , когда вы знаете , что вы хотите ,
openvpn
чтобы начать работать в фоновом режиме, и вы знаете , вы не хотите , чтобы вернуть его на передний план, вы должны серьезно рассмотреть способ вызова его с помощью--daemon
опции. Это относится кopenvpn
- большинство программ не поддерживают--daemon
опцию, хотя многие серверные программы имеют такую опцию. (Однако название и синтаксис могут быть разными.)Для того, чтобы решить , следует ли использовать эту опцию (и как вы хотите использовать), я рекомендую вам прочитать на
openvpn
странице руководства , особенно в разделе--daemon
. В нем много полезной информации, и я цитирую только первый абзац здесь:Способ 4 : иногда разумно запускать весь скрипт от имени root.
Если у вас есть сценарий, который выполняет несколько действий от имени пользователя root, он не выполняет каких-либо значительных действий, которые могли бы разумно выполняться не от имени пользователя root, и при запуске сценария от имени пользователя без полномочий root ничего полезного не возникает, тогда Пользователь сценария, вероятно, должен просто запустить его от имени пользователя root.
Если это так, то вы должны удалить
sudo
из команд в сценарии. Когда скрипт запускается от имени root, в этом нет необходимостиsudo
. (Хотя корневой пользователь может, по умолчанию, выполнить любую команду как любой пользователь , включая себя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.
источник
Вы можете просто скопировать свой
Затем попросите 'service openvpn @ confName start' обработать все демонизацию и sudo для вас.
См. Https://unix.stackexchange.com/a/366680/198666.
источник