Назад | Перейти на главную страницу

Почему sudo не знает, где находится psql?

Эта проблема

В Документация по установке CKAN показывает, как вывести список установленных баз данных PostgreSQL.

Команда выглядит так:

sudo -u postgres psql -l

Когда я пробую это в своей оболочке, я получаю сообщение об ошибке:

$ sudo -u postgres psql -l
sudo: psql: command not found

Обходной путь

Daniel2d2art на сайте CentOS форум обошел проблему, полностью указав путь к psql.

Мой psql живет в каталоге /usr/pgsql-9.2/bin, поэтому мой обходной путь теперь выглядит так:

sudo -u postgres /usr/pgsql-9.2/bin/psql -l

Когда я пробую это в своей оболочке, это работает:

$ sudo -u postgres /usr/pgsql-9.2/bin/psql -l
                                   List of databases
     Name     |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
--------------+----------+----------+-------------+-------------+-----------------------
 postgis_test | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres     | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
              |          |          |             |             | postgres=CTc/postgres
 template1    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
              |          |          |             |             | postgres=CTc/postgres
(4 rows)

Как мне это исправить?

Я не должен был полностью определять путь, верно?

У пользователя postgres уже есть psql на своем пути:

$ sudo -u postgres echo $PATH
/usr/pgsql-9.2/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin

Как мне это исправить?

Почему sudo игнорирует ваш путь

sudo не использует путь вашего пользователя или путь пользователя postgres. sudo имеет свой собственный путь, определяемый secure_path переменная в файле /etc/sudoers.

Выход echo $PATH вводит в заблуждение в этом случае. Чтобы увидеть путь, который действительно использует sudo, используйте printenv PATH вместо. В моем случае результат выглядел так:

$ sudo -u postgres printenv PATH
/sbin:/bin:/usr/sbin:/usr/bin

Вывод не содержит /usr/pgsql-9.2/bin, где находится psql, поэтому он также не находится на пути sudo.

Чтобы решить эту проблему, вы можете добавить, где находится psql, в secure_path переменная.

Как сказать sudo, где находится psql

Использовать sudo visudo открыть /etc/sudoers в vi.

Файл должен содержать такую ​​строку:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

Эта строка устанавливает путь для sudo. Часть после знака равенства такая же, как и результат предыдущей printenv PATH пример.

Замените это примерно так:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/pgsql-9.2/bin

Замена добавляет /usr/pgsql-9.2/bin в список путей. Разделителем списка путей является двоеточие (:).

Сохраните и закройте файл.

Чтобы убедиться, что это сработало, попробуйте printenv PATH команду снова:

$ sudo -u postgres printenv PATH
/sbin:/bin:/usr/sbin:/usr/bin:/usr/pgsql-9.2/bin

Выглядит хорошо!

Теперь попробуйте psql -l команда:

$ sudo -u postgres psql -l
                                   List of databases
     Name     |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
--------------+----------+----------+-------------+-------------+-----------------------
 postgis_test | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres     | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
              |          |          |             |             | postgres=CTc/postgres
 template1    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
              |          |          |             |             | postgres=CTc/postgres
(4 rows)

Оно работает!

Благодаря Дрю Хури кто указал мне решение аналогичной проблемы на Суперпользователь.

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

sudo su postgres

а потом

psql -l

должно сработать.