SSH 세션 후 Case 문의 구문 오류

SSH 세션 후 Case 문의 구문 오류
#!/bin/sh

echo -n "Enter the raspberry ip address you want to connect:"
read Rasp_id

sshpass -p "the@Donut" ssh -t -X -oStrictHostKeyChecking=no pi@$Rasp_id << E2
        echo -e "Enter the case you want to echo\n 1.1 a \n 2.1 b"
        read option
        case "\$option" in
        1)
        echo "a"
        ;;

        2)
        echo "b"
        ;;
esac
E2

SSH 세션을 시작한 다음 원격 시스템에서 일부 수정을 수행하는 스크립트를 작성 중인데 다음과 같은 구문 오류가 발생합니다.

bash: line 3: syntax error near unexpected token `)'
bash: line 3: `        1)'

답변1

문제는 stdin의 사용을 혼합하여 원격 시스템에서 실행될 프로그램에 입력을 제공하고 해당 프로그램에 입력한다는 것입니다.

작성된 대로 다음과 같은 일이 발생합니다.

  • 원격 쉘은 echo -e "Enter the case you want to echo\n 1.1 a \n 2.1 b"stdin에서 읽고 이를 에코합니다.
  • 원격 쉘은 read optionstdin에서 읽고 읽기를 수행합니다.
  • read표준 입력에서 읽고 case "\$option" in이에 대한 옵션을 설정합니다.
  • 원격 쉘은 1)stdin에서 가져오고 구문 오류를 제공합니다.

답변2

여기에서 @icarus의 답변을 보완하기 위해 다음과 같이 작성할 수 있습니다.

#!/bin/sh -

if [ "$#" -eq 0 ]; then
  printf >&2 'Enter the raspberry ip address you want to connect to: '
  IFS= read -r ip
  set -- "$ip"
fi

for ip do
  printf >&2 '%s\n' "Connecting to $ip"
  SSHPASS=the@Donut sshpass -e \
    ssh -oStrictHostKeyChecking=no "pi@$ip" "$(cat << 'EOF'

    printf >&2 '%s\n' 'Enter the case you want to echo' \
                      ' 1.1 a' \
                      ' 2.1 b'
    IFS= read -r option
    case "$option" in
      (1) echo a;;
      (2) echo b;;
    esac
EOF
)"
done

그건:

  • 피하십시오 echo( echo -n/ echo -e는 표준 sh+utilities 구문이 아닙니다)
  • 기본 사후 처리를 피하고 read원시 입력 줄을 읽습니다.
  • 사용자가 호스트 이름을 매개변수로 전달할 수 있으므로 스크립트를 더 쉽게 자동화할 수 있습니다.
  • 힌트 등 현실과 부합하지 않는 내용 게시산출stderr에 대한 스크립트(역시 자동화할 수 있으며 이와 같은 작업을 수행할 수 있습니다 actual_output=$(that-script)).
  • 공개된 비밀번호이므로 명령줄에서 비밀번호를 전달하지 마세요. 이 스크립트에는 민감한 정보가 포함되어 있으므로 액세스해야 하는 사용자에게만 비밀번호가 노출되도록 액세스를 강화해야 합니다.
  • 스크립트는 표준 입력 대신 매개변수로 전달되므로 ssh스크립트는 여전히 표준 입력을 통해 사용자에게 쿼리할 수 있습니다.
  • cat이는 종료자( )가 인용된 here 문서에 제공되는 출력을 캡처하여 수행되므로 EOFhere 문서에서는 확장이 수행되지 않습니다.
  • X 서버에 연결해야 하는 명령이 없기 때문에 여기서는 불필요한 X11 전달이 제거되었습니다.
  • 또한 이 스크립트에는 pseudo-tty가 필요하지 않으므로 pseudo-tty도 제거했습니다.
  • 누락된 인용문을 추가했습니다.

위에서는 pi사용자의 로그인 쉘이 $ipPOSIX-sh와 유사하다고 가정합니다.

관련 정보