/etc/profile.d script interferindo com o início de um serviço e atrasando consideravelmente a disponibilidade do ssh após a reinicialização

0

Eu criei um script em /etc/profile.d (centos6), não relacionado ao fantoche de forma alguma, em vez disso, basta copiar alguns arquivos para um diretório de usuários. De alguma forma, em um servidor mestre da empresa fantoche, esse script está interferindo no serviço pe-postgresql e fazendo com que o servidor seja atrasado na inicialização e não permitirá que esse serviço seja executado.

Este script de perfil tem um recurso que solicita ao usuário o logon e pergunta se ele deseja instalar (y, n), se um dos arquivos não for encontrado. Eu suspeito que isso está acontecendo em segundo plano para algo quando um serviço de marionetes está começando em algum lugar, fazendo com que o serviço falhe.

#/etc/profile.d/custom.sh
if [ ! f ~/.custom ]; then
    logPrompted;
    while true; do
        read -p "Do you want to install?)" yn
        case $yn in
         [Yy]* )
           installCustom;
           break;;
         [Nn]* )
           logOptedOut;
           break;;
         * ) echo "Please enter y or n!";;
        esac
    done
fi

Assim que mover o arquivo para fora de /etc/profile.d , os problemas param. Por exemplo. sudo service pe-postgresql start falha toda vez que esse script está em vigor.

Quando olho para os usuários fantoches cat /etc/passwd | grep pe- , posso verificar se todos eles são nologin .

Há algo que está faltando aqui ou outro usuário do serviço de marionetes que estou perdendo. o que é possivelmente interativo.

Eu adicionei o registro em cada execução para ver quando foi executado ( logPrompted ), antes da pergunta, reportando $(whoami) , na esperança de descobrir o usuário oculto e, no log, vi pe-postgres sendo registrado cada vez que "eu" tentar reiniciar o serviço, mas isso não é consistente.

olhando para / etc / passwd, esse usuário é pe-postgres:x:492:493:Puppet Enterprise PostgreSQL Server:/opt/puppet/var/lib/pgsql:/sbin/nologin

Estou tentando descobrir como posso evitar esse usuário ou qualquer usuário nologin para interagir com este script de perfil.

Há algo que eu possa precisar adicionar ao início de um script profile.d para salvaguardar esse tipo de coisa?

    
por Brian Thomas 28.07.2018 / 01:08

1 resposta

1

Os prompts só fazem sentido quando o shell é interativo. (Você não gostaria que eles interferissem, por exemplo, com conexões SFTP ...) Para verificar a interatividade, você tem duas opções:

  • Teste se $- contém a letra i .

    case $- in
      *i*) <do your prompts>;;
      *) return;;
    esac
    

    Ou:

    if ! case $- in *i*) false; esac; then
        <do your prompting>
    fi
    
  • Use [ -t 0 ] para testar se stdin (descritor de arquivo # 0) é um terminal:

    if [ ! -t 0 ]; then
        return
    fi
    

    Ou:

    if test -t 0; then
        <do prompts here>
    fi
    

(Como seu script é "originado" por um script pai, chamar return de funções externas é permitido e retornará ao script pai. Isso permite evitar um nível extra de recuo.)

O segundo método (verificação de stdin) não realmente testa a interatividade - por exemplo, sh -l -c "some command" ainda passaria no teste ao ser executado em um terminal. Mas ainda funciona em muitos casos, porque serviços e conexões SFTP não possuem um terminal alocado.

    
por 28.07.2018 / 03:19