问题
这CKAN 安装文档向您展示如何列出已安装的 PostgreSQL 数据库。
该命令如下所示:
sudo -u postgres psql -l
当我在 shell 中尝试该操作时,出现错误:
$ 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
当我在我的 shell 中尝试它时,它起作用了:
$ 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
我该如何正确修复这个问题?
答案1
为什么 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 位于何处
使用在 vi 中sudo visudo
打开。/etc/sudoers
该文件应该包含如下行:
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)
有用!
答案2
一个小的解决方法 - 如果你不介意执行更多命令,你可以切换用户
sudo su postgres
进而
psql -l
应该管用。