リモートサーバーに接続して更新を実行するスクリプトを作成しようとしていますが、その時点でコンピュータを使用している人がいないことを確認したいので、「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
私はコマンドを2つのSSH接続に分割することにしました。 1つはプロセスの一覧表示用、もう1つは更新用で、途中で続行するように求められます。
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接続のパスワードを2回尋ねることです。