다음 스크립트는 이 요구 사항을 생성합니다. anyconnect의 VPN 유틸리티를 사용하여 원격 PC에 연결합니다. 먼저 일회용 암호를 요청하고, 연결하고, RDP 클라이언트를 시작한 다음, RPD 클라이언트 애플리케이션이 닫힌 후 연결을 끊습니다.
if [ $# == 1 ]; then
ONE_TIME_PWD=$1;
else
printf "Enter the one-time password: ";
read ONE_TIME_PWD;
fi
vpn -s connect <domain> << EOF
<user>
<pin>$ONE_TIME_PWD
EOF
# Use some RDP client here like xfreerdp or rdesktop
vpn -s disconnect <domain>
문제는 실행 중에 일회용 비밀번호가 변경될 수 있다는 점이다 vpn -s connect <domain>
. 그러면 <pin>
일회용 비밀번호를 자동으로 입력한 후 입력 하도록 스크립트를 변경할 수 있는지 궁금합니다 . head -c -1
마지막 개행 문자를 제거하려고 시도했지만 입력이 여전히 완료됩니다. EOF를 기반으로 하지 않은 다른 솔루션도 허용됩니다.
답변1
언제든지 다음과 같이 할 수 있습니다.
{
printf '<user>\n<pin>'
printf 'Enter the one-time password: ' > /dev/tty
IFS= read -r otp < /dev/tty
printf '%s\n' "$otp"
} | vpn -s connect <domain>
vpn
시작하고 먹이를 준 후에는 비밀번호를 입력하라는 메시지가 표시됩니다 <user>\n<pin>
.
비밀번호를 읽고 tty 장치에 프롬프트를 인쇄하거나, stdin에서 읽고( 제거 < /dev/tty
) stderr에 프롬프트를 인쇄할 수 있습니다( > /dev/tty
로 대체 >&2
).
zsh
대신 을 사용하는 경우 bash
다음과 같이 단순화할 수 있습니다.
{
printf '<user>\n<pin>'
IFS= read -rse '?Enter the one-time password: '
} | vpn -s connect <domain>
-s
터미널을 억제하려면echo
(지원됨bash
) 비밀번호를 입력하는 것이 좋습니다.-e
Echo는 변수에 저장하는 대신 표준 출력에 텍스트를 입력했습니다.?prompt
, 동일한 구문을 사용하여 stderr로 전송된 프롬프트 문자열입니다ksh
. 옵션bash
이 있습니다-p
.
답변2
아마도 다음과 같은 일을 할 수 있을 것입니다.
$: head -1 <<!
hello, $(head -1<$(tty))!
!
하지만 여러 가지 이유로 추천하지 않습니다.
조금만 더 나아졌으면 -
$: head -1 <<!
hello, $(read -rs pw <$(tty); echo "$pw" )!
!
hello, world!
그런데도 그렇게 물으셨어요.