Я создал скрипт в /etc/profile.d (centos6), никак не связанный с puppet, вместо этого он просто копирует некоторые файлы в каталог пользователя. Каким-то образом на главном корпоративном сервере Puppet этот сценарий вмешивается в службу pe-postgresql и вызывает задержку запуска сервера при запуске и не позволяет этой службе работать.

Этот скрипт профиля имеет функцию, которая запрашивает пользователя при входе в систему и спрашивает, хочет ли он установить (y, n), если один из его файлов не найден. Я подозреваю, что это происходит в фоне чего-то, когда марионеточная служба запускается где-то, вызывая сбой этой службы.

#/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

Как только файл перемещается из /etc/profile.d , проблемы прекращаются. Например, sudo service pe-postgresql start завершается ошибкой каждый раз, когда этот сценарий работает.

Когда я смотрю на пользователей марионеток, cat /etc/passwd | grep pe- Я могу убедиться, что все они nologin .

Здесь либо что-то, чего мне не хватает, либо другой пользователь службы кукол, которого мне не хватает. который, возможно, интерактивный.

Я добавил ведение журнала при каждом запуске, чтобы видеть, когда он запускался (logPrompted), перед вопросом, сообщая $(whoami) , надеясь раскрыть скрытого пользователя, и в журнале я действительно вижу, что pe-postgres регистрируется каждый раз, «Я "попробуйте перезапустить службу, но это не соответствует.

глядя на /etc /passwd этот пользователь pe-postgres:x:492:493:Puppet Enterprise PostgreSQL Server:/opt/puppet/var/lib/pgsql:/sbin/nologin

Я пытаюсь выяснить, как я могу избежать того, чтобы этот пользователь или любой пользователь nologin взаимодействовал со сценарием этого профиля.

Могу ли я что-то добавить в начало скрипта profile.d, чтобы защитить его от подобных вещей?

1 ответ1

1

Подсказки имеют смысл только тогда, когда оболочка является интерактивной. (Вы не хотели бы, чтобы они вмешивались, например, в соединения SFTP ...) Чтобы проверить интерактивность, у вас есть два варианта:

  • Проверьте, содержит ли $- букву i .

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

    Или же:

    if ! case $- in *i*) false; esac; then
        <do your prompting>
    fi
    
  • Используйте [ -t 0 ] чтобы проверить, является ли stdin (дескриптор файла # 0) терминалом:

    if [ ! -t 0 ]; then
        return
    fi
    

    Или же:

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

(Так как ваш сценарий "получен" от родительского сценария, вызов функции return вне функции разрешен и вернется к родительскому сценарию. Это позволяет избежать дополнительного уровня отступов.)

Второй метод (проверка stdin) на самом деле не проверяет интерактивность - например, sh -l -c "some command" все равно будет проходить тест при запуске через терминал. Но это все еще работает во многих случаях, потому что сервисам и соединениям SFTP не выделен терминал.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .