Skriptoj lanĉas VPN-klientojn je tiu tavolo, kiun elektis la aŭtoro, kaj tiu tavolo malofte estas tiu, kiun la tasko bezonis. La komandlinio de la vendisto, la telefonilo de la operaciumo kaj app-intenco de poŝtelefono ĉiuj revenas je malsamaj punktoj en la vivo de la konekto. Ili ankaŭ traktas la sekreton malsame, kaj tiu diferenco decidas, ĉu la pasvorto videblas al ĉiu uzanto sur la maŝino. Elektu la tavolon antaŭ ol vi skribos la unuan linion de la skripto.

Tavolo 1: la komandlinio de la vendisto

Plej multaj labortablaj klientoj liveras komandlinion, kiu akceptas profilan nomon kaj, tro ofte, pasvorton. La malnova kliento de Cisco akceptis verbon connect kun uzantaj kaj pasvortaj argumentoj; macOS elmetas la enkonstruitan servon per networksetup; NetworkManager respondas al nmcli. Tiuj alvokoj revenas, kiam la komando finiĝas, kio ne estas la sama momento kiel tiu, kiam la tunelo fariĝas uzebla. Legu la propran dokumentaron de la vendisto por la versio, kiun vi starigas, ĉar tiuj interfacoj ŝanĝiĝas kaj iuj tute forigatas.

nmcli connection up "Work VPN"
networksetup -connectpppoeservice "Work VPN"

La avantaĝo estas, ke la vendisto konas sian propran profilujon, do la alvoko uzas la saman agordon kiel la GUI. La malavantaĝo estas, ke ĉiu vendisto elpensas siajn proprajn verbojn, kaj skripto verkita por unu kliento ne transiĝas al alia. Konsideru ĉi tiun tavolon kiel la plej mallongan vojon, kiam la kliento estas fiksa kaj la versio estas fiksita.

Tavolo 2: la propra servo de la operaciumo

En Windows la telefonilo estas parto de la operaciumo, kaj ĝi laboras kontraŭ telefonlibra enskribo anstataŭ la profilujo de la vendisto. Tio faras ĝin pli portebla inter klientoj kaj pli facile skriptebla el serva konto. Ĝi ankaŭ signifas, ke la konekto povas ekzisti en unu loko kaj ne en la alia, kio konfuzas homojn, kiuj rigardas en la malĝusta listo.

rasdial "Work VPN" user pass
Get-VpnConnection -Name "Work VPN" | Select-Object ConnectionStatus

Uzu la PowerShell-surfacon, kiam vi devas krei aŭ forigi la enskribon anstataŭ telefonvoki ĝin. La tavoloj WMI kaj cmdlet elmetas la samajn objektojn sub malsamaj nomoj, kaj forigo estas aparta operacio de malkonektado. Skripto, kiu nur telefonvokas, restigos eksdatajn enskribojn post migrado. Kontrolu, en kiun konservejon via aŭtomatigo skribas, antaŭ ol vi promesos, ke la purigado okazos.

Remove-VpnConnection -Name "Old VPN" -Force
Get-VpnConnection

En macOS la ekvivalento estas la listo de retservoj, kie ekzistanta servo konektiĝas laŭ nomo anstataŭ esti kreata surloke.

Akreditaĵoj likas je ĉiu tavolo, do elektu la kanalon

Ĉio, kion vi pasas sur la komandlinio, aperas en la proceza tabelo por ĉiu loka uzanto, kaj ĝi kutime postvivas ankaŭ en la ŝela historio. La subtenata alternativo de OpenVPN estas legi la sekreton el dosiero kun --askpass, kaj la dosiero mem bezonas permesojn, kiuj kongruas kun la fido, kiun vi metas en ĝin. Nomita tubo evitas skribi la sekreton sur diskon, sed permesas al ajna procezo, kiu povas malfermi ĝin, skribi tie. En Windows, konservu la sekreton en la akreditaĵa administranto, aŭ en dosiero, kiun nur la serva konto povas legi, kaj neniam kiel literalo en dosiero batch.

openvpn --config /etc/openvpn/work.conf --askpass /etc/openvpn/work.secret --auth-nocache --daemon
ls -l /etc/openvpn/work.secret

La sama regulo validas por ĵetonoj kaj unufojaj kodoj: se la aŭtomatigo bezonas ilin, la aŭtomatigo bezonas kanalon, kiu ne estas komandlinia argumento. Rotaciu la sekreton, kiam vi ŝanĝas la mekanismon, ĉar la malnova valoro sidis ie en protokolo. Skripto, kiu funkcias kaj likas, ne estas funkcianta skripto.

Atendu staton, poste kontrolu unu posedanton

Ĉiu el tiuj alvokoj revenas antaŭ ol la tunelo pretas, do enketu la staton, kiun la kliento elmetas, aŭ provu celon interne kun tempolimo. Kopii dosierojn aŭ malfermi datumbazan konekton tuj post la konekta alvoko estas vetkuro, kaj ĝi malsukcesas intermitente tiel, ke ĝi aspektas kiel reta difekto.

ip link show tun0
nmcli -t -f GENERAL.STATE connection show "Work VPN"
curl -sS --max-time 5 https://app.internal.example/health -o /dev/null

Malkonektado havas la saman problemon inverse: la procezo povas finiĝi antaŭ ol la itineroj foriros. Uzu la hokojn de la kliento, kie ili ekzistas, kiel la supraj kaj subaj skriptoj de OpenVPN aŭ ExecStartPost de systemd-unuo, ĉar tiuj ruliĝas je la punkto, pri kiu vi vere zorgas. Hokoj ruliĝas kun la privilegioj de tio, kio alvokis ilin, do hoko, kiu restartigas reton, bezonas eksplicitan regulon anstataŭ supozon. Tenu ekzakte unu posedanton dum la vivo de la konekto.

Kiam du kontrolistoj startigas kaj haltigas tiun profilon, la rezulto estas rekonekta buklo, kiu legiĝas kiel interrompo ĉe la provizanto. La runlibro finiĝas, kiam la tavolo estas dokumentita, la sekreto havas kanalon, kiu ne estas argv, la atenda kondiĉo estas statkontrolo kun tempolimo, kaj unu procezo posedas la vivociklon.

Rilataj artikoloj