Як я можу запустити OpenVPN як корінь у фоновому режимі, у сценарії?


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а потім a bg.

Однак я хотів би зателефонувати на етап з'єднання openvpn і ssh автоматично, зателефонувавши лише на мій файл bash. Як мені вдається наслідувати Ctrl+ Zта bgкроки у цьому файлі?

Я намагався додати &до openvpnкоманді і поставити nohupперед ним. Ні один не працює.


Таке запитання задавали кілька разів. Якщо вам потрібна допомога, вам дійсно потрібно опублікувати свій сценарій.
Пантера

використовувати sudo -bдля запуску команди, яка слідує за нею у фоновому режимі
Нік Сілліто

1
Мені здається, що це насправді не дублікат цього питання , яке навряд чи охоплює запущені фонові програми як корінь, і зовсім не пояснює, як правильно демонізувати OpenVPN.
Ілля Каган

Потім слід знову змінити заголовок, щоб зазначити, що я намагався запустити фонову програму як root.
null

@null Я змінив заголовок відповідно до запиту. OpenVPN часто запускається як root, і в ситуаціях, коли його немає, --daemonпараметр все ще може бути використаний, але ви праві, що частина про запуск його як root є центральною в цьому питанні і повинна бути відображена в його заголовку . Дякуємо, що вказали на це!
Ілля Каган

Відповіді:


35

TL; DR: Використання sudo -bабо, краще, .openvpn [...] --daemon

Оскільки ви працюєте openvpn(і, менш конкретно, оскільки ви хочете запустити програму як корінь у фоновому режимі), найчастіше розповсюджена інформація про те, як запускати команди у фоновому режимі, не стосується вашої ситуації. Ти сказав:

Я спробував додати команду & до команди 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.

Якщо це так, то вам слід видалити 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команді працює лише в тому випадку, якщо інші параметри не вказані. Якщо я вказую --daemonпараметр, тоді openvpn намагається проаналізувати ім'я файлу як параметр параметрів та видаляє помилку Options: я намагаюся проаналізувати "Windscribe.ovpn" як параметр --option, але я не бачу провідного '-' .

Відповідь:

Щоб цього уникнути, ім'я файлу повинно бути вказане --configопцією. Наприклад, openvpn --config Windscribe.ovpn --daemon. Потім зафіксуйте хвостовик tail -f /var/log/syslogдля подальшого огляду.

Ви також можете перевірити до і після виведення цієї команди curl, curl ifconfig.coщоб переконатися, що VPN підключено.

Примітка. Це дозволить зберегти демон навіть після виходу з сеансу SSH.


0

Ви можете просто скопіювати своє

.conf файл у / etc / openvpn /

Потім попросіть "service openvpn @ confName start" обробити всі демонізуючі та судо для вас.

Дивіться /unix//a/366680/198666

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.