Jak otworzyć kanał VPN (interaktywnie) i zachować sesję VPN w tle

0

[Archlinux 4.18.9]

Zbudowałem prosty alias, aby połączyć się z klastrem przez VPN:

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

Obejmuje to konkretny /etc/sudoers wpis, więc po wydaniu cmd nie jest wymagane hasło sudo od autoryzowanych użytkowników.

Prowadzi to do 2 żądań wejściowych: jednego dla nazwy zarejestrowanych użytkowników na odległym serwerze VPN, jednego dla hasła użytkownika. Ręcznie, z cli, wszystko działa tak, jak powinno. Żaden problem.

jednak Chciałbym automatycznie umieścić moją sesję VPN w tle, gdy kanał jest otwarty, tzn. Gdy użytkownicy wprowadzą swoją nazwę i hasło. Idealnie chciałbym oznaczyć ten fakt w tym samym czasie, w którym cmd jest wydawane przy użyciu aliasu. Ale wydawanie sudo /usr/bin/openvpn --config client.ovpn & po prostu nie pozwala użytkownikom na wprowadzenie nazwy użytkownika i hasła.

Czy można to zrobić bez uciekania się do pliku zawierającego hasło i nazwę użytkownika?

Cbhihe
źródło

Odpowiedzi:

0

Rozumiem, że poświadczenia, o których mówisz, mogą zostać przekazane --auth-user-pass, nie z --askpass, więc --daemon nie jest przydatne.

Myślę, że możesz użyć expect. Szkic możliwego rozwiązania:

  1. spawn sudo /usr/bin/openvpn --config client.ovpn uruchomić program.
  2. expect "Username: " lub podobne (w zależności od tego, co openvpn drukuje, nie mogę teraz tego sprawdzić), aby poczekać na monit.
  3. Użyj kodu takiego jak:

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

    aby uzyskać nazwę użytkownika od użytkownika.

  4. send "$expect_out(1,string)\n" przekazać go do programu.

  5. Powtórz z hasłem, stty -echo może być użyteczne.
  6. Na koniec użytkowania fork i disconnect aby umieścić program w tle.

W podręczniku znajdują się przykłady, które mogą ci pomóc. Myślę, że możesz nawet wdrożyć logikę w celu pokrycia odpowiedzi takich jak „nieprawidłowe hasło, spróbuj ponownie” itp.


To jest mój niezbyt przetestowany fragment kodu:

#!/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

Jedyne testowanie dotyczyło Debiana spawn nc … to połączone z innym nc słuchanie w osobnej konsoli. Wysłałem pytania i odpowiedzi z powodzeniem, a następnie oryginał expect zakończony. Byłem w trybie powłoki, ale dwa nc -s nadal były połączone, jeden z nich był uruchomiony w tle. Tak samo powinno być openvpn, Nigdy tego nie testowałem openvpn chociaż.

Proszę wziąć stąd (podpowiedź: komentowanie linii log_user 0 jest przydatny do testowania).

Kamil Maciorowski
źródło
Bawiłem się z --auth-user-pass i --daemon z bardzo ograniczonym sukcesem (oczywiście, ponieważ dotyczy to pliku zapisanego na dysku i zawierającego poświadczenia). Będę szczerze starał się zasugerować twoje sugestie w przyszły weekend i przedstawię to tutaj. Dziękuję Ci.
Cbhihe