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?
rm
yang memiliki efek samping yang lebih buruk daripadashutdown
. Intinya: di sini tidak ada cara untuk mencegah hal-hal buruk terjadi jika Anda tetap menjalankan perintah acak sebagai root.Jawaban:
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
.bashrc
untuk menonaktifkan perintah yang menurut Anda menakutkan. Sebagai contoh:Kemudian, jika Anda mengetik shutdown Anda akan mendapatkan pesan berikut:
( Pastikan Anda
.bashrc
telah memuat lebih dulu, sebelum Anda mencoba ini di server produksi)Keluar dari
ssh
sesi Anda saat ini dan masuk lagi, atau menggunakan. ~/.bashrc
harus memuat / menjalankan .bashrc. Mungkin mencoba menjalankanrm
tanpa argumen untuk memastikan server Anda tidak dinonaktifkan secara otomatis memuat.bashrc
login 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.
sumber
source
adalah alias untuk.
dan tidak didukung oleh semua shell.~/.bash_profile
sumber defaullt.bashrc
, yang bukan perilaku standar dan pada kebanyakan sistem,.bashrc
tidak dibaca ketika masuk melalui ssh, jadi ini tidak akan membuat perbedaan di sana. Jauh lebih baik untuk menambahkan alias~/.profile
atau~/.bash_profile
sebaliknya.sudo
ada 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
sudo
untuk 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.
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 " ...
sumber
sudo
giliran Anda untuk mendapatkan kopi.sudo shutdown
? Jika dia mengeksekusi di mesin yang salah, itu akan tetap menjadi bencana.sudo
adalah perintah shell, tidak ada hubungannya dengan database.sudo shutdown
, karena saya berasumsisudo
bukan 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.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.
sumber
rm -rf /
?set -u
mungkin membantu dengan itu dalam beberapa kasus, seperti saat menulisrm -rf /$SOME_VARIABLE_WHICH_I_THOUGHT_EXISTS_BUT_DOESNT
.--no-preserve-root
itulah yang tidak mungkin Anda ketikkan secara tidak sengaja.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:
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!
sumber
rm
menjebak orang -alias rm='echo "You can't use rm!" #'
notforuse
di jalan.~/.SaveMyReputation
dan tambahkan baris sebagai terakhir Anda.bashrc
garis sebagai[ -f ~/.SaveMyReputation ] && source ~/,SaveMyReputation
. Anda mungkin pada akhirnya ingin menambahkan baris tambahanecho "#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).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 melihatnotforuse is not a command
ke menjalankantype -a shutdown
dan menemukan alias, kemudian mengetiksudo \shutdown
untuk menonaktifkan ekspansi alias. (Dengan asumsi mereka telahsudo
alias untuksudo='sudo '
itu memperluas alias dalam argumen pertama).Untuk
shutdown
(reboot
,halt
dan 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 .
sumber
shutdown
pada sistem kritis yang tidak memiliki peretasan Anda.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.
sumber
Anda mungkin menjadi korban kebodohan Ubuntu baru.
Ubuntu dulu memiliki perintah normal dan klasik
shutdown
yang membutuhkan argumen waktu wajib.Inilah yang terjadi di Ubuntu 12 jika saya mengetik
shutdown
, bahkan sebagai pengguna biasa:Kemudian
Sekarang, di sini adalah Ubuntu 16.10. Saya bukan root:
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.
sumber
/sbin/shutdown
disediakan olehsystemd-sysv
paket secara default, jadi itu bukan kebodohan Ubuntu, itusystemd
kebodohan, dan itu bukan berasal dari Ubuntu, tetapi setidaknya dari Debian, yang, pada gilirannya, tampaknya mengambil seluruhsystemd
gerakan dari Red Hat. Saat menyalahkan, salahkan entitas yang benar - bukan hanya entitas yang tidak Anda sukai.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_PRELOAD
perpustakaan.Dan Anda dapat menguji file apa yang Anda ubah / hapus / ... dengan program yang mungkin . Itu keren ketika menguji sesuatu.
sumber
maybe
tampaknya rusak oleh desain: mematikan beberapa syscalls tanpa-ops akan merusak semua program non-sepele yang mengandalkan syscalls ini untuk berhasil.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.
sumber
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.