「postgres」で実行される「psql」で使用するフォルダの安全な一時コピーを作成します。

「postgres」で実行される「psql」で使用するフォルダの安全な一時コピーを作成します。

与えられた状況を処理する理想的な方法を見つける問題です。

マイホームフォルダの下のフォルダには、次のセットがあります。SQL\include_relativeメタコマンドを介して互いに参照するスクリプトファイル。時には、これらのスクリプトを実行する必要があります。SQLデータベーススーパーユーザーとして。なぜならポストグレスすでに同僚の検証が完了しているので、電話する必要があります。SQLそしてsudo --user postgres。しかし、これらのファイルは私のホームフォルダにあるので、OSユーザーはポストグレスアクセスできません。読み取るスクリプトファイルが1つしかない場合は、示されているように単にシェルリダイレクトを使用できますが、他のファイルが含まれているsudo -u postgres psql < ~/psql/myscript.psql場合myscript.psqlSQL見つかりません。

これを行うための簡単でマイナーな方法がたくさんあります。しかし、スクリプトを実行する必要があるたびにファイルを手動でコピー/移動/削除することを排除し、コンテンツを破損することなくソースフォルダとスクリプトファイルを自由に移動して名前を変更する機能を維持したいと思います。また、これはミッションクリティカルな本番サーバーであるため、PostgreSQLサービスを中断することはできません(たとえば、スーパーユーザーの追加や認証設定の変更などのクラスタ構成の変更)。理想的には、これがサーバーの残りの部分に透明であることを願っています。これには、事前設定された(例:ftab、systemd-mount)バインドマウントおよびオーバーライド、またはサーバー構成に対するその他の変更に関するソリューションは含まれません。

特に、スクリプトフォルダをすぐに使用できるようにするコマンドを探しています。SQL、スクリプトの実行中にのみ有効です。これまで私の解決策は次のとおりです。

$ sudo mount --bind -o ro,X-mount.mkdir=777 ./psql ~postgres/tmp && \
  sudo -iu postgres psql -f ~postgres/tmp/myscript.psql; \
  sudo umount ~postgres/tmp && \
  sudo rmdir ~postgres/tmp

しかし、まだ冗談だと思い、改善に取り組んでいます。そして私はtmpそれが好きではありません~postgres。誰もより良いアイデアを持っていますか?

編集する:以下の@larsksのコメントに基づいて、上記のソリューションに複数のユーザーがアクセスできるシステムにプライバシーの欠陥があることに気づきました。ポストグレスユーザー。

答え1

run-with-tempdir以下のようにシェルスクリプトを作成します。

#!/bin/sh

tmpdir=$(mktemp -d ~postgres/tmp/psqlXXXXXX)
trap "rm -rf $tmpdir" EXIT

tar -C "$tmpdir" -xf- &&
  psql -f "$tmpdir/$1"

次に、次のように実行します。

tar -C psql -cf- . | sudo -u postgres run-with-tempdir myscript.psql

(a) ホームディレクトリを postgres ユーザに公開しない。 (b)システムの他のユーザーにスクリプトを公開しません(tmpdirがmodeを使用して作成されるため700)。 (c)バインドマウントは必要ありません(これが原因で発生する可能性があります)。エラーが原因で削除が発生しない場合は、問題が発生します)と(d)は自動的にクリーンアップされます。

関連情報