環境
バージョン | ||
---|---|---|
Host OS | Windows 10 Home | 21H1(OSビルド:19043.1165) |
Virtual Machine | WSL2 | - |
Remote OS | Ubuntu | 20.04.2 LTS (GNU/Linux 5.4.72-microsoft-standard-WSL2 x86_64) |
Database | PostgreSQL | 12.7 (Ubuntu 12.7-0ubuntu0.20.04.1) |
Database GUI | 無し | - |
Docker | 無し | - |
#何があった?
WSL2・DBeaverでPostgreSQLを使えるようにすべくPostgreSQLの設定ファイル(pg_hba.conf)の書き換えを試みたところ、下スクショのような状態に書き換わってしまった。
本来であれば「host all all 127.0.0.?/32? md5」を含むコード(?)が何行も表示されるはずが、全て「~」に書き換わってしまった。VSCターミナルの下方には
「"pg_hba.conf" [Permission Denied] 0,0-1 All」
と表示されている状態。
#何をしたらこうなった?
設定ファイル「/etc/postgresql/12/main/pg_hba.conf」をテキストエディタviで開き
「host all all 127.0.0.1/32 md5」を
「host all all all md5」に
変更しようと試みた。
【やったこと】
WSL2のターミナルで
下記を実行
umesan@MyComputer:~$ cd /etc/postgresql/12/main
↓
下記を実行
umesan@MyComputer:/etc/postgresql/12/main$ vi pg_hba.conf
(viでpg_hba.confファイルを開く、の意)
↓
(WSL2ターミナルにpg_hba.confテキストファイルが展開される)
上記画面のように「~」が羅列されている状態になっていた。
#原因と対処方法を探す
①VSC下方に表示された「Permission Denied」って何?
→「パーミッションが拒否された状態」ということ。
Permission:パーミッション。=ファイルに対してアクセス権限がどのように設定されているかがわかる。詳細は下記②参照。
Denied:拒否された
②「ls -ld」でディレクトリ自体の情報を確認する。
@reta さんよりコメントでアドバイスいただき、下記のとおり確認した。
コマンド「ls -ld /etc/postgresql/12/main」で、データディレクトリの所有者を確認してみてとのこと。
やってみる。
umesan@MyComputer:~$ ls -ld /etc/postgresql/12/main
drwxr-xr-x 3 postgres postgres 4096 Jul 23 22:54 /etc/postgresql/12/main
・ls:ファイル一覧取得
・-ld:ディレクトリに含まれているものの情報ではなく、ディレクトリ自体の情報を表示する。
・drwxr-xr-x 3 postgres postgres 4096 Jul 23 22:54 /etc/postgresql/12/main:
⇒d = ファイルタイプはディレクトリですよ。
⇒rwxr-xr-x =パーミッションはrwxr-xr-xですよ。
(参考記事=「パーミッションについて」
→この参考記事中の「2.UNIX上での表記」の表がすごくわかりやすかった!この表に当てはめて考えると、
今回のパーミッションの意味は「
自分(ファイル/ディレクトリの所有者、本人のこと)=読み(readable)書き(writable)実行(executable)の3つの実行権がすべて許可される。
グループ(同じサーバーを利用できるユーザ全体)=読み実行の2つの実行権が許可される。
他人(その他全て、第三者のこと)=読み実行の2つの実行権が許可される。
」ということ。)
(参考:「理解しておきたいファイルシステムと、lsコマンドの使い方」)
⇒3 = ハードリンクの数は3ですよ。
⇒オーナー名(ファイルの所有者)は postgresですよ。
⇒グループ名(ファイルが所属するグループ)は postgresですよ。
⇒バイトサイズは 4096ですよ。
⇒タイムスタンプは Jul 23 22:54ですよ。
⇒ファイル名は /etc/postgresql/12/mainですよ。
「Permission Deniedとある通り、権限のないファイルをvimで開こうとすると、今回の事象が発生します。
ファイルを開けないから、空っぽのファイルを表示している、という認識で差し支えありません。」
とのこと。
③postgresユーザでログインする。
@reta さんからいただいた
「pg_hba.confに限らず、postgresのデータディレクトリ内は、postgresを起動中のユーザしか読み書きできないようになっています。」
「編集したい場合、pg_hba.confの権限を変更することはできませんので、postgresユーザでログインしてからvimで編集してください。」というアドバイス。
それだ!ログインしていないからファイル開けなかったんだ。
postgresにログインする。
umesan@MyComputer:~$ sudo service postgresql start
[sudo] password for umesan:
* Starting PostgreSQL 12 database server [ OK ]
umesan@MyComputer:~$ sudo -u postgres psql
psql (12.7 (Ubuntu 12.7-0ubuntu0.20.04.1))
Type "help" for help.
postgres=#
④別のVSCodeターミナルを立ち上げて「vi pg_hba.conf」する
③でpostgresにログインしたので、ログインしたターミナルはそのままにして
新しく別のVSCodeターミナルを「New Terminal」で立ち上げる。
下記を実行して「pg_hba.conf」を開こうと試みた。
umesan@MyComputer:~$ cd /etc/postgresql/12/main
umesan@MyComputer:/etc/postgresql/12/main$ vi pg_hba.conf
えーー!また「Permission Denied」になってしまった・・・。
⑤ユーザーpostgres かつ viで 「/etc/postgresql/12/main/pg_hba.conf」を開く
@renta さんよりコメントがあり、
とりあえず面倒なことは抜きにして、これを実行してみてください。
SUDO_EDITOR=vi sudoedit -u postgres /etc/postgresql/12/main/pg_hba.conf
とのこと。実行したところ(実行したこと=下記「対処方法」に記載)、pg_hba.confファイルが開きました!
教えていただいたコードの意味を調べてみます。
・SUDO_EDITOR=vi sudoedit /etc/postgresql/12/main/pg_hba.conf
意味:環境変数「SUDO_EDITOR」を設定する。「vi」で「/etc/postgresql/12/main/pg_hba.conf」を編集する。
(参考=「sudoedit」で安全で快適にLinuxの設定ファイルを編集しよう!)
(参考=「sudo vi」ではなく「sudoedit」を使いましょうというお話)
-環境変数とは?:OSの持っている箱!(詳細=https://wa3.i-3-i.info/word11027.html)
今回の場合だと、SUDO_EDITORが「vi sudoedit /etc/postgresql/12/main/pg_hba.conf」だということ。・・・なのか?
-sudoとは?:スーパーユーザ(や他のユーザ)の権限でコマンドを実行するときに使うコマンド。(詳細=https://wa3.i-3-i.info/word11269.html)
-sudoedit とは?:権限ありまくりのrootではなく、一般ユーザの権限でエディタが実行できる。つまり、書き換えたいファイル以外のファイルを書き換えてしまうリスクを無くせる。つまり、sudoより安全安心!ファイルを書き換えるときはsudoではなくsudoeditを使おう!(詳細=https://linuxfan.info/sudoedit)
・ -u postgres
意味:ユーザーpostgresで接続する。
(今回の接続先は「/etc/postgresql/12/main/pg_hba.conf」ということかな。)
◆⑤の考察◆
・SUDO_EDITOR=vi sudoedit -u postgres /etc/postgresql/12/main/pg_hba.conf
は、「pg_hba.confをviで開いてください。ユーザーpostgresでね!」という意味?
・「SUDO_EDITOR=」が環境変数だということはわかったけれど、今回のコードで何をしているのかがいまいちわからない。SUDO_EDITORを指定している、ということ?でも今回のコードは「postgresにログインしたままviでpg_hba.confを開く」ために実行したんだよなあ。SUDO_EDITORを指定する、ということとの関係がわからない。
SUDO_EDITORって、何??ググっても、それを使うシーンの説明でこの環境変数が出てくるだけで、それ自体が何なのかを詳しく説明している記事には出会えなかった。使っていくうちにわかったら、まとめたい。
★メモ★
・viとは?vimとは? → https://eng-entrance.com/linux-vi-is
・すぐわかる!viの保存と終了の方法【Linux基礎知識】
#原因
・postgresにログインしていなかった。
・2つのターミナルを立ち上げ、一方でpostgresへのログイン、一方でpg_hba.confファイルの展開をしようとしていた。
#対処方法
【結論】
「postgresへのログイン」「pg_hba.confファイルの展開」を1コード(下記)で実行する。
SUDO_EDITOR=vi sudoedit -u postgres /etc/postgresql/12/main/pg_hba.conf
【実行したこと】
①ホスト(Win10)で「 Ubuntu 20.04.2 LTS」アプリをクリックしてUbuntuを起動。
②Ubuntuターミナルで「umesan@MyComputer:~$ code .
」を実行。
(VSCodeが立ち上がる。)
③VSCodeターミナルで「umesan@MyComputer:~$ SUDO_EDITOR=vi sudoedit -u postgres /etc/postgresql/12/main/pg_hba.conf
」を実行。(=下スクショ)
「[sudo] password for umesan: 」とパスワードを求められるので入力。
#おわりに
rentaさんに教えていただいたコードを実行するかたちで、つまずいていた部分(pg_hba.confファイルの展開)はクリアすることができた。
が、まだ教えていただいたコードの意味を咀嚼しきれておらず、わかっていない部分が多い。
使いながらわかっていく部分もあると思うので、今はわからない点を挙げるだけに留める(下記「未解決事項」)。
次は「pg_hba.confファイルの書き換え」に進む!
#未解決事項
・「SUDO_EDITOR=」の意味がわからない。環境変数だということはわかった。ただ、今回のコード(SUDO_EDITOR=vi sudoedit -u postgres /etc/postgresql/12/main/pg_hba.conf
)での役割がよくわからない。「pg_hba.confをviで開いてください。ユーザーpostgresでね!」という意味?どんなシーンで使う環境変数なの?
・なぜ「2つのターミナルを立ち上げて、一方でpostgresへのログイン、一方でpg_hba.confファイルの展開」をしようとした方法が間違っているのか、まだ理解できていない。両方とも「umesan@MyComputer」で始まっていたから、それはつまり「立ち上げているターミナルは異なれど、同じシェルで操作している状態」なのだと認識していた。が、その認識が誤っていたということ??わからない。