ディレクトリを '/home/corey/scripts' に変更できません: 権限が拒否されました。

ディレクトリを '/home/corey/scripts' に変更できません: 権限が拒否されました。

エラーメッセージが表示されます...

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つの異なるソリューションがあります。

  1. コマンドに追加してpsqlログインシェルで実行-i

    sudo -i -u postgres psql < setup_dev_db.sql
    

    これにより、リストされたディレクトリに$HOME設定されます。 Ubuntuの場合はこれです。ただし、コマンドを入力するため、ファイルは生成されません。ただし、Interactiveを使用している場合は、コンピュータ権限を持つ他の人は誰でもpostgresHOME/etc/passwd/var/lib/postgres.psql_historypsqlsudo〜するコマンド履歴にアクセスできます。

    この状況でログインシェルを実行すると、他の否定的な結果があるかどうかはわかりません。

  2. psql権限の低いユーザーとして実行します。

    $ psql dev_db -hlocalhost corey_dev -W < setup_dev_db.sql
    

    setup_dev_db.sqlPostgresユーザーの作成をスクリプトに任せ、まだユーザーがいないために問題が発生した場合は、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()(ここPGSYSCONFDIRPGLOCALEDIR)。

以前のバージョンのソリューション:

16より前のバージョンでは、コマンドが実行されている作業ディレクトリに対するコマンドの実行権限をユーザーに付与してpsqlバグを修正しました。xこれはいくつかの方法で行うことができます。

  1. -iログインシェルを使用するコマンドを追加し、sudoコマンドを実行する前に、作業ディレクトリをpostgresユーザーのホームディレクトリに変更します psql(postgresユーザーは当然、x自分のホームディレクトリに対する権限を持っています)。

    sudo -i -u postgres psql < setup_dev_db.sql
    
  2. 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
    
  3. 「他の」作業ディレクトリに対する権限を付与して、x現在の作業ディレクトリに対するpostgresユーザー権限を付与します。これは、たとえば、単純なコマンドでエラーを修正できるxWSL2などの開発に使用されるシングルユーザーVMベースのシステムで便利です。chmod o+x /home/$USER

  4. psqlもちろん、現在の作業ディレクトリに対する権限を持つ現在のユーザーとして実行します。

  5. コマンドを実行する前に、作業ディレクトリをpostgresユーザーに特権のあるディレクトリに変更してくださいxcd /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

関連情報