エラーメッセージが表示されます...
could not change directory to "/home/corey/scripts": Permission denied
...次のスクリプトを実行すると...
#!/bin/bash
sudo -u postgres psql < setup_dev_db.sql
read -rsp $'Press any key to continue...\n' -n 1 key
... setup_dev_db.sqlの内容は問題なく実行されますが、エラーが発生したため面倒です。
私はそれを削除できますか?
答え1
Postgresは、クライアントからのすべてのクエリとコマンドが保存される$HOME/.psql_history
ファイルを生成しようとします。psql
何か別の作業をしたいのかもしれませんが$HOME
、他の隠されたファイルの形ではそのような証拠も見えません。対話的に使用しないと、実際には履歴ファイルは生成されませんが、実際にはpsql
そうではありません。
私は同じ問題があり、これを見つけましたが、許可された答えは私に受け入れられませんでした。スクリプトで実行されているディレクトリにクエリ追跡を残すためにpostgres権限を与えてはいけません!
@Corey、あなたのコメントで言及した解決策(cd /tmp
電話する前sudo...
)はおそらく最高です。psql
このファイルは作成されていません/tmp
(権限のないユーザーがファイルを読み取ることができるため、意図的なものであると確信しています)。
私が考えることができる2つの異なるソリューションがあります。
コマンドに追加して
psql
ログインシェルで実行-i
sudo -i -u postgres psql < setup_dev_db.sql
これにより、リストされたディレクトリに
$HOME
設定されます。 Ubuntuの場合はこれです。ただし、コマンドを入力するため、ファイルは生成されません。ただし、Interactiveを使用している場合は、コンピュータ権限を持つ他の人は誰でもpostgres
HOME
/etc/passwd
/var/lib/postgres
.psql_history
psql
sudo
〜するコマンド履歴にアクセスできます。この状況でログインシェルを実行すると、他の否定的な結果があるかどうかはわかりません。
psql
権限の低いユーザーとして実行します。$ psql dev_db -hlocalhost corey_dev -W < setup_dev_db.sql
setup_dev_db.sql
Postgresユーザーの作成をスクリプトに任せ、まだユーザーがいないために問題が発生した場合は、createuser
まず次のようにスクリプトにコマンドを追加するだけです。$ sudo -u postgres createuser corey_dev -P
おそらく...
$ sudo -u postgres createdb dev_db "Dev database"
注:psql
クライアントをインタラクティブに使用する場合could not change directory to "/home/corey/scripts": Permission denied
(ここではあなたではありません)、message****のようなメッセージが表示されたら、psql
はい/var/lib/postgres/.psql_history
(またはどこにいても)手紙を書くでしょう$HOME
!インタラクティブを使用しているときにこの警告を表示した場合は、psql
詳しく確認してください。隠し履歴ファイルを見つけることができます。
答え2
ディレクトリを変更するには、ユーザーにディレクトリに対する「x」権限が必要です。
私はあなたが "/home/corey/scripts"でスクリプトを実行していると仮定します。 「sudo -u postgres」が現在のユーザーを「postgres」に変更すると、「postgres」の作業ディレクトリは、表示されたエラーが生成されたときに呼び出されたディレクトリに設定しようとします。
ユーザー「postgres」に「/home/corey/scripts」に対する「x」権限があることを確認してください。
答え3
長い話を短く:持つこの問題に関する議論PostgresメーリングリストからPostgreSQL 16で修正されました。
間違った理由:
しかし@lambartのソリューションそうですね。エラーが発生した理由は、ファイルとは関係がないためではありません.psql_history
。これ
could not change directory to "/home/corey/scripts": Permission denied
エラーは次のように発生します。resolve_symlinks()
機能シンボリックリンクを確認しchdir
、最終的に元のディレクトリに戻ろうとします。実行しているユーザーにその権限がないとchdir
失敗します。psql
呼び出しresolve_symlinks()
はから来find_my_exec()
、この呼び出しはから呼び出されます。set_pglocale_pgservice()
(ここPGSYSCONFDIR
とPGLOCALEDIR
)。
以前のバージョンのソリューション:
16より前のバージョンでは、コマンドが実行されている作業ディレクトリに対するコマンドの実行権限をユーザーに付与してpsql
バグを修正しました。x
これはいくつかの方法で行うことができます。
-i
ログインシェルを使用するコマンドを追加し、sudo
コマンドを実行する前に、作業ディレクトリをpostgresユーザーのホームディレクトリに変更しますpsql
(postgresユーザーは当然、x
自分のホームディレクトリに対する権限を持っています)。sudo -i -u postgres psql < setup_dev_db.sql
x
作業ディレクトリを所有するグループにpostgresユーザーを追加して、現在の作業ディレクトリに対するpostgresユーザー権限を付与します。# Get group owning the current directory stat -c "%G" . # Add postgres user to that group sudo usermod -aG <group above here> postgres
「他の」作業ディレクトリに対する権限を付与して、
x
現在の作業ディレクトリに対するpostgresユーザー権限を付与します。これは、たとえば、単純なコマンドでエラーを修正できるx
WSL2などの開発に使用されるシングルユーザーVMベースのシステムで便利です。chmod o+x /home/$USER
psql
もちろん、現在の作業ディレクトリに対する権限を持つ現在のユーザーとして実行します。コマンドを実行する前に、作業ディレクトリをpostgresユーザーに特権のあるディレクトリに変更してください
x
。cd /tmp
答え4
これは私にとって効果的でした。引用符( ')に注意してください。
sudo -Hiu postgres 'pg_dump --column-inserts --data-only --table=someTable entities_db > /var/backups/anywhere/$(date +%Y%m%d_%H%M%S)_someTable.sql'
sudoに関する注意事項-Hiu
または使用su - postgres
ルートcronjobに入れることもできます。crontab -e