В Документация по установке 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 не использует путь вашего пользователя или путь пользователя 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 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
должно сработать.