Jalankan skrip shell sebagai pengguna yang berbeda

42

Apa cara yang baik untuk menjalankan skrip shell sebagai pengguna yang berbeda. Saya menggunakan etsa Debian, dan saya tahu pengguna mana yang ingin saya tiru.

Jika saya melakukannya secara manual, saya akan melakukan:

su postgres
./backup_db.sh /tmp/test
exit

Karena saya ingin mengotomatiskan proses, saya perlu cara untuk menjalankan backup_db.sh sebagai postgres (mewarisi lingkungan, dll)

Terima kasih!

Wadih M.
sumber

Jawaban:

67

Untuk menjalankan skrip Anda sebagai pengguna lain sebagai satu perintah, jalankan:

/bin/su -c "/path/to/backup_db.sh /tmp/test" - postgres

Breaking it down:
 /bin/su : switch user
 -c "/path/to..." : command to run
 - : option to su, make it a login session (source profile for the user)
 postgres : user to become

Saya sarankan selalu menggunakan path lengkap dalam skrip seperti ini - Anda tidak selalu dapat menjamin bahwa Anda akan berada di direktori yang benar ketika Anda su (mungkin seseorang mengubah homedir pada Anda, siapa tahu). Saya juga selalu menggunakan path lengkap ke su (/ bin / su) karena saya paranoid. Mungkin saja seseorang dapat mengedit jalur Anda dan menyebabkan Anda menggunakan versi su yang dikompromikan.

Baumgart
sumber
Itu akan selalu mengharuskan saya mengetik kata sandi? Bagaimana mengatasinya?
zjffdu
2
Itu akan selalu mengharuskan Anda untuk mengetikkan kata sandi jika Anda menjalankan perintah sebagai pengguna non-root. Jika Anda ingin menghindari kata sandi, Anda dapat mengkonfigurasi sudo untuk memperbolehkannya. NAMUN - mengkonfigurasi sudo untuk memungkinkan pengguna menjalankan su memungkinkan mereka untuk menjadi pengguna apa pun. Saya menyarankan untuk membuat skrip untuk perintah Anda, mengatur hak akses skrip ke 700 dan dimiliki oleh root, kemudian mengkonfigurasi sudo untuk memungkinkan pengguna menjalankan skrip tunggal itu.
baumgart
Saya percaya - sementara jawaban ini mungkin bekerja untuk OP - itu tidak sepenuhnya benar. Sepengetahuan saya, menggunakan keduanya -(atau --login) bersama dengan --command, -ctidak benar-benar memulai sesi login, karena -cselalu memaksa shell non-login.
JeanMertz
1
Catatan: untuk portabilitas, - postgressakan muncul di akhir perintah. Dari halaman manual:When - is used, it must be specified before any username. For portability it is recommended to use it as last option, before any username. The other forms (-l and --login) do not have this restriction.
jonny
23

Jika target pengguna untuk menjalankan nologin shelll telah ditentukan, maka Anda dapat menggunakan opsi -s untuk menentukan shell:

/bin/su -s /bin/bash -c '/path/to/your/script' testuser

Lihat pertanyaan berikut: jalankan skrip sebagai pengguna yang memiliki shell nologin

Basil A
sumber
9

Untuk mengotomatiskan ini pada jadwal Anda bisa memasukkannya ke dalam crontab pengguna. Pekerjaan Cron tidak akan mendapatkan lingkungan penuh, tetapi mungkin lebih baik untuk meletakkan semua variabel env yang Anda butuhkan dalam skrip itu sendiri.

Untuk mengedit crontab pengguna:

sudo crontab -u postgres -e
Kyle Brandt
sumber
Bisakah Anda jelaskan lebih banyak?
saravanakumar
3

Ini harus merupakan read- setuid pada skrip shell yang informatif

Jika Anda menjalankan su dengan - usernameurutan argumen, " " itu akan membuat shell login bagi pengguna untuk memberikan lingkungan yang sama seperti pengguna. Biasanya, digunakan untuk menjalankan skrip Anda dengan lingkungan rumah Anda dengan cepat dari login yang berbeda.

nik
sumber
Ini bisa bermanfaat, jika Anda perlu melakukan serangkaian tindakan. Tetapi ingatlah bahwa sebagian besar akun layanan sistem seharusnya tidak memiliki jalur dan shell rumah yang valid.
Dan Carley
2

Coba halaman su su:

su -c script_run_as_postgres.sh - postgres

Biasanya, Anda bisa menggunakan sudo untuk memungkinkan Anda menjalankan comman itu sebagai postgres tanpa kata sandi. Butuh beberapa pengaturan di / etc / sudoers Anda.

pjz
sumber
2

Metode "su -c ..." diposting oleh orang lain adalah metode yang bagus. Untuk otomatisasi, Anda dapat menambahkan skrip ke crontab pengguna yang Anda perlukan untuk mengeksekusi.

Geoff Fritz
sumber
1

Jika pengguna sudah memiliki entri untuk sudo dan Anda tidak tahu kata sandi superuser maka Anda dapat mencoba yang berikut: Yang ini me-restart postgres yang diinisialisasi di /data/my-db/pgsql/9.6/data

sudo su - postgres -c "/usr/pgsql-9.6/bin/pg_ctl -D /data/my-db/pgsql/9.6/data -l /var/log/pgsql.log restart"
smishra
sumber
-1

Anda juga bisa menggunakan:

sudo -u postgres script_run_as_postgres.sh

Xandersoft
sumber