Сценарий /etc/profile.d, мешающий запуску службы и значительно задерживающий доступ ssh после перезагрузки

301
Brian Thomas

Я создал сценарий в /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.

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

Я добавлял логирование при каждом запуске, чтобы видеть, когда его run ( 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, чтобы защитить его от подобных вещей?

0
Вы смотрели на сам сервис pe-postgresql? (т.е. тот, что находится в /etc/init.d) grawity 5 лет назад 1
Отличная идея. Я вижу это `$ SU -l pe-postgres -s / bin / bash -c" $ PGENGINE / postmaster -p '$ PGPORT' -D '$ PGDATA' $ & ">>" $ PGSTARTUPLOG "2 > & 1 </ dev / null`. Я догадываюсь, почему он запускает скрипт, потому что он указывает / bin / bash. Это было очень загадочно, поэтому я предпочел бы защитить свой сценарий, чтобы не предлагать предполагаемых пользователей. Есть идеи? Brian Thomas 5 лет назад 0

1 ответ на вопрос

1
grawity

Подсказки имеют смысл только тогда, когда оболочка является интерактивной. (Вы не хотели бы, чтобы они мешали, например, 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внешних функций разрешен и вернется к родительскому сценарию. Это позволяет избежать дополнительного уровня отступов.)

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

Похожие вопросы