Apa perbedaan antara sudo su - postgres dan sudo -u postgres?

36

Otentikasi rekan pengguna PostgreSQL pada soket unix secara default, di mana pengguna unix harus sama dengan pengguna PostgreSQL. Jadi orang sering menggunakan suatau sudountuk menjadipostgres superuser.

Saya sering melihat orang menggunakan konstruk seperti:

sudo su - postgres

daripada

sudo -u postgres -i

dan saya bertanya-tanya mengapa. Demikian pula, saya telah melihat:

sudo su - postgres -c psql

dari pada

sudo -u postgres psql

Tanpa terkemuka sudoyang suversi akan membuat beberapa akal jika Anda berada di platform lama tanpa sudo. Tetapi mengapa pada UNIX atau Linux yang kurang prehisoric akan Anda gunakan sudo su?

Craig Ringer
sumber
Terkait di situs saudara, DBA Stack Exchange: Beralih pengguna ke pengguna 'postgres' di macOS menghasilkan kesalahan “su: Sorry”
Basil Bourque

Jawaban:

40

Lupa sudo su

Tidak ada manfaatnya menggunakan sudo su, ini merupakan kebiasaan anakronistis sejak orang terbiasa menggunakannya su. Orang-orang mulai memasang sudodi depan ketika distro Linux berhenti mengatur kata sandi root dan membuat sudosatu-satunya cara untuk mengakses akun root. Alih-alih mengubah kebiasaan mereka, mereka hanya menggunakan sudo su. (Saya adalah salah satu dari mereka sampai relatif baru ketika menggunakan kotak dengan sudoerskonfigurasi memaksa saya untuk mengubah kebiasaan saya).

Menggunakan sudo -u

Untuk shell login, sudo -u postgres -ilebih disukai sudo su - postgres. Tidak mengharuskan pengguna memiliki akses root /etc/sudoers, mereka hanya perlu hak untuk menjadi pengguna postgres. Ini juga memungkinkan Anda menerapkan kontrol akses yang lebih baik.

Untuk eksekusi perintah

sudo -u postgres psql -c "SELECT 1"

lebih unggul dari alternatif:

sudo su - postgres -c "psql -c \"SELECT 1\""

di mana Anda tidak perlu meloloskan diri dari tanda kutip dan karakter meta shell lainnya serta keuntungan keamanan lainnya karena tidak memerlukan root. Anda mungkin tidak sengaja akan menulis:

sudo su - postgres -c psql -c "SELECT 1"

terkadang, yang tidak akan berfungsi dengan baik.

Akhirnya, lebih mudah untuk mengatur variabel lingkungan melalui sudo, mis

sudo PATH=/usr/pgsql-9.3/bin:$PATH -u postgres /usr/pgsql-9.3/bin/initdb -D /var/lib/pgsql/testcluster

dari via su. (Di sini, PATHpengaturan diperlukan agar initdbdapat menemukan postgreseksekusi yang benar ).

Begitu. Lupakan superintah yang ada. Anda tidak membutuhkannya lagi. Untuk menghentikan kebiasaan itu, tambahkan kebiasaan itu ke sesuatu yang akan mencetak kesalahan. (Namun beberapa skrip pengaturan init dan paket masih digunakan susehingga Anda tidak dapat menghapusnya).

Lihat juga:

Craig Ringer
sumber