2014-02-04 4 views
0

Это кажется обманчиво простым ответом на вопрос, но может и не быть.Что такое неинвазивный независимый от ОС тест для проверки пароля пользователя системы PostgreSQL NULL?

Давайте посмотрим на другой (более простой) случай. Как мы можем проверить, что пароль системного пользователя «SOMEPASS», если предположить, что пользователь системы является «postgres».

su - postgres; env PGPASSWORD=SOMEPASS psql -h localhost -c 'select' > /dev/null 
if [ $? -ne 0 ]; then 
    echo "Invalid password." 
fi 

Параметр -h на PSQL принуждает соединение использовать TCP вместо сокет домена, который заставляет на основе паролей входа в систему. В противном случае параметр pg_hba.conf по умолчанию настроен так, чтобы разрешать несанкционированные подключения от пользователя системы через сокет домена.

Что такое аналогичная версия вышеприведенного теста, но которая может проверить, что пароль пользователя системы равен NULL? Тест должен возвращать 0, если у пользователя системы есть NULL-пароль, а 1 - нет.

Кроме того, поскольку я надеюсь преобразовать это в общий код для использования в кукольной среде в ОС Windows, Solaris и Linux, решение должно (не может?) Использовать вспомогательные утилиты командной строки, такие как sed, awk, Perl и т.д.

+0

Вы имеете в виду пользователя операционной системы, например пользователя postgres в '/ etc/passwd' и'/etc/shadow' в традиционных Unix-системах? Или вы имеете в виду суперпользователя базы данных postgres'? –

+0

Суперпользователь базы данных postgres, а не пользователь ОС. В принципе, если вы выполните «select rolname, rolpassword from pg_authid», вы увидите пользователей, и каждый, у кого есть пароль NULL, будет пустым в этом столбце. – r3cgm

ответ

1

Чтобы превратить любой psql запрос в качестве возвращаемого значения в оболочке у вас есть несколько вариантов:

  1. Have psql испускает один логический и испытание с grep -q;
  2. Иметь psql испускать нулевые строки или ненулевые строки; или
  3. Есть ваш запрос не в состоянии с ERROR в одном случае, и тест psql «s возвращаемое значение

Из них я, как правило, отдают предпочтение первому, и это довольно легко с вашим делом:

if psql -At -c "select CASE WHEN rolpassword IS NULL THEN 'FAIL' ELSE 'OK' END from pg_authid WHERE rolname = 'postgres';" | grep -q FAIL; then 
    ... 
+0

Спасибо за ответ! Я начал путь №3, но не очень далеко. Мне нравится # 1 и он должен иметь возможность эффективно использовать его. Что касается независимости от ОС (например, совместимого с Windows), я думаю, что ОС просто может быть слишком ограничена, чтобы использовать такие решения. Если какой-либо суперсовестный пользователь Windows пытается попытаться найти аналогичное решение для этой платформы, я рассмотрю этот вопрос с окончательным ответом. – r3cgm

+1

@ r3cgm вы можете много сделать с cmd.exe, если вы готовы переносить кошмары и потенциальную потерю зрения. Посмотрите на 'FOR/F', например. В этом случае 'findstr' может делать то, что вы хотите; см. '% ERRORLEVEL%'. В эти дни я часто просто устанавливаю msys (обычно, устанавливая msysgit) и использую unix-подобные инструменты, хотя это менее болезненно. Или используйте PowerShell от MS, что довольно круто, когда вы обнимаете его. Или используйте vbscript ('cscript.exe'). У вас есть множество умеренных вариантов дерьма на выбор :-) –

Смежные вопросы