web-dev-qa-db-ja.com

Sudoがpsqlの場所を知らないのはなぜですか?

問題

CKANインストールドキュメント は、インストールされたPostgreSQLデータベースを一覧表示する方法を示しています。

コマンドは次のようになります。

Sudo -u postgres psql -l

シェルでそれを試すと、エラーが発生します。

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

回避策

CentOSフォーラム のDaniel2d2artは、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

出力には、psqlが存在する/usr/pgsql-9.2/binが含まれていないため、Sudoのパスにもありません。

この問題を修正するには、psqlが存在する場所をsecure_path変数に追加します。

PSQLがどこにあるかをSudoに知らせる方法

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 Khoury に感謝します Super User に関する同様の問題の解決策を教えてくれました。

小さな回避策-コマンドの実行に問題がない場合は、ユーザーを切り替えることができます

Sudo su postgres

その後

psql -l

うまくいくはずです。

0
betatester07