web-dev-qa-db-ja.com

rpmのインストール中にユーザーの入力を取得することは可能ですか?

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ステートメント内の中止に直接ジャンプします。
なぜ?私はここで何が間違っているのですか?

4
Jim

いいえ、RPMでインタラクティブなポストインストールスクリプトを使用することはできません。これは意図的なものです。

多くの場合、RPMは無人システムにインストールされます。誰かが来るまでインストールがハングした場合、何年もの間そこにスタックする可能性があります。

3
Patrick

それは非常に悪い考えですが、それは可能です。

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.
3
Charles Duffy

技術的には、少なくとも一部のコマンドでは、[〜#〜] is [〜#〜]可能です。私のRPMの1つに、パスワードで保護されたWindows共有をマウントするインストール後のスクリプトにmountコマンドがあります。

mount -t cifs //1.2.3.4/share /var/www/html -o username=user

rPMのインストール中に次の出力が表示されます。

Password:

次に、インストールを続行する前に、ユーザーはパスワードを入力する必要があります。

0
Alexey

@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で終了していることを確認してください。つまり、ユーザーが入力を入力する別の端末にこのメッセージを出力します。

それが役に立てば幸い。

0
kit