Saya memiliki masalah berikut: Pada setiap mesin yang menjalankan Postgresql ada postgres pengguna khusus . Pengguna ini memiliki akses administratif ke server database.
Sekarang saya ingin menulis skrip Bash yang mengeksekusi perintah database dengan psql sebagai postgres pengguna (psql akan dieksekusi sebagai postgres pengguna , bukan skrip). Sejauh ini, itu tidak akan menjadi masalah: Saya hanya bisa menjalankan script sebagai postgres pengguna .
Namun, saya ingin menulis output psql ke file di direktori di mana postgres tidak memiliki akses tulis.
Bagaimana saya bisa melakukan itu?
Saya berpikir tentang mengubah EUID dalam skrip itu sendiri, namun:
- Saya tidak dapat menemukan cara untuk mengubah EUID dalam skrip Bash
- Bagaimana saya bisa mengubah EUID saat menggunakan sesuatu seperti
psql -U postgres -c "<command>" > file
?
linux
bash
permissions
shell-script
Christoph Wurm
sumber
sumber
Jawaban:
Gunakan subkulit:
(su -c 'psql -U postgres -c "<command>"' postgres) > file
Di dalam subkulit Anda dapat menjatuhkan izin untuk melakukan pekerjaan Anda, tetapi output diarahkan ke shell asli Anda yang masih memiliki izin asli Anda.
sumber
Anda mungkin ingin menggunakan trik ini:
tee(1)
adalah utilitas POSIX, jadi Anda dapat mengandalkan ketersediaannya.Atau, dengan
sudo
:sumber
sudo -u postgres psql -c '...' > file
dan edit sudoers untuk menonaktifkan prompt kata sandi untuk perintah iniAnda dapat menjalankan skrip shell dengan pengguna memiliki izin menulis yang lebih baik (seperti root), dan ketika Anda mengeluarkan data harus menulis ke folder yang dapat ditulisi oleh pengguna postgres database (seperti / tmp)
setelah penulisan data selesai, pindahkan ke direktori tempat skrip shell Anda memiliki izin untuk menulis (seperti pengguna root dapat menulis di mana saja)
sumber
Jika Anda menemukan cara-cara rumit untuk menghindari batasan keamanan, Anda sebaiknya bertanya pada diri sendiri apakah tujuan Anda benar-benar bijaksana. Saya tidak tahu apa-apa tentang postgresql - apakah Anda benar-benar harus login dengan akun admin untuk melakukan apa yang Anda coba lakukan, atau adakah cara Anda dapat memberikan izin hanya-baca untuk apa pun itu ke akun pengguna normal?
sumber
Mengapa Anda tidak melakukannya saja seperti ini
sudo su postgres -c "psql ..." >/path/to/file
:?sumber
sudo su postgres -c "echo test"
mengungkapkan bahwa perintah seperti itu tidak mencetak apa pun. Beralih ke root dengansudo -s
dan kemudian mengeksekusisu postgres -c "echo test"
melakukan tes cetak , sehingga tampaknyasudo
bahwa entah bagaimana memakan output. Saya tidak tahu mengapa, dugaan saya adalah itusudo
dansu -c
menggunakan subshell yang stdout tidak diseret ke shell saya sendiri.sudo su postgres -c "echo \$USER"
cetakanpostgres
di kotak saya.