Bagaimana cara menonaktifkan perintah terminal yang menakutkan?

82

Bagaimana Anda menonaktifkan perintah terminal yang menakutkan?

Saya menggunakan SSH untuk mengakses server Ubuntu jarak jauh tanpa akses ke server fisik. Saya pikir saya mengetik ' shutdown' ke server NoSQL yang berjalan pada OS Ubuntu, tetapi sebenarnya saya memberi tahu server Ubuntu untuk mematikan. Kemudian saya harus memberi tahu admin server apa yang saya lakukan sehingga dia bisa memulai server fisik untuk saya. Itu memalukan!

Bagaimana saya bisa mencegah hal ini terjadi lagi?

MelodiousFires
sumber
100
Ini telah dibahas panjang lebar, biasanya terkait dengan rmyang memiliki efek samping yang lebih buruk daripada shutdown. Intinya: di sini tidak ada cara untuk mencegah hal-hal buruk terjadi jika Anda tetap menjalankan perintah acak sebagai root.
Dmitry Grigoryev
5
Seperti yang dicatat orang lain tentang aliasing, melakukan hal itu dapat membuat orang "membiasakan diri dengan perintah yang bekerja dengan cara yang tidak standar." Jadi apakah itu tampak buruk bagi orang lain bahwa server NoSQL konyol menggunakan perintah ini?
bmb
Server NoSQL yang saya gunakan adalah Redis.
MelodiousFires
60
Hanya saja, jangan bekerja di bawah akun root.
alk
12
Saya berani mengatakan Anda telah mempelajari pelajarannya sehingga tidak perlu merasa perlu untuk menonaktifkan perintah apa pun lagi. Saya juga menambahkan Anda jangan membodohi GNU / Linux, Anda hanya menjadi lebih baik dari pada yang bodoh.

Jawaban:

204

Jawaban standar adalah "jangan login sebagai root". Semua perintah dijalankan sebagai root menakutkan. Jika itu bukan opsi, Anda bisa memasukkan beberapa perintah alias ke dalam .bashrcuntuk menonaktifkan perintah yang menurut Anda menakutkan. Sebagai contoh:

for scary in shutdown halt  reboot rm
do
    alias $scary="echo If you really want to do that, type: `which $scary`"
done

Kemudian, jika Anda mengetik shutdown Anda akan mendapatkan pesan berikut:

If you really want to do that, type: /sbin/shutdown

( Pastikan Anda .bashrctelah memuat lebih dulu, sebelum Anda mencoba ini di server produksi)

Keluar dari sshsesi Anda saat ini dan masuk lagi, atau menggunakan . ~/.bashrcharus memuat / menjalankan .bashrc. Mungkin mencoba menjalankan rmtanpa argumen untuk memastikan server Anda tidak dinonaktifkan secara otomatis memuat .bashrclogin atau sejenisnya.

Perhatikan bahwa jika Anda terutama khawatir dengan penghentian dan penghentian, Anda dapat mempertimbangkan memasang molly-guard , yang akan membuat Anda mengetikkan nama host sebelum mematikan mesin. Ini lebih berguna jika Anda secara teratur mematikan seluruh OS pada baris perintah, tetapi ingin memastikan Anda mematikan yang benar.

Anda juga dapat menguji coba ini dengan perintah yang kurang menakutkan seperti keluar atau keluar.

gmatht
sumber
70
jangan login sebagai root : ini tidak akan membantu jika Anda membingungkan mesin yang Anda masuki. Saya sarankan mengubah prompt untuk sesuatu yang akan memberi Anda isyarat visual.
isanae
145
Mengasingkan perintah "menakutkan" untuk memiliki perilaku "aman", menurut pengalaman saya, adalah ide yang buruk. Ini karena orang cenderung membiasakan diri dengan perintah yang bekerja dengan cara yang tidak standar yang dapat membuat mereka melakukan beberapa hal yang sangat disesalkan ketika mereka menggunakan sistem vanilla. Jawaban sederhana adalah menginjak dengan sangat hati-hati saat login sebagai root.
TimGJ
22
@ isanae Pintasan yang saya gunakan untuk membuka terminal dengan ssh ke server produksi akan membuat latar belakang terminal menyala merah. Itu membuat saya memperhatikan.
Peter - Pasang kembali Monica
6
sourceadalah alias untuk .dan tidak didukung oleh semua shell.
gronostaj
4
Perhatikan juga bahwa sementara Debian dan, dengan ekstensi, Ubuntu memiliki ~/.bash_profilesumber defaullt .bashrc, yang bukan perilaku standar dan pada kebanyakan sistem, .bashrctidak dibaca ketika masuk melalui ssh, jadi ini tidak akan membuat perbedaan di sana. Jauh lebih baik untuk menambahkan alias ~/.profileatau ~/.bash_profilesebaliknya.
terdon
73

sudoada karena suatu alasan - gunakan itu. Ketika perintah Anda (dalam hal ini CLI interaktif) selesai, Anda dibuang kembali ke shell tingkat pengguna Anda, bukan shell root. Ada beberapa alasan yang layak untuk berada di shell root. (Saya terkejut bahwa ini belum merupakan jawaban ...)

Karena itu, jangan menjadi muppet yang berguna sudountuk semuanya . Pahami apa yang Anda lakukan, dan pahami mengapa hal itu / tidak memerlukan hak akses root.


Selain itu, Anda dapat membedakan prompt untuk root / shell pengguna. Ini juga membuatnya lebih jelas bahwa Anda kembali ke prompt shell dan bukan " CLI lain ". Milik saya sangat berwarna-warni, dan memiliki banyak informasi berguna (seperti nama host), yang membuatnya sangat mudah untuk mengetahui host apa yang akan dieksekusi oleh perintah, dan juga membuatnya lebih mudah untuk melihat kembali sejarah Anda dan menemukan prompt - root shell menggunakan prompt default.

PS1 saya

Ini lebih cocok untuk digunakan pada akun " Anda ", tetapi jika Anda menganggap serius keamanan / sysadminning, maka Anda tidak akan membagikan kata sandi / akun, dan Anda tidak akan duduk di shell root tanpa sepenuhnya sadar.


Seperti yang orang katakan berulang-ulang, dan berulang-ulang " aliasing perintah untuk membuat lingkungan yang aman adalah ide yang buruk ". Anda akan merasa nyaman di lingkungan yang aman, mengetik perintah 'menakutkan' di tempat yang tidak seharusnya. Lalu suatu hari Anda akan berganti pekerjaan, atau masuk ke mesin baru, dan kemudian booming " huh, saya tidak bermaksud, saya minta maaf " ...

Attie
sumber
2
Bukankah dia akan memiliki masalah yang sama dengannya sudo shutdown? Jika dia mengeksekusi di mesin yang salah, itu akan tetap menjadi bencana.
Barmar
2
@Barmar Apakah NoSQL memahami perintah sudo?
Taemyr
2
@Taemyr sudoadalah perintah shell, tidak ada hubungannya dengan database.
Barmar
4
@Barmar: Sebenarnya saya pikir OP dimaksudkan untuk mengetiknya ke dalam program cmdline NoSQL, bukan ke bash. Jadi mereka tidak akan mengetik sudo shutdown, karena saya berasumsi sudobukan perintah NoSQL. Tidak berada di shell root akan benar-benar menyelesaikan masalah itu dan menjadi ide yang sangat bagus. Jadi akan melihat prompt dengan cermat sebelum menjalankan perintah penting.
Peter Cordes
44

Paket 'molly-guard' (setidaknya pada sistem turunan Debian) akan menginstal pembungkus di sekitar shutdown, stop, poweroff, dan reboot. Jika mendeteksi bahwa terminal adalah terminal yang jauh, maka ia akan menanyakan nama host. Jika tidak cocok, maka perintah dibatalkan.

CSM
sumber
4
bagaimana dengan hal-hal lain (yang bisa dibilang lebih menakutkan) seperti rm -rf /?
marcellothearcane
9
@marcellothearcane set -umungkin membantu dengan itu dalam beberapa kasus, seperti saat menulis rm -rf /$SOME_VARIABLE_WHICH_I_THOUGHT_EXISTS_BUT_DOESNT.
Alex Hall
4
@marcellothearcane Pada apa pun yang menyerupai sistem Linux modern, kebutuhan --no-preserve-rootitulah yang tidak mungkin Anda ketikkan secara tidak sengaja.
CVn
3
siapa Molly, aku bertanya-tanya ... mungkin kucing seseorang.
the0ther
7
@ the0ther, seorang anak berusia 2 tahun, yang memicu sakelar SCRAM pada mesin dinosaurus, dua kali pada hari yang sama. Mereka orang-orang di ruangan memasang penutup di saklar. catb.org/jargon/html/M/molly-guard.html
CSM
4

Saya menerima jawaban yang sangat saya sukai, namun, jika orang lain membaca dan menginginkan jawaban yang lebih sederhana, ini milik saya.

Temukan file .bashrc dan masukkan sebagai baris terakhir:

alias shutdown=notforuse

Lalu ketika Anda mengetik shutdown Anda mendapatkan sesuatu seperti ~bash: notforuse is not a command

Ini mungkin konyol tetapi sederhana dan berhasil. Saya menghargai jawaban dengan cara yang lebih baik untuk melakukan ini!

MelodiousFires
sumber
4
Hm, saya biasa melakukan ini dengan rmmenjebak orang -alias rm='echo "You can't use rm!" #'
MD XF
52
Saya pikir ini adalah ide yang buruk, karena tiga alasan. Pertama, ini membingungkan bagi siapa saja yang memiliki akses root ke mesin. Kedua, itu melatih Anda bahwa tidak apa-apa untuk mengetik "shutdown" dan tekan enter, yang berarti Anda cenderung membuat kesalahan yang sama pada sistem selanjutnya yang Anda akses root. Ketiga, ini akan menjadi sangat membingungkan jika pernah ada perintah yang valid dipanggil notforusedi jalan.
David Richerby
5
Saya dengan @DavidRicherby untuk yang ini. Bukan ide yang bagus.
Tico
Jika Anda benar-benar ingin menggunakan alias, Anda setidaknya dapat menempatkan semua orang menakut-nakuti perintah alias dalam file, membiarkan kita katakan ~/.SaveMyReputationdan tambahkan baris sebagai terakhir Anda .bashrcgaris sebagai [ -f ~/.SaveMyReputation ] && source ~/,SaveMyReputation. Anda mungkin pada akhirnya ingin menambahkan baris tambahan echo "#Scaring command protected shell, comment the last line of .bashrc and log again to have a full working shell"di dalam file itu. Setidaknya Anda dapat membawa file alias ini ke komputer lain (seharusnya .bash_aliases, tetapi dalam kasus "usang" ini lebih baik menggunakan nama lain).
Hastur
Jika Anda akan melakukan ini, jangan terlalu membingungkan dengan menggunakan nama seperti alias shutdown=shutdown-disabled-by-an-alias. (Ini hanya membahas masalah ke-3 dan paling kecil yang ditunjukkan oleh @DavidRicherby.) Meskipun masih mungkin hanya membutuhkan waktu 2 detik untuk orang berikutnya beralih dari melihat notforuse is not a commandke menjalankan type -a shutdowndan menemukan alias, kemudian mengetik sudo \shutdownuntuk menonaktifkan ekspansi alias. (Dengan asumsi mereka telah sudoalias untuk sudo='sudo 'itu memperluas alias dalam argumen pertama).
Peter Cordes
1

Untuk shutdown( reboot, haltdan terkait): Saya memiliki salinan dengan bertanya apakah saya benar-benar yakin (dan tidak melakukan apa-apa). Saya menyimpan skrip tersebut di dalam /usr/local/sbin. Di Debian ini memiliki prioritas lain /sbin(ini adalah direktori PATH pertama).

Skrip sistem menggunakan path lengkap, jadi peretasan seperti itu mencegah saya menghentikan server jauh alih-alih mesin lokal (perilaku buruk dari Awesome WM), tetapi tidak memiliki efek tidak langsung lainnya, dan saya masih dapat menggunakannya sebagai / sbin / shutdown ketika benar-benar diperlukan .

Giacomo Catenazzi
sumber
Peretasan seperti itu hanya berfungsi jika Anda menerapkannya ke setiap komputer yang pernah Anda masuki ... yang seringkali tidak praktis, dan Anda tidak akan mengetahuinya sampai terlambat: dengan mengetikkan shutdownpada sistem kritis yang tidak memiliki peretasan Anda.
jpaugh
@ jpaugh: yeah, ini adalah retasan, dan saya menggunakannya hanya untuk server pribadi saya, tempat saya sering masuk, dan terminal tetap terbuka untuk waktu yang terlalu lama. [Catatan: Saya juga menggunakan permintaan warna yang berbeda untuk mesin pribadi saya: remote-root, remote-user, local-root, local-user]. Untuk server nyata dan mesin jarak jauh, saya menghindari root dan saya melakukan root sesedikit mungkin, dan pasti, tanpa lupa keluar dari mereka. Hanya saya menggunakan remote saya sebagai "cloud" (sebelum cloud hype, jadi ditangani dengan cara lama).
Giacomo Catenazzi
1

File Sudoers memungkinkan tingkat granularitas yang jauh lebih baik daripada hanya * 'yang diizinkan menggunakan sudo' *, khususnya Anda dapat menggunakan alias perintah untuk membuat daftar putih grup perintah yang dibatasi oleh pengguna atau grup tertentu. Saya telah bekerja dengan server jarak jauh yang dibatasi untuk akses ssh dan memungkinkan sudo tanpa kata sandi (kami memang memerlukan kunci ssh yang dilindungi kata sandi). Ada beberapa alasan bagus untuk melakukan ini, tetapi memang ada bahaya, jadi kami menggunakan alias perintah untuk memungkinkan akses tidak terbatas ke hal-hal yang perlu mereka lakukan (memulai ulang server dll) tanpa memberi mereka hak istimewa untuk hal-hal yang tidak mereka lakukan.

Ada juga sintaks untuk mengatakan 'tidak dapat menjalankan perintah ini' . Itu bisa dikerjakan, jadi itu tidak boleh digunakan sebagai langkah keamanan nyata tetapi itu akan bekerja untuk skenario yang Anda gambarkan.

Man sudoers memiliki beberapa contoh bagus tentang cara mengatur ini semua.

Tentu saja ini membutuhkan penggunaan sudo, tetapi itu harus dilakukan tanpa mengatakan.

tallus
sumber
1

Anda mungkin menjadi korban kebodohan Ubuntu baru.

Ubuntu dulu memiliki perintah normal dan klasik shutdownyang membutuhkan argumen waktu wajib.

Inilah yang terjadi di Ubuntu 12 jika saya mengetik shutdown, bahkan sebagai pengguna biasa:

$ shutdown
shutdown: time expected
Try `shutdown --help' for more information.

Kemudian

$ shutdown +100
shutdown: need to be root.

Sekarang, di sini adalah Ubuntu 16.10. Saya bukan root:

$ date ; /sbin/shutdown
Fri Jun 23 16:00:16 PDT 2017
Shutdown scheduled for Fri 2017-06-23 16:01:16 PDT, use 'shutdown -c' to   cancel.

Tanpa argumen, ia menjadwalkan penghentian selama 60 detik kemudian, dan bahkan jika Anda tidak melakukan root — hanya sebuah akun yang dibuat dengan hak istimewa admin.

Salahkan Canonical.

Kaz
sumber
6
/sbin/shutdown disediakan oleh systemd-sysvpaket secara default, jadi itu bukan kebodohan Ubuntu, itu systemdkebodohan, dan itu bukan berasal dari Ubuntu, tetapi setidaknya dari Debian, yang, pada gilirannya, tampaknya mengambil seluruh systemdgerakan dari Red Hat. Saat menyalahkan, salahkan entitas yang benar - bukan hanya entitas yang tidak Anda sukai.
Ruslan
1
@Ruslan Tidak ada orang yang mengemas omong kosong ini ke distro mereka lolos dari kesalahan kebodohan.
Kaz
0

Untuk shutdown ada molly-guard. Anda hanya perlu menginstalnya dan ketika Anda mencoba untuk mematikan melalui ssh, ia meminta Anda untuk mengetikkan nama host.

Untuk menghapus file ada solusi seperti libtrash, yang mengemulasi tempat sampah melalui LD_PRELOADperpustakaan.

Dan Anda dapat menguji file apa yang Anda ubah / hapus / ... dengan program yang mungkin . Itu keren ketika menguji sesuatu.

allo
sumber
1
Hal ini maybetampaknya rusak oleh desain: mematikan beberapa syscalls tanpa-ops akan merusak semua program non-sepele yang mengandalkan syscalls ini untuk berhasil.
Dmitry Grigoryev
-2

Coba ini: ketika Anda menggunakan shell jarak jauh, setiap kali Anda mengetikkan kunci "kembali", berhenti selama 5 detik, dengan jari Anda melayang pada tombol "kembali", dan baca kembali perintah yang akan Anda kirim. Apakah itu oke? Apakah kamu yakin

Ini sepertinya keras, tetapi, di sisi lain, kita tidak seharusnya menghabiskan banyak waktu untuk cangkang jarak jauh. Kita harus menemukan semua cara untuk mengotomatiskan pekerjaan pemeliharaan kita sehingga kita jarang, jika pernah, perlu masuk ke server jarak jauh sama sekali.

xpmatteo
sumber
Sudah mencobanya, tidak berhasil. Saya masuk shutdown, berhenti selama 5 detik, membaca kembali perintah (keras!) Dan saya yakin itu benar. Kemudian tekan enter dan perintah baru saja dijalankan. Jadi itu tidak menonaktifkan perintah menakutkan, saya khawatir. Saya akan coba dengan benda melayang jari ini, mungkin jaraknya terlalu kecil / besar.
wojciech_rak