별도의 함수 출력으로 쉘 스크립트의 고유 문자열을 어떻게 업데이트할 수 있습니까?

별도의 함수 출력으로 쉘 스크립트의 고유 문자열을 어떻게 업데이트할 수 있습니까?

게으름 때문에 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보내기 예상 함수의 마지막 부분을 추가합니다.

관련 정보