원격 서버에 연결하여 업데이트를 수행하는 스크립트를 작성하려고 하는데, 그 당시에 컴퓨터를 사용하고 있는 사람이 없는지 확인하고 싶어서 "ps" 명령을 실행하여 프로세스를 확인한 다음 설치를 계속해야 하는지 묻는 메시지를 표시합니다. 제가 만들려고 하는 코드는 다음과 같습니다.
ssh -T root@$machine <<- 'END'
#Show the non-root processes
ps -ef | grep -v root
#Prompt if should continue (this doesn't work)
echo "Continuar a instalação? [y/n]"
select valor in y n
do
case $REPLY in
y )
echo "Digitado y"
break
;;
n )
echo "Digitado n"
exit
;;
esac
done
#Test if it's working
echo "Test"
END
이 코드를 실행하면 다음과 같은 동작이 발생합니다.
Continuar a instalação? [y/n]
1) y
2) n
#? 1) y
2) n
#? #? 1) y
2) n
#? #?
#? 1) y
2) n
#? #? #? 1) y
2) n
#? #? #? #?
그런 다음 스크립트가 닫힙니다. -t -t 옵션을 사용하여 ssh를 실행해 보았지만 여전히 동일한 문제가 발생했습니다. 내가 무엇을 놓치고 있나요?
답변1
select
스크립트를 켜면 원격 프로세스()와 통신할 수 없습니다 stdin
. 입력이 끝나면 select
파일에서 일부 쓰레기를 읽은 stdin
다음 EOF를 읽는 상황이 발생합니다 .
파일을 서버에 복사 scp
한 후 실행하는 데 사용해야 합니다.
답변2
나는 명령을 두 개의 SSH 연결로 분할하기로 결정했습니다. 하나는 프로세스 나열용이고 다른 하나는 업데이트용이며 중간에 계속하라는 메시지를 표시합니다.
ssh -T root@$machine <<- 'END1'
ps -ef | grep -v root | grep -v lightdm
END1
echo "Continuar a instalação? [y/n]"
select valor in y n
do
case $REPLY in
y )
break
;;
n )
exit
;;
esac
done
ssh -T root@$machine <<- 'END2'
printf "Test\n"
END2
문제는 SSH 연결에 대한 비밀번호를 두 번 묻는 것입니다.