Rpmのインストール中にユーザーから入力を取得することは可能ですか?
それ自体で機能する(ユーザーからの入力を取得してアクションを実行する)スクリプトがありますが、rpmのポストインストールの一部として実行すると(つまり、%post
rpm仕様のセクション)の場合、機能しません。
それは可能でしょうか?これは一部です:
%post
import()
{
echo "Do you want to import file?"
select INPUT in "Y" "N"; do
case $INPUT in
Y ) echo "You selected to import file";break;;
N ) echo "Exiting";exit 0;break;;
esac
done
read -p "Please file path: " FILE
if [ -d "$FILE" ]; then
cp $FILE/myFile /opt/tmp/
echo "Done!"
else
echo "No File Path."
done=0
while [ $done = 0 ]
do
echo "Do you want to abort"
select INPUT in "Y" "N";
do
case $INPUT in
Y )
echo "Aborting"
done=1
break
;;
N )
echo "You selected to import"
# break
#;;
read -p "Please provide the directory : " FILE
if [ -d "$FILE" ]; then
cp $FILE/myFile /opt/tmp
echo "Done"
done=1
else
echo "Aborting."
fi
break
;;
esac
done
done
fi
}
import
exit 0
インストール中に、2番目のcaseステートメント内の中止に直接ジャンプします。
なぜ?私はここで何が間違っているのですか?
いいえ、RPMでインタラクティブなポストインストールスクリプトを使用することはできません。これは意図的なものです。
多くの場合、RPMは無人システムにインストールされます。誰かが来るまでインストールがハングした場合、何年もの間そこにスタックする可能性があります。
それは非常に悪い考えですが、それは可能です。
if ! exec </dev/tty; then
: "deal with the case where you simply can't read from the user here"
exit
fi
# ...the read command will work here.
技術的には、少なくとも一部のコマンドでは、[〜#〜] is [〜#〜]可能です。私のRPMの1つに、パスワードで保護されたWindows共有をマウントするインストール後のスクリプトにmount
コマンドがあります。
mount -t cifs //1.2.3.4/share /var/www/html -o username=user
rPMのインストール中に次の出力が表示されます。
Password:
次に、インストールを続行する前に、ユーザーはパスワードを入力する必要があります。
@Charles Duffyが回答を投稿したように、これはLinuxの / dev/tty 機能で実行できます。また、 read を使用して、標準入力から行を読み取ることもできます。
以下の例はインタラクティブrpm-の場合です
[Y/n]のようなユーザー入力を取得したい場合-
echo "Do you want to install <some package> [Y/n] "
if exec </dev/tty; then
read input;
fi
# use input here or below
一部のセントOSユーザーは、このインタラクティブなrpmからyumリポジトリを作成したい場合があります。
以下の例はyumを使用したインタラクティブrpm-
[Y/n]のようなユーザー入力を取得したい場合-
echo "Do you want to install <some package> [Y/n] " >/dev/tty
if exec </dev/tty; then
read input;
fi
# use input here or below
上記のスクリプトで、エコーが>/dev/ttyで終了していることを確認してください。つまり、ユーザーが入力を入力する別の端末にこのメッセージを出力します。
それが役に立てば幸い。