Jalankan skrip sebagai root saat login (tidak ada pengguna sudoer, sesi shell)

8

Banyak suka /etc/profiledan ~/.profiletetapi dijalankan oleh root alih-alih pengguna melakukan login. /etc/rc.localberjalan setelah boot tetapi saya perlu menjalankan skrip sebelum login. Pengguna bukan yang sudoer.

Terima kasih!

Antonio Sánchez
sumber
Mungkin ada cara untuk melakukan ini, tetapi itu tidak akan seperti /etc/profileatau ~/.profilekarena menjalankan kode dalam skrip tersebut dilakukan oleh shell pengguna dan tunduk pada kontrol pengguna, sedangkan jika Anda tidak ingin pengguna memiliki kekuatan untuk menjalankan program seperti rootdiri mereka sendiri, maka ini harus dilakukan oleh beberapa layanan yang berjalan di luar proses pengguna. ... Mungkin membantu jika Anda dapat memberi tahu kami tujuan skrip yang ingin Anda jalankan.
Eliah Kagan
Saya perlu melakukan satu mount tertentu (--bind) untuk satu pengguna tertentu. Saya telah mencoba fstab dengan opsi pemilik dan pengguna, tetapi tidak berhasil. /etc/rc.local adalah salah satu pilihan tetapi selalu melakukan mount apakah pengguna login atau tidak. Saat ini saya telah memberikan hak sudoer untuk 'mount' kepada pengguna, tetapi ini adalah solusi dan tidak suka memberikan hak istimewa apa pun kepada pengguna standar. Saya pikir saya akan menggunakan rc.local sebagai gantinya. Terima kasih!
Antonio Sánchez
Anda bisa membuat skrip root hanya dengan mountperintah tertentu , dan memberikan hak kepada pengguna untuk menjalankan hanya skrip itu (mengonfigurasi /etc/sudoers). Perintah dengan opsi yang diberikan dapat diatur secara langsung di sudoers.
enzotib
Saya sudah mencoba cara itu. Masalahnya adalah ketika saatnya tiba untuk menjalankan 'mount' di dalam skrip, sekali lagi 'sudo' adalah wajib, karena skrip dijalankan oleh 'pengguna' dan bukan oleh 'root', jadi pada akhirnya 'mount' harus diberikan juga untuk 'pengguna' dan bukannya hanya satu aturan sudoers sekarang saya punya dua. Ini adalah pengalaman saya, jadi tolong, ingatlah bahwa saya bukan ahli dan mungkin saya telah melakukan sesuatu yang salah. Terima kasih!
Antonio Sánchez

Jawaban:

3

Hanya untuk kembali ke metode sudoers, saya pikir Anda hampir sampai sebelum Anda menyerah. Melihat komentar terakhir Anda, saya hanya ingin membahas sesuatu yang mungkin akan memperbaiki hal-hal untuk Anda:

Jika Anda menjalankan skrip sebagai root, Anda tidak perlu memanggil sudo dari dalamnya.

Saya punya skrip seperti ini:

#! /bin/bash

echo $USER
whoami

Jika saya lari, sudo ./myscriptsaya melihat rootkembali untuk keduanya. Sesi di mana skrip dijalankan adalah shell root.

Singkatnya itu berarti bahwa semua yang Anda lakukan dalam skrip Anda sudah memiliki izin root. Anda tidak perlu menelepon sudo(bukan berarti harus sakit - rootbiasanya memiliki sudoizin).

Jadi tuliskan skrip Anda, chownke rootdan chmodke 700(jadi hanya root yang dapat menjalankan, membaca, atau mengeditnya) dan kemudian cukup izinkan pengguna Anda untuk menjalankannya melalui sudoers. Itu seharusnya bekerja.

Jika tidak berfungsi, kemungkinan skrip lebih besar, bukan kerangka izin. Saya sarankan memberi pengguna sudoakses penuh (menambahkan ke grup admin adalah cara termudah) dan kemudian menjalankan skrip Anda.

Oli
sumber
2

Langkah 1. buat skrip dengan perintah bind menggunakan editor apa pun. Sebagai contoh:

sudo emacs bind_user_directories.sh

isi:

#!/bin/bash

#NOTE: this file would be placed in /usr/local/sbin/ folder as bind_user_directories.sh
#alternatively it could be placed in /etc/init.d/ ... (I guess)

### BEGIN INIT INFO
# Provides:          bind_user_directories
# Required-Start:    
# Required-Stop:     
# Should-Start:      $named
# Default-Start:     0 2 3 4 5 6 (I guess...)
# Default-Stop:      1
# Short-Description: mount --bind for a user
# Description:       runs mount --bind command for certain pre-defined directories for a specific user
### END INIT INFO

# What is this?
DESC="bind_user_directories"

# See how we were called.
case "$1" in

    start)
        log_progress_msg "bind directories for user..."
        sudo mount --bind /source/path /target/path
        log_progress_msg "done: bind directories for user"
        ;;

    stop)
        log_progress_msg "umount --bind directories for user..."
        sudo umount /target/path
        log_progress_msg "done: unbind directories for user"
        ;;

    restart)
        $0 stop
        sleep 1
        $0 start
        ;;

    *)
        #log_success_msg "Usage: bind_user_directories {start|stop|restart}"
        log_success_msg "Usage: service bind_user_directories <start|stop|restart>"
        exit 1
        ;;
esac

exit 0

Langkah 2. simpan bind_user_directories.sh dan buat itu bisa dieksekusi:

chmod a+x bind_user_directories.sh

Langkah 3. tautkan ke lokasi yang sesuai seperti / usr / local / sbin:

sudo ln -s bind_user_directories.sh /usr/local/sbin/bind_user_directories.sh

Langkah 4. buat skrip pemula:

sudo emacs /etc/init/bind_user_directories.conf

isi:

description "runs mount --bind command for certain pre-defined directories for a specific user"

start on filesystem and net-device-up IFACE!=lo

stop on runlevel [!023456]
console output
respawn
respawn limit 10 5

exec /usr/local/sbin/bind_user_directories.sh start

Jika ini berhasil untuk Anda, beri tahu saya. Anda dapat memeriksa log sistem untuk pesan setelah masuk. (Saya belum mengujinya dan saya belum pernah menerapkan hal seperti ini sebelumnya.) Jika Anda meningkatkan solusi, silakan berbagi solusi akhir Anda di sini. Terima kasih.

MountainX
sumber
Ya itu berhasil! Ini adalah alternatif yang hebat untuk mdms /etc/mdm/PostLogin/skrip di dunia Ubuntu !!
Adam Ryczkowski
Apakah Anda memiliki solusi serupa di systemd? ... Cf. askubuntu.com/questions/847930/…
Adam Ryczkowski
0

Untuk menjalankan skrip sebagai root sebelum login

  1. Anda dapat memulai skrip dengan pemula .

  2. Anda dapat menambahkan panggilan skrip ke skrip startup kdm / gdm / etc yang ada .

Contoh: Topik: FAQ: Autostart / Autorun, Menjalankan periodik .

pengguna26687
sumber
Tetapi yang dicari oleh Antonio Sánchez adalah bagaimana membuat skrip berjalan seperti root saat pengguna tertentu login .
Eliah Kagan
Script harus dijalankan secara independen, sesi adalah grafik atau shell standar. Saya telah memperbarui judul untuk berkomentar ini. Saya telah membaca sesuatu tentang Upstart, tetapi terlihat rumit untuk (tampaknya) tugas sederhana itu. Pokoknya dan sampai sekarang Pemula tampaknya menjadi satu-satunya cara untuk melakukannya. Jika Anda mengenal pemula, apakah akan sulit untuk belajar cukup untuk menyelesaikan pekerjaan ini? Terima kasih!
Antonio Sánchez