Cara terbaik untuk menghapus perintah shutdown, tetapi tetap reboot

27

Saya memiliki perangkat jenis raspi di pusat data, dan baru-baru ini lemak secara tidak sengaja meraba dan menyisipkan perintah mematikan ke terminal yang salah di layar saya. Apakah ada cara untuk menyimpan shutdown -rtetapi menghapus #poweroff #shutdown -P -Hopsi?

Saya ingin menjaga shutdown -r perintah. Saya suka meletakkan timer di atasnya jika saya berhasil membekukan sistem, atau mengunci diri dengan aturan tabel ip. contohshutdown -r +10

foxtrot22
sumber

Jawaban:

39

Anda harus menggunakan distribusi Linux berbasis systemd. Dalam hal ini, Anda harus dapat menutupi target poweroff, sehingga systemd akan menolak untuk mengeksekusinya (dan mematikannya). misalnya:

systemctl mask poweroff.target

Ini membuatnya sangat mustahil untuk mematikan sistem, selain dengan me-reboot. Lihat bahwa tidak ada yang terjadi:

Demo animasi Debian9

Dalam hal ini, saklar daya virtual VM ini bahkan tidak berfungsi untuk mematikan sistem lagi. Tapi itu masih reboot dengan sangat baik.

Untuk membatalkan perubahan, tentu saja, buka kedok target. Kemudian Anda dapat mematikan sistem.

systemctl unmask poweroff.target
Michael Hampton
sumber
2
Apakah ada perintah systemd yang mencantumkan semua layanan / target / perangkat dengan deskripsi mereka (jika tersedia)? Saya baru-baru ini mulai membaca tentang ini dan ingin menjelajahi kemungkinan.
hjpotter92
1
@ hjpotter92 Jalankan systemctltanpa argumen. Ini akan mencantumkan semua unit aktif, statusnya, dan deskripsi. Tambahkan --alldan itu juga akan mencantumkan unit yang tidak aktif.
Michael Hampton
2
@ hjpotter92 Lihatlah man systemd.special.
TooTea
16

Ada beberapa cara untuk mencapai ini. Seseorang akan bekerja dengan akun biasa yang tidak memiliki hak istimewa yang akan mengharuskan menjalankan perintah dengan sudo dan memasukkan kata sandi. Kemudian Anda dapat menambahkan follwing ke / etc / sudoers (dengan menjalankan visudo):

## user is allowed to execute reboot -r only
jdoe ALL=NOPASSWD: /sbin/shutdown -r *

Juga, untuk menonaktifkan caching kredensial sudo, tambahkan berikut ini juga:

Defaults timestamp_timeout=0

Ini akan mencegah caching kredensial jika Anda memanggil perintah dengan sudo sebelumnya.

Contoh:

[root@ops ~]# su - jdoe
[jdoe@ops ~]$ sudo shutdown -c
[sudo] password for jdoe:
[jdoe@ops ~]$ sudo shutdown -r +10
Shutdown scheduled for Mon 2018-09-03 18:51:13 IDT, use 'shutdown -c' to cancel.
[jdoe@ops ~]$ sudo shutdown -H
[sudo] password for jdoe:
^[[A[jdoe@ops ~]$ sudo shutdown -c
[sudo] password for jdoe:

Perhatikan bagaimana dalam contoh di atas saya tidak perlu memasukkan kata sandi saya ketika menjalankan sudo shutdown -r +10, tetapi untuk sisanya saya diminta. Jika Anda ingin menghapus kebutuhan untuk mengetik sudo sebelum perintah ( sudo shutdown -r +10), tambahkan berikut ini ke .bash_profile atau .bashrc Anda:

alias shutdown="sudo shutdown"

Contoh:

[jdoe@ops ~]$ source ~/.bash_profile
[jdoe@ops ~]$ shutdown -r +10
Shutdown scheduled for Mon 2018-09-03 19:03:14 IDT, use 'shutdown -c' to cancel.
[jdoe@ops ~]$ shutdown -c
[sudo] password for jdoe:

Perhatikan bahwa praktik terbaik untuk bekerja dengan akun yang tidak istimewa dan meningkat dengan sudo bila diperlukan.

John Doe
sumber
1
Ini bagus, kecuali sudokonfigurasi default akan menyimpannya kredensial untuk beberapa waktu setelah doa pertama. Ini bisa nyaman ketika eksekusi perintah diulang seperti rootyang diperlukan dalam sesi pengguna. Dalam sesi seperti itu, (atau memang, jika rootshell sedang berjalan), sangat mungkin untuk melakukan transaksi perintah shutdowndan memotong cek.
Cosmic Ossifrage
Terima kasih atas masukannya. Namun, dalam kasus ini, kami mengonfigurasi shutdown -runtuk tidak meminta kata sandi saat menjalankan dengan sudo, oleh karena itu, jika ia menjalankan sudo shutdown -r ...kredensial tidak akan di-cache karena mereka tidak akan dimasukkan. Lihatlah contoh yang saya berikan di atas, Anda dapat melihat saya menjalankannya diikuti oleh sudo shutdown -Hdan saya diminta kata sandi.
John Doe
3
Memang itu dipahami. Tapi, pertimbangkan skenario di mana perintah terakhir diawali sudodan bukan NOPASSWDoperasi; mis. panggilan untuk mengedit file konfigurasi sebagai root. Dalam hal ini, kata sandi akan di-cache dan panggilan selanjutnya sudo shutdown -Hakan dilakukan. sudoCaching kata sandi perlu dinonaktifkan untuk menghindari hal ini.
Cosmic Ossifrage
2
Dalam hal ini Anda benar, +1 untuk menonaktifkan caching kata sandi. Mengedit komentar saya dengan saran. Terima kasih!
John Doe
2
Saya sebenarnya tidak suka ini sama sekali, justru karena ini bergantung pada kehadiran kata sandi sudo yang seharusnya mengingatkan pengguna untuk tidak melakukan apa pun yang seharusnya tidak mereka lakukan. Tetapi kata sandi prompt benar-benar tidak melayani tujuan ini. Ini sangat umum ditanyakan sudosehingga kita cukup mengetikkan kata sandi dan melanjutkan. Lihat di sini untuk pendekatan alternatif menggunakan sudo (yang mungkin jauh lebih baik meskipun tidak terlalu baik).
Michael Hampton
10

Ada alat yang disebut molly-guard yang mengharuskan Anda untuk menyatakan nama host mesin yang ingin Anda matikan atau reboot.

Jika Anda tidak menggunakan Debian, itu harus sepele untuk mengkompilasi ini dari sumber, mengingat bahwa program ini agak primitif.

Simon Richter
sumber
9

Untuk mencegah kesalahan, distribusi berbasis RHEL telah menyiapkan alias untuk rm, cpdan mvyang dapat sedikit lebih destruktif ketika dilakukan oleh pengguna root.

Anda dapat menambahkan milik Anda sendiri, misalnya:

#/root/.bashrc
alias poweroff='echo  "poweroff: Command disabled - THINK before you type.
  Use /usr/sbin/poweroff if you really want to drive to the DC to restore power."'
HBruijn
sumber
2
Bagaimana ini menjaga shutdown -rsementara menonaktifkan shutdown -P -H?
MSalters
3

Ganti nama shutdown yang dapat dieksekusi menjadi sesuatu yang tidak mungkin dilakukan secara tidak sengaja.

Lalu alias shutdownmenjadi(whatever) -r

Wes Groleau
sumber
1
Bisakah Anda jelaskan bagaimana cara mengganti nama executable? Bisakah itu merusak paket upgrade di masa depan?
AL
2
@ AApakah itu dapat memutus peningkatan paket di masa mendatang? Ya bisa. Bisa juga merusak hal-hal yang sudah diinstal. Secara umum, mengacaukan bagian dari instalasi OS adalah ide yang sangat buruk.
Andrew Henle
1
Setuju. Ini cukup untuk alias shutdownuntuk /sbin/shutdown -r. Mengganti nama tidak perlu; karena ekspansi alias merujuk ke jalur absolut, itu tidak tunduk pada ekspansi alias rekursif.
MSalters
Satu peringatan - saya akan berpikir bahwa 'tidak ada yang mustahil' - hanya tidak mungkin
JosephDoggie