Как открыть канал vpn (интерактивно) и сохранить сеанс vpn в фоновом режиме

0

[Archlinux 4.18.9]

Я создал простой псевдоним для подключения к кластеру через vpn:

alias clusvpn='sudo /usr/bin/openvpn --config client.ovpn'

Это включает в себя определенный /etc/sudoers введите пароль sudo у авторизованных пользователей после выдачи cmd.

Это приводит к 2 запросам на ввод: один для имени зарегистрированного пользователя на удаленном vpn-сервере, один для пароля пользователя. От руки из cli все работает как надо. Нет проблем.

тем не мение Я хотел бы автоматически разместить сеанс vpn в фоновом режиме, как только канал откроется, то есть, когда пользователи введут свое имя и пароль. В идеале я хочу обозначить этот факт в то же время, когда cmd выдается с использованием псевдонима. Но выдача sudo /usr/bin/openvpn --config client.ovpn & просто не позволяет пользователям вводить свои логин и пароль.

Есть ли способ сделать это, не прибегая к файлу, содержащему пароль и имя пользователя?

Cbhihe
источник

Ответы:

0

Я понимаю, что полномочия, о которых вы говорите, вы могли бы передать --auth-user-pass, не с --askpass, так --daemon не полезно

Я думаю, что вы можете использовать expect, Эскиз возможного решения:

  1. spawn sudo /usr/bin/openvpn --config client.ovpn запустить программу.
  2. expect "Username: " или похожий (в зависимости от того, что openvpn печатает, я не могу проверить это прямо сейчас) ждать приглашения.
  3. Используйте код как:

    send_user "Username: "
    expect_user -re "(.*)\n"
    

    получить имя пользователя от пользователя.

  4. send "$expect_out(1,string)\n" передать его в программу.

  5. Повторите с паролем, stty -echo может быть полезным
  6. В конце использования fork а также disconnect поставить программу на задний план.

В руководстве есть примеры, которые могут вам помочь. Я думаю, что вы даже можете реализовать некоторую логику, чтобы покрыть ответы типа «неверный пароль, попробуйте еще раз» и т. Д.


Это мое не совсем проверенная кусок кода:

#!/usr/bin/expect

log_user 0
set timeout -1

spawn sudo /usr/bin/openvpn --config client.ovpn

expect "*sername*"
send_user "Username: "
expect_user -re "(.*)\n"
send "$expect_out(1,string)\n"

expect "*assword*"
stty -echo
send_user "Password: "
expect_user -re "(.*)\n"
send "$expect_out(1,string)\n"
stty echo

send_user "\n"

if {[fork]!=0} exit
disconnect
expect eof

Единственное тестирование было на Debian с spawn nc … что связано с другим nc слушаю в отдельной консоли. Я отправил подсказки и ответы успешно, а затем оригинал expect прекращается. Я был в приглашении оболочки, но два nc -с были все еще связаны, порожденный бежал на заднем плане. То же самое должно случиться с openvpnЯ никогда не проверял это с openvpn хоть.

Пожалуйста, возьмите это отсюда (подсказка: комментируя строку log_user 0 это полезно для тестирования).

Kamil Maciorowski
источник
Я играл с --auth-user-pass а также --daemon с очень ограниченным успехом (очевидно, поскольку задействован файл, записанный на диск и содержащий учетные данные). Я честно попробую ваши предложения на следующих выходных и сообщу здесь. Спасибо.
Cbhihe