
#!/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 option
stdin에서 읽고 읽기를 수행합니다. 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 문서에 제공되는 출력을 캡처하여 수행되므로EOF
here 문서에서는 확장이 수행되지 않습니다.- X 서버에 연결해야 하는 명령이 없기 때문에 여기서는 불필요한 X11 전달이 제거되었습니다.
- 또한 이 스크립트에는 pseudo-tty가 필요하지 않으므로 pseudo-tty도 제거했습니다.
- 누락된 인용문을 추가했습니다.
위에서는 pi
사용자의 로그인 쉘이 $ip
POSIX-sh와 유사하다고 가정합니다.