[Archlinux 4.18.9]

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

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

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

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

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

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

1 ответ1

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 out полезно для тестирования).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .