centos – 为什么sudo不知道psql在哪里?

问题

CKAN installation documentation向您展示了如何列出已安装的PostgreSQL数据库.

该命令如下所示:

sudo -u postgres psql -l

当我在我的shell中尝试它时,我收到一个错误:

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

解决方法

CentOS forum上的Daniel2d2art通过完全限定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

我该如何正确解决这个问题?

为什么sudo忽略了你的道路

sudo不使用用户的路径或postgres用户的路径. sudo有自己的路径,由文件/ etc / sudoers中的secure_path变量定义.

在这种情况下,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在vi中打开/ 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)

有用!

感谢Drew KhourySuper User为我提供类似问题的解决方案.

相关文章

linux下开机自启: 在/etc/init.d目录下新建文件elasticsear...
1、因为在centos7中/etc/rc.d/rc.local的权限被降低了,所以...
最简单的查看方法可以使用ls -ll、ls-lh命令进行查看,当使用...
ASP.NET Core应用程序发布linux在shell中运行是正常的。可一...
设置时区(CentOS 7) 先执行命令timedatectl status|grep &...
vim /etc/sysconfig/network-scripts/ifcfg-eth0 B...