Muat ulang tugas grup pengguna Linux tanpa keluar

348

Saat menetapkan daftar grup sekunder pengguna menggunakan:

# usermod -G <grouplist> <user>

apakah mungkin untuk memaksa tugas grup ini untuk berlaku tanpa keluar semua sesi berjalan?

Ini akan sangat berguna dalam situasi di mana sesi Layar ada dengan banyak shell yang berjalan, karena seluruh sesi pada dasarnya perlu dihancurkan untuk membuat penugasan grup berlaku.

Saya pikir saya dapat mengubah grup utama pengguna dalam menjalankan shell menggunakan newgrpperintah - apakah ada beberapa alternatif yang akan bekerja untuk grup sekunder?

Idealnya, saya ingin sesuatu yang akan berlaku di setiap shell tanpa dijalankan secara manual di setiap shell, tetapi gagal itu, mungkin beberapa cara memaksa Screen untuk menjalankan perintah yang sama di masing-masing.

Simon
sumber
Saya tahu bahwa setidaknya untuk beberapa manajer jendela / sesi dimungkinkan untuk melakukan ini sehingga sesi mengambil grup baru dan tersedia untuk setiap proses baru mulai dari menu, tombol panel atau apa pun. Saya datang ke sini sekarang mencari untuk menemukan itu lagi, jadi tidak bisa mengatakan sekarang bagaimana melakukannya, dan mungkin khusus untuk manajer jendela.
mc0e

Jawaban:

205

Peretasan yang mengerikan, tetapi Anda bisa menggunakan dua lapisan newgrpuntuk mencapai ini untuk grup tertentu:

id -g

... akan memberi Anda ID grup utama saat ini. Kami akan menyebutnya orig_groupuntuk tujuan contoh ini. Kemudian:

newgrp <new group name>

... akan mengalihkan Anda ke grup itu sebagai yang utama dan menambahkannya ke daftar grup yang dikembalikan oleh groupsatau id -G. Sekarang, selanjutnya:

newgrp <orig_group>

... akan memberi Anda sebuah shell di mana Anda dapat melihat grup baru dan yang utama adalah yang asli.

Ini mengerikan dan hanya akan membuat Anda satu grup ditambahkan pada satu waktu, tetapi itu telah membantu saya beberapa kali untuk mendapatkan grup ditambahkan tanpa keluar / dalam seluruh sesi X saya (misalnya untuk mendapatkan sekering ditambahkan sebagai grup ke pengguna) sehingga sshfs akan bekerja).

Sunting: Ini tidak mengharuskan Anda untuk mengetik kata sandi Anda, yang suakan.

Legooolas
sumber
6
Trik yang bagus, saya suka
Simon
1
Pada Fedora Aku harus melakukan newgrp $USERbukan newgrp <orig_group>. Itu berarti saya tidak perlu menemukan ID grup primer asli saya, jadi itu bahkan lebih mudah daripada solusi ini.
Richard Turner
2
Saya menemukan itu cukup untuk dilakukan newgrp <new group name>. Ini adalah Ubuntu 14.04
Edward Falk
4
@ EdwardFalk benar, tetapi Anda tidak (mungkin tidak) ingin meninggalkan grup itu sebagai yang utama ...
mimoralea
4
Perhatikan bahwa masing-masing newgrpmembuat shell baru, jadi ketika Anda harus keluar sepenuhnya dari sesi Anda, Anda harus melakukan "keluar dari pintu keluar" untuk mendapatkan semua jalan keluar (:
jwd
371

Dari dalam shell, Anda dapat mengeluarkan perintah berikut

su - $USER

id sekarang akan mencantumkan grup baru:

id
stivlo
sumber
3
Saya pikir ini pendekatan terbaik dalam banyak kasus, tetapi poster asli memang ingin memperbarui beberapa shell dalam sesi layar. Solusi ini harus dilakukan dari setiap shell.
Adrian Ratnapala
3
Trik yang bagus, berhasil!
genpfault
4
Solusi asli juga hanya akan memperbaiki satu sesi shell di layar. Saya baru saja menguji itu. Alasan solusi ini bekerja adalah karena Anda melahirkan sesi baru yang lengkap daripada mewarisi dari lingkungan asli.
Dror
4
Ini benar-benar harus menjadi jawaban yang diterima. Trik yang bagus, terima kasih!
dotancohen
2
Ini mengharuskan Anda untuk mengetik kata sandi, yang mungkin canggung / tidak diinginkan jika Anda mencoba melakukannya di banyak sesi.
Legooolas
156

Trik bagus dari tautan ini sangat bagus!

exec su -l $USER

Saya pikir saya akan mempostingnya di sini karena setiap kali saya lupa bagaimana melakukan ini, ini adalah tautan pertama yang muncul di google.

jhaagsma
sumber
14
+1 karena tidak menempatkan pengguna dalam subkulit; Anda dapat keluar / keluar seperti biasa dengan ini. Juga, jika NOPASSWD: diset di / etc / sudoers, Anda bisa menggunakan exec sudo su -l $USERuntuk menghindari diminta kata sandi.
Ivan X
21
Maklum: Anda akan diminta kata sandi sudo. Jika Anda salah, terminal Anda akan ditutup.
Tyler Collier
1
@TylerCollier Ivan memang menyebutkanNOPASSWD:
pepoluan
32

1. Mendapatkan shell dengan grup baru tanpa keluar dan masuk lagi

Jika Anda hanya menambahkan satu grup, saya menggunakan yang berikut:

exec sg <new group name> newgrp `id -gn`

Ini adalah variasi dari trik newgrp dua layer Legooolas, tetapi itu dalam satu baris dan tidak mengharuskan Anda untuk masuk secara manual ke grup utama Anda.

sgadalah newgrp tetapi menerima perintah untuk dieksekusi dengan ID grup baru. The execberarti bahwa shell baru menggantikan shell yang ada, sehingga Anda tidak perlu "logout" dua kali.

Tidak seperti menggunakan su, Anda tidak perlu mengetikkan kata sandi Anda. Itu juga tidak menyegarkan lingkungan Anda (selain menambahkan grup), jadi Anda mempertahankan direktori kerja Anda saat ini dll.

2. Menjalankan perintah di semua Layar jendela dalam satu sesi

The atperintah dalam Layar menjalankan perintah di windows apa pun yang Anda tentukan (catatan ini adalah perintah Screen, bukan perintah shell).

Anda dapat menggunakan perintah berikut untuk mengirim perintah ke semua sesi Layar yang ada:

screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"

Catat kebutuhan untuk keluar dari backtick agar iddapat dijalankan di sesi Screen, dan ^ M untuk mendapatkan Screen untuk menekan 'enter' di akhir perintah Anda.

Perhatikan juga bahwa stuffperintah layar cukup ketik teks perintah atas nama Anda. Oleh karena itu sesuatu yang aneh dapat terjadi jika salah satu jendela layar memiliki perintah setengah tertulis pada prompt perintah atau menjalankan aplikasi selain shell (misalnya emacs, atas). Jika ini masalah, saya punya beberapa ide:

  • Untuk menghilangkan perintah setengah tertulis, Anda dapat menambahkan "^ C" di awal perintah.
  • Untuk menghindari menjalankan perintah di jendela emacs, dll, Anda dapat meminta `at 'untuk memfilter judul jendela dll (dalam contoh di atas, saya menggunakan" # ", yang cocok dengan semua jendela, tetapi Anda dapat memfilter menurut judul jendela, pengguna , dll).

Untuk menjalankan perintah di jendela tertentu (diidentifikasi dengan nomor jendela), gunakan yang berikut ini:

screen -S <session_name> -p 0 -X stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"
Patrick Conheady
sumber
Mengagumkan satu liner, yang tampaknya tidak memiliki efek samping lain, terima kasih!
Cyril Duchon-Doris
17

Menggunakan newgrpperintah memecahkan masalah bagi saya:

newgrp <GroupName>

Posting blog ini memiliki penjelasan rinci.

Pavan Vegirouthu
sumber
12

Grup biasanya dicacah saat login, tidak ada cara saya tahu untuk memaksanya melakukan enumerasi grup tanpa logout dan kembali lagi.

Banyak jawaban yang dipilih di sini tampaknya menggunakan solusi yang memanggil shell baru dengan lingkungan baru (sama seperti masuk lagi). shell induk dan semua program lain yang terus berjalan umumnya tidak akan menerima keanggotaan grup baru sampai diminta kembali dari shell baru biasanya setelah logout bersih dan login.

Mister_Tom
sumber
Sejujurnya, saya cukup yakin bahwa ini tidak benar - saya telah menemukan cara untuk melakukannya sebelumnya pada kotak Linux. Namun, untuk kehidupan saya, saya tidak dapat mengingat apa perintah itu. Jika saya menemukannya, saya akan mempostingnya. Sunting: Baru saja menemukannya, saya mempostingnya sebagai jawaban.
lunchmeat317
1
Terima kasih telah menunjukkan ini, ini juga pemahaman saya. Setiap jawaban lain di sini cukup membuka shell baru, tidak peduli apakah itu menggantikan satu shell terbuka atau me-restart layar atau apa pun. Tidak ada obat mujarab untuk mengeluarkan perintah atau skrip dan membuat setiap sesi berjalan, termasuk sesi X Anda, mencerminkan keanggotaan grup baru.
scravy
12

Kamu bisa melakukan ini.

Tambahkan grup sebanyak yang Anda inginkan usermod -G. Kemudian, sebagai pengguna dengan sesi berlari, jalankan newgrp -hanya dengan argumen '-'.

Ini menginisialisasi ulang id grup ke default, tetapi juga akan mengatur grup sekunder juga. Anda dapat memverifikasi ini dengan menjalankan groupsdari sesi saat ini, sebelum dan sesudah usermoddan newgrp.

Ini harus dijalankan dari setiap sesi terbuka - Saya tidak tahu banyak tentang layar. Namun, jika mungkin untuk mengulangi semua sesi terbuka dan menjalankan newgrp, Anda harus baik. Anda tidak perlu khawatir tentang mengetahui grup atau ID grup.

Semoga beruntung untukmu.

makan siangme317
sumber
11
mencoba xterm dalam sesi X tetapi tidak berhasil
mulai
3
mencoba pada sesi di tmux dan tidak berhasil di sana juga
Michael
2
Mencoba di Amazon linux 2, itu tidak berhasil
Cyril Duchon-Doris
1
newgrp -memulai proses shell baru
Piotr Findeisen
Mengingat komentar Anda pada jawaban oleh Mister_Tom, ini, karena semua jawaban lainnya, solusinya. Jawaban Mister_Tom masih benar.
scravy
4

Untuk meringkas:

exec newgrp <newlyaddedgroupname1>
exec newgrp <newlyaddedgroupname2>
...
exec newgrp -

Menggunakan 'exec' berarti mengganti shell yang ada dengan shell baru yang dimulai dengan perintah newgrp (jadi keluar dari shell baru, log Anda keluar).

Final newgrp -diperlukan untuk mengembalikan grup primer normal Anda, sehingga file yang Anda buat nanti akan memilikinya sebagai pemilik grup mereka.

Catatan: Pertanyaan poster asli adalah bagaimana membuat grup yang baru ditambahkan terlihat dalam proses yang ada. The gpasswddan usermodperintah tidak mempengaruhi proses yang ada; grup yang baru ditambahkan (atau dihapus!) muncul di (menghilang dari) akun Anda, yaitu di file / etc / group dan / etc / gshadow, tetapi izin untuk proses yang ada tidak berubah. Untuk menghapus izin Anda harus mematikan proses yang sedang berjalan; newgrp -tidak akan membaca ulang / etc / group dan mengatur ulang daftar grup; alih-alih, sepertinya hanya menggunakan grup yang sebelumnya terkait dengan proses.

jimav
sumber
By the way, exec su - <username>dapat digunakan untuk mendapatkan shell login baru dengan kelompok yang ditetapkan, tetapi itu tidak akan berfungsi dalam skrip karena shell baru akan membaca perintah dari terminal. Anda bisa menggunakan su -c "command ..." <myusername>untuk me-restart skrip Anda, tetapi proses yang dihasilkan tidak memiliki terminal pengendali dan sehingga kesalahan akan terjadi jika editor layar atau perintah interaktif lainnya dicoba.
Jimim
Mengapa ini diturunkan? Dapatkah seseorang menjelaskan apa yang buruk tentang itu, karena itulah yang terjadi pada saya dan saya pikir saya paling menyukainya?
jasonmp85
Gah, saya memilih sebelum pengujian. newgrp -tidak tidak menggantikan "kelompok utama". Jawaban Patrick Conheady adalah yang terbaik di sini, karena ia tidak bercabang atau mengubah kelompok utama.
jasonmp85
1

Saya memiliki masalah serupa tetapi juga untuk pengguna yang tidak masuk. Restart dari nscd tidak membantu, tapi mengeksekusi perintah ini melakukan: nscd -i group. Itu harus menginstruksikan nscd (caching daemon) untuk memuat ulang file grup.

Marki555
sumber
1

Saya tidak bisa menjalankan perintah newgrp. Saya tidak yakin apakah ini tergantung pada / etc / sudoers, tetapi saya biasanya harus mengetikkan kata sandi untuk sudo, dan ini berfungsi tanpa memerlukan kata sandi saya:

[leo60228@leonix:~]$ groups
users wheel

[leo60228@leonix:~]$ sudo echo hi
[sudo] password for leo60228:
hi

[leo60228@leonix:~]$ sudo -k # reset sudo timeout

[leo60228@leonix:~]$ exec sudo -i -u $(whoami) # no password necessary

[leo60228@leonix:~]$ groups
users wheel docker
snuggles08
sumber
0

Ini berguna jika Anda punya sudodan itu bisa menyelamatkan Anda dari memasukkan kata sandi sekali lagi dalam beberapa kasus:

sudo su $USER
guaka
sumber