Bagaimana cara menemukan path ke pg_hba.conf dari shell?

101

Saya ingin mendapatkan path ke pg_hba.conf dari shell. Path bervariasi antara versi PostgreSQL. Misalnya, untuk 8.4 dan 9.1:

/etc/postgresql/8.4/main/pg_hba.conf
/etc/postgresql/9.1/main/pg_hba.conf

Saya sudah mencoba pg_configperintah itu, tetapi sepertinya tidak memasukkan informasi ini.

Ini agar saya dapat menggunakan perintah yang seragam untuk membuka pg_hba.confdan file konfigurasi PostgreSQL lainnya untuk diedit.

Saya menggunakan bash.

Roger Dahl
sumber
1
Bagaimana dengan mencari pg_hba.conf?
Pramod
1
@Ramod Ada puluhan dari mereka yang tergeletak di sekitar. Bagaimana jika Anda ingin tahu yang mana yang sedang digunakan oleh Postgres.
Bleeding Fingers
@BleedingFingers Tergantung pada pengaturan Anda, Anda mungkin bisa memfilter berdasarkan waktu akses. find / -name pg_hba.conf -amin -5(jika server telah di-restart dalam 5 menit terakhir; cukup mudah untuk mengubahnya -atimejika itu terakhir kali di-restart lagi). Atau Anda dapat memfilter menurut waktu akses yang lebih baru daripada mengubah waktu atau salah satu dari yang lain menemukan opsi berbasis waktu ... (Meskipun pemfilteran lsof | grep pg_hba.confsaat menjalankan server tidak bekerja).
Parthian Shot

Jawaban:

152

pg_configadalah untuk informasi pelengkap, untuk membantu ekstensi dan program klien menyusun dan menautkannya dengan PostgreSQL. Ia tidak tahu apa-apa tentang instance PostgreSQL aktif pada mesin, hanya binari-binari.

pg_hba.confdapat muncul di banyak tempat lain tergantung pada bagaimana Pg dipasang. Lokasi standar pg_hba.confdalam data_directorydatabase (yang bisa di /home, /var/lib/pgsql, /var/lib/postgresql/[version]/, /opt/postgres/, dll dll dll) namun pengguna dan pembuat paket bisa menempatkannya di mana pun mereka suka. Sayangnya.

Satu-satunya cara yang valid temukan pg_hba.confadalah dengan menanyakan contoh PostgreSQL yang sedang berjalan di mana tempatnya pg_hba.conf, atau bertanya pada sysadmin di mana tempatnya. Anda bahkan tidak bisa mengandalkan bertanya di mana datadir berada dan parsing postgresql.confkarena skrip init mungkin melewati param seperti -c hba_file=/some/other/pathketika memulai Pg.

Yang ingin Anda lakukan adalah bertanya pada PostgreSQL:

SHOW hba_file;

Perintah ini harus dijalankan pada sesi pengguna super, jadi untuk skrip shell Anda dapat menulis sesuatu seperti:

psql -t -P format=unaligned -c 'show hba_file';

dan mengatur variabel lingkungan PGUSER, PGDATABASEdll untuk memastikan bahwa koneksi yang tepat.

Ya, ini agak masalah ayam dan telur, karena jika pengguna tidak dapat terhubung (katakanlah, setelah mengacaukan pengeditan pg_hba.conf), Anda tidak dapat menemukannya pg_hba.confuntuk memperbaikinya.

Pilihan lain adalah untuk melihat psoutput perintah dan melihat apakah argumen direktori data postmaster -Dterlihat di sana, misalnya

ps aux  | grep 'postgres *-D'

karena pg_hba.confakan berada di dalam direktori data (kecuali Anda berada di Debian / Ubuntu atau turunan dan menggunakan paket mereka).

Jika Anda menargetkan secara khusus sistem Ubuntu dengan PostgreSQL terinstal dari paket Debian / Ubuntu, itu akan menjadi sedikit lebih mudah. Anda tidak harus berurusan dengan Pg yang dikompilasi dengan tangan dari sumber yang initdbda datadir seseorang di dir rumah mereka, atau instal EnterpriseDB Pg di / opt, dll. Anda dapat bertanya pg_wrapper, Pg multi-versi Debian / Ubuntu multi-versi manajer, di mana PostgreSQL menggunakan satu pg_lsclustersperintah dari pg_wrapper.

Jika Anda tidak dapat terhubung (Pg tidak berjalan, atau Anda perlu mengedit pg_hba.confuntuk menghubungkan) Anda harus mencari pg_hba.conffile dari sistem . Di Mac dan Linux sesuatu seperti sudo find / -type f -name pg_hba.confakan dilakukan. Kemudian periksa PG_VERSIONfile di direktori yang sama untuk memastikan itu adalah versi PostgreSQL yang tepat jika Anda memiliki lebih dari satu. (Jika pg_hba.confdalam /etc/, abaikan ini, itu adalah nama direktori induknya). Jika Anda memiliki lebih dari satu direktori data untuk versi PostgreSQL yang sama, Anda harus melihat ukuran basis data, periksa baris perintah postgres yang berjalan psuntuk melihat apakah -Dargumen direktori data cocok dengan tempat Anda mengedit, dll.

Craig Ringer
sumber
Ini mungkin tidak berlaku untuk 9.3, saya mendapatkan: psql: invalid port number: "format=unaligned"ketika saya menjalankan perintah psql itu.
jcollum
@ jcollum Tidak, hanya salah ketik. -Ptidak -p. Tetap.
Craig Ringer
Ini adalah satu-satunya jawaban yang berfungsi jika Anda menginstal lebih dari satu versi PostgreSQL.
bonh
Apakah ada harapan bagi Postges untuk membakukan ini? Itu akan banyak membantu dengan sakit kepala pemasangan ...
Scott Skiles
@ScottSkiles PostgreSQL tidak mengendalikannya, terserah paket dan distributor, yang semuanya memiliki pendapat yang kuat (dan berbeda) tentang di mana seharusnya.
Craig Ringer
21

Beginilah cara saya melakukannya:

john@host:~$ ls /etc/postgresql
9.1
john@host:~$ sudo vim /etc/postgresql/9.1/main/pg_hba.conf

Karena jalannya seperti ini: /etc/postgresql/[VERSION]/main/pg_hba.conf

ini aku
sumber
2

Saya menggunakan yang berikut ini untuk deteksi file konfigurasi:

$(ls /etc/postgresql/*/main/pg_hba.conf)
$(ls /etc/postgresql/*/main/postgresql.conf)
radeklos
sumber
1

Mengedit yang benar pg_hba.confdengan editor visual default Anda (vim, emacs, nano, joe, dll.) Semudah:

$VISUAL /etc/postgresql/$(ls /etc/postgresql)/main/pg_hba.conf

christianbundy
sumber
-2

Untuk mengetahui di mana file itu cukup ketik:

pg_lsclusters
nirvanastack
sumber
Jika Anda ingin memperbarui file pg_hba.conf kemudian keluarkan perintah berikut: $ sudo nano /etc/postgresql/9.1/main/pg_hba.conf
nirvanastack
-bash: pg_lsclusters: command not found
Mona Jalal