게으름 때문에 openvpn을 자동으로 시작하는 일련의 극도로 "지저분한" 스크립트를 작성했습니다. 내가 사용하고 있는 구성 파일은 vpnbook.com/freevpn에서 가져온 것입니다.
내가 사용하는 비밀번호를 얻으려면:
lynx --dump --nolist vpnbook.com/freevpn | grep -i password | sort -u | cut -b 18,19,20,21,22,23,24
비밀번호는 웹사이트에서 반환됩니다.
그런 다음 Expect 스크립트를 사용하여 자동으로 로그인합니다(사용자 이름은 항상 vpnbook이지만 비밀번호는 요일에 따라 변경됩니다).
#!/usr/bin/expect -f
spawn openvpn /vpn/vpnbook-ca1-tcp80.ovpn ### my vpn configuration file ###
expect "*?sername:*"
send -- "vpnbook\r"
expect "*?assword:*"
### This next line sends the password that changes by the week, which I...
###...unfortunately need to update manually (for lack of a better method):
send -- "weekly-password\r"
비밀번호를 자동으로 업데이트하려고 할 때 발생하는 문제:
1) 예상 환경에서 lynx를 직접 호출할 수 없습니다.
2) 비밀번호 변경으로 인해 지난 주의 고유 비밀번호 문구를 업데이트된 버전으로 바꾸는 방법을 모르겠습니다.
send -- "unique-previous-password\r"
3) lynx 함수에 의해 출력된 문자열을 입력 변수로 사용하여 지난 주 비밀번호(내 예상 스크립트에서)를 편집하는 방법을 잘 모르겠습니다.
내가 "가장 똑똑한" 프로그래머도 아니고 가장 효율적인 프로그래머도 아니라는 것은 분명합니다. 그러나 결국 나의 유일한 목표는 단일 명령을 입력하여 VPN을 완전히 초기화하는 것입니다(앞서 언급했듯이 저는 게으릅니다).
어떤 도움이라도 대단히 감사하겠습니다. 감사합니다!
답변1
expect
/ 스크립트 에서 다음을 tcl
사용할 수 있습니다.
send "$env(PASSWORD)\r"
expect
다음을 사용하여 스크립트를 호출합니다 .
PASSWORD=$(elinks -dump...) /path/to/your/expect/script
짧은 이름을 사용할 수 있습니다 cut -b18-24
.
답변2
Stéphane의 솔루션은 매우 훌륭하지만 매번 비밀번호를 다운로드하여 구문 분석하고 싶지 않은 경우 다음과 같은 2단계 프로세스를 유지할 수 있습니다.
비밀번호 검색 명령을 다음과 같이 수정하세요.
sed -e '$ d' -i .bak f && echo -n "send -- \"" >> f && lynx --dump --nolist vpnbook.com/freevpn | grep -i password | sort -u | cut -b 18-24 >> f && echo "\\r\"" >> f
간결함을 위해 예상 스크립트 파일을 호출하겠습니다 f
. 실제로 /path/to/your/expect/script
스크립트와 동일한 디렉터리에 이미 있지 않은 한 완료되어야 합니다.
그런 다음 평소대로 예상 스크립트를 호출하십시오.
세분화된 경우 확장 명령은 다음과 같이 작동합니다.
sed -e '$ d' -i .bak f
마지막 행($
) 을 찾아f
삭제합니다(d
). 스위치-e
에 주의하세요-i
. 일부 플랫폼에서는 스위치가 다르거나 지원되지 않습니다. 스위치를 사용할 때 명령을 명시적으로 지정한다는-e
것은 해당 위치에서 파일을 수정하고 확장의 백업을 저장하는 것을 의미합니다.-i
-i
.bak
&&
이전 명령이 성공했다면 다음 명령을 실행합니다.echo -n "send -- \"" >> f
>> f
개행 문자( ) 없이 파일( )에 send Expect 함수의 첫 번째 부분을 추가합니다 .-n
lynx...
원래 명령이지만 결과가 파일(>> f
)에 추가됩니다.echo "\\r\"" >> f
보내기 예상 함수의 마지막 부분을 추가합니다.