É possível obter a entrada do usuário durante a instalação do rpm?

4

É possível obter informações de um usuário durante uma instalação de rpm?
Eu tenho um script que funciona por si só (recebendo informações de um usuário e executando ações), mas quando executado como parte da pós-instalação de um rpm (ou seja, adicionado na %postseção de uma especificação de rpm), ele não funciona.

Deveria ser possível? Esta é a parte:

%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  

Durante a instalação, ele salta diretamente para o cancelamento dentro da segunda declaração de caso.
Por quê? O que eu estou fazendo errado aqui?

Jim
fonte

Respostas:

3

Não, você não pode ter scripts de pós-instalação interativos nos RPMs. Isso é deliberado.

Muitas vezes, os RPMs são instalados em um sistema autônomo. Se a instalação travasse até que alguém aparecesse, ela poderia ficar presa por séculos.

Patrick
fonte
Você quer dizer que não é tecnicamente possível?
Jim
Eu sei que isso é antigo como sujeira, mas não é estritamente uma má idéia, desde que seu aplicativo seja o produto final (em oposição ao SO básico ou algo assim) e as rpm consistentemente e sempre solicitem entrada durante a instalação. Não concordo em colocá-lo em um script de especificação (provavelmente deve ser um comando de ativação / configuração pós-instalação ou algo assim), mas não está errado. A instalação do software sempre exige que você tenha alguma noção do que está instalando. Se você sabe que requer entrada, basta trabalhar isso no seu processo automatizado.
Bratchley
3

É uma péssima ideia, mas é possível.

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.
Charles Duffy
fonte
Obrigado @Charles. Sua sugestão parece levar a uma solução promissora (ainda que ruim). Vou discutir com os superiores uma solução mais sensata ...
boardrider
0

Tecnicamente, é possível, pelo menos para alguns comandos. Em um dos meus RPMs, tenho mountcomando em scripts de pós-instalação que monta um compartilhamento do Windows protegido por senha:

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

e recebo a seguinte saída durante a instalação do RPM:

Password:

o usuário precisará digitar a senha antes da instalação continuar.

Alexey
fonte
... porque, por razões de segurança, as solicitações de senha vão diretamente para o TTY, como minha resposta descreve.
Charles Duffy
0

Como o @Charles Duffy postou a resposta, podemos fazer isso com a funcionalidade / dev / tty do Linux. Também podemos usar a leitura para ler uma linha da entrada padrão.

O exemplo abaixo é para rpm interativo -

Se você deseja receber informações do usuário como [S / n] -

echo "Do you want to install <some package> [Y/n] "
if exec </dev/tty; then
    read input;
fi

# use input here or below

Alguns usuários podem querer criar um repositório yum a partir desse rpm interativo.

O exemplo abaixo é para rpm interativo com yum -

Se você deseja receber informações do usuário como [S / 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

Certifique-se de que o script eco acima termine com> / dev / tty, ou seja, imprima esta mensagem em um terminal diferente no qual o usuário digitará a entrada.

Espero que ajude.

kit
fonte