<< EOF를 사용할 수 있지만 사용자가 입력을 완료하도록 할 수 있습니다.

<< EOF를 사용할 수 있지만 사용자가 입력을 완료하도록 할 수 있습니다.

다음 스크립트는 이 요구 사항을 생성합니다. 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) 비밀번호를 입력하는 것이 좋습니다.
  • -eEcho는 변수에 저장하는 대신 표준 출력에 텍스트를 입력했습니다.
  • ?prompt, 동일한 구문을 사용하여 stderr로 전송된 프롬프트 문자열입니다 ksh. 옵션 bash이 있습니다 -p.

답변2

아마도 다음과 같은 일을 할 수 있을 것입니다.

$: head -1 <<!
hello, $(head -1<$(tty))!
!

하지만 여러 가지 이유로 추천하지 않습니다.

조금만 더 나아졌으면 -

$: head -1 <<!
 hello, $(read -rs pw <$(tty); echo "$pw" )!
!

 hello, world!

그런데도 그렇게 물으셨어요.

관련 정보