Korkunç uçbirim komutları nasıl devre dışı bırakılır?


82

Korkutucu terminal komutlarını nasıl devre dışı bırakırsınız?

Fiziksel sunucuya erişmeden uzaktaki bir Ubuntu sunucusuna erişmek için SSH kullanıyordum. shutdownUbuntu işletim sistemi üzerinde çalışan NoSQL sunucusuna ' ' yazdığımı sanıyordum ama aslında Ubuntu sunucusuna kapatılmasını söyledim. Sonra sunucu yöneticisine ne yaptığımı söylemek zorunda kaldım, böylece benim için fiziksel sunucuyu başlatabilecekti. Bu utanç verici oldu!

Bunun tekrar olmasını nasıl önleyebilirim?


100
Bu, genellikle ondan rmdaha kötü yan etkilere sahip olan ilişkiyle ilgili olarak uzunluklarda tartışılmıştır shutdown. Alt satır: kök olarak rasgele komutlar çalıştırmaya devam ederseniz, kötü şeylerin olmasını engellemenin yolu yoktur.
Dmitry Grigoryev

5
Diğer kişilerin takma adlarıyla ilgili olarak belirttiği gibi, bunu yapmak insanların "standart olmayan bir şekilde çalışmalarını emretme alışkanlığına sahip olmalarını" sağlayabilir. Aptal NoSQL sunucusunun bu komutu kullanması başkasına kötü geliyor mu?
bmb

Kullandığım NoSQL sunucusu Redis.
MelodiousFires

60
Sadece root hesabı altında çalışmayın.
alk

12
Dersi öğrendin, bu yüzden herhangi bir komutu tekrar devre dışı bırakma gereğini duymayacaksın. Aynı zamanda seni aptal olmayan GNU / Linux’a eklemeyeceğim, aptaldan daha iyisin.

Yanıtlar:


204

Standart cevap "root olarak giriş yapma" dır. Kök olarak çalışan tüm komutlar korkutucu. Bu bir seçenek değilse, .bashrcözellikle korkutucu bulduğunuz komutları devre dışı bırakmak için bazı takma komutları kullanabilirsiniz. Örneğin:

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

Sonra kapatma yazarsanız, aşağıdaki iletiyi alırsınız:

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

( Emin olun sizin .bashrcilk yüklendikten bu çalışmadan önce bir üretim sunucusuna)

Geçerli sshoturumunuzdan çıkmak ve tekrar giriş yapmak ya da kullanmak . ~/.bashrc, .bashrc dosyasını yüklemek / çalıştırmak zorundadır. Belki de rmsunucunuzun .bashrcoturum açma veya benzeri işlemlerde otomatik olarak yükleme işlemini devre dışı bırakmadığından emin olmak için hiçbir argüman olmadan çalıştırmayı deneyin .

Öncelikle durma ve kapatma ile ilgileniyorsanız , makineyi kapatmadan önce ana makine adını yazmanızı sağlayacak molly-guard'ı kullanmayı düşünebileceğinizi unutmayın. Komut satırında tüm işletim sistemlerini düzenli olarak kapattıysanız, ancak doğru olanı kapattığınızdan emin olmak istiyorsanız bu daha kullanışlıdır.

Ayrıca bunu denemek için logout veya exit gibi daha az korkutucu bir komut kullanabilirsiniz.


70
root olarak giriş yapmayın : Bu, giriş yaptığınız makineyi karıştırırsanız size yardımcı olmaz. İstemi , size görsel bir ipucu verecek bir şeye değiştirmenizi öneririm .
isanae

145
"Korkutucu" komutlarını "güvenli" bir davranışa sahip kılmak, deneyimlerime göre kötü bir fikirdir. Bunun nedeni, insanların standart olmayan bir şekilde çalışan bir komut alma alışkanlığına sahip olma eğiliminde olmalarıdır; Basit cevap kök olarak oturum açtığınızda çok dikkatli basmaktır.
TimGJ

22
@isanae Üretim sunucusuna ssh ile bir terminal açmak için kullandığım kısayol, terminal arka planını kırmızıya çevirir. Bu bana dikkat etmemi sağladı.
Peter A. Schneider

6
source.Tüm kabuklarda takma addır ve desteklenmez.
gronostaj

4
Ayrıca, Debian ve uzantı olarak Ubuntu'nun standart davranış olmayan ve çoğu sistemde sullullt ~/.bash_profilekaynağına sahip olmasına rağmen .bashrc, .bashrcssh aracılığıyla oturum açarken okunmadığını unutmayın, bu nedenle bu orada bir fark yaratmaz. Takma adı eklemek yerine ~/.profileveya ~/.bash_profileyerine kullanmak çok daha iyidir .
terdon

73

sudobir nedenden dolayı var - kullan. Komutunuz (bu durumda etkileşimli bir CLI) tamamlandığında, bir kök kabuğuna değil, kullanıcı seviyesindeki kabuğunuza geri dönersiniz. Kök kabuğunda olmak için çok az önemli neden vardır. (Bunun zaten bir cevap olmamasına şaşırdım ...)

Bunu söyledikten sonra, her şeysudo için kullanan bir muppet olmayın . Ne yaptığınızı ve neden root yetkileri gerektirdiğini / gerektirmediğini anlayın.


Ek olarak, root / user shell için sorunuzu farklılaştırabilirsiniz. Bu aynı zamanda, " bazı diğer CLI " değil, kabuk isteminde tekrar olduğunuzun daha belirgin olmasını sağlar . Mine çok renkli ve çok sayıda yararlı bilgiye (ana bilgisayar adı gibi) sahiptir, bu da komutun hangi ana bilgisayarda çalışacağını bilmeyi çok kolaylaştırır ve ayrıca geçmişinize bakmanızı ve istemleri bulmanızı kolaylaştırır - bir kök Kabuk varsayılan istemi kullanır.

Benim PS1

Bu "kullanmak daha uygundur senin " hesabı, ancak o zaman şifreleri / hesap paylaşımı olmayacak ve tam olarak farkında olmadan bir kök kabuğu oturan olmayacak, ciddiye sysadminning / güvenlik alıyorsun eğer.


İnsanların söylediği gibi, tekrar tekrar ve tekrar tekrar " güvenli bir ortam oluşturmak için takma komutlar kötü bir fikirdir ". Güvenli ortamınızda rahat edersiniz, o 'korkutucu' komutları yazmamanız gereken yere yazın. Sonra bir gün iş değiştirecek ya da yeni bir makineye giriş yapacaksınız ve sonra " boğmaca, istemedim, özür dilerim " ...



2
Aynı problemi olmaz mıydı sudo shutdown? Yanlış makinede çalıştırırsa, yine de felaket olur.
Barmar

2
@Barmar NoSQL sudo komutunu anlıyor mu?
Taemyr

2
@Taemyr sudobir kabuk komutudur, veritabanıyla ilgisi yoktur.
Barmar

4
@Barmar: Aslında OP'nin bash değil, bir NoSQL cmdline programına yazması gerektiğini düşünüyorum. Bu yüzden yazmazlardı çünkü bir NoSQL komutu olmadığını sudo shutdownfarz ediyorum sudo. Kök kabuğunda olmamak, bu sorunu tamamen çözmüş ve çok iyi bir fikir olabilirdi. Bu yüzden önemli komutları çalıştırmadan önce istemine dikkatlice bakın.
Peter Cordes

44

'Molly-guard' paketi (en azından Debian'dan türetilmiş sistemlerde) kapatma, durma, kapanma ve yeniden başlatma etrafında bir sarıcı kuracaktır. Terminalin uzak bir terminal olduğunu tespit ederse, ana bilgisayarın adını soracaktır. Eşleşmezse, komut iptal edilir.


4
Ne gibi diğer (belki daha korkutucu) şeyleri rm -rf /?
marcellothearcane

9
@ marcellothearcane set -u, bazı durumlarda, yazarken olduğu gibi, bu konuda yardımcı olabilir rm -rf /$SOME_VARIABLE_WHICH_I_THOUGHT_EXISTS_BUT_DOESNT.
Alex Hall,

4
@ marcellothearcane Modern bir Linux sistemine benzeyen herhangi bir şeyde, yanlışlıkla yazmanız gerekmeyen bir şey hakkında --no-preserve-root.
CVn

3
kim Molly, merak ediyorum ... muhtemelen birinin kedisidir.
saat

7
@ 2, aynı gün iki kez dinozor makinesinde SCRAM düğmesini tetikleyen 2 yaşında bir çocuk. Odadaki insanlar anahtarın üzerini örttüler. catb.org/jargon/html/M/molly-guard.html
CSM

4

Çok hoşuma giden bir cevabı kabul ettim, ancak eğer başka biri okuyorsa ve daha basit bir cevap istiyorsa, işte benim.

.Bashrc dosyasını bulun ve son satırı yazın:

alias shutdown=notforuse

Sonra kapatma yazdığınızda gibi bir şey olsun ~bash: notforuse is not a command

Bu aptalca olabilir ama basit ve işe yarıyor. Ancak bunu yapmanın daha iyi yollarını içeren cevapları takdir ediyorum!


4
Hm, bunu rminsanları trol etmek için yapardım -alias rm='echo "You can't use rm!" #'
MD XF

52
Bence bu üç nedenden dolayı kötü bir fikir. İlk olarak, makineye kök erişimi olan herkes için kafa karıştırıcı. İkincisi, size "kapatma" yazıp Enter tuşuna basmanın uygun olduğu konusunda sizi eğitiyor, bu da kök erişiminiz olan bir sonraki sistemde aynı hatayı yaptığınız anlamına geliyor. Üçüncüsü, notforuseyolda çağrılan geçerli bir komut varsa, bu son derece kafa karıştırıcı olacaktır .
David Richerby

5
Bu konuda @DavidRicherby ile birlikteyim. İyi bir fikir değil.
Tico

Takma adları gerçekten kullanmak istiyorsanız, en azından tüm bu korkutucu komut diğer adlarını bir dosyaya koyabilirsiniz ~/.SaveMyReputation, .bashrcbir satırın son satırını ekleyelim ve ekleyelim [ -f ~/.SaveMyReputation ] && source ~/,SaveMyReputation. Sonunda echo "#Scaring command protected shell, comment the last line of .bashrc and log again to have a full working shell"o dosyanın içine fazladan bir satır eklemek isteyebilirsiniz . En azından bu takma dosyayı başka bir makineye getirebilirsiniz (olması gerekir .bash_aliases, ancak bu "kullanımdan kaldırılmış" durumda başka bir ad kullanmak daha iyidir).
Hastur

Bunu yapacaksanız, gibi bir ad kullanarak daha az kafa karıştırıcı yapın alias shutdown=shutdown-disabled-by-an-alias. (Bu, @DavidRicherby'nin belirttiği en küçük ve en küçük sorunu giderir.) Bir sonraki kişinin takma adının notforuse is not a commandçalışmasını type -a shutdownve takma adını bulmasını, sonra sudo \shutdowntakma ad genişlemesini devre dışı bırakmak için yazmaya devam etmesi muhtemelen sadece 2 saniye sürecek . (Varsayarsak onlar vardı sudodiğer adı sudo='sudo 'yüzden ilk arg adlar genişler).
Peter Cordes

1

İçin shutdown( reboot, haltve ilgili): Ben gerçekten eminim (ve yine hiçbir şey yapmaz) eğer bana sor bir kopyası var. Bu tür komut dosyalarını içeride saklarım /usr/local/sbin. Debian'da bunun önceliği var /sbin(PATH'ın ilk dizini).

Sistem komut dosyaları tam yolu kullanır, bu yüzden bu tür bir kesiklik yerel bir makine yerine uzak bir sunucuyu durdurmamı engeller ( Awesome WM'den kötü bir davranış ), ancak başka dolaylı bir etkiye sahip değil ve gerçekten gerektiğinde bunları / sbin / shutdown olarak kullanabilirim .


Bu tür saldırılar, yalnızca oturum açtığınız her bilgisayara uygularsanız çalışır ... bu genellikle oldukça pratik değildir ve çok geç olmadan bunu öğrenemezsiniz: Korsanlığınız olmayanshutdown kritik bir sisteme yazarak .
jpaugh

@jpaugh: evet, bu bir hack, ve bunu sadece kişisel sunucularım için kullanıyorum, sık sık giriş yaptım ve terminaller çok uzun süre açık kalıyor. [Not: Kişisel makinelerim için de farklı renk istemleri kullanıyorum: uzak kök, uzak kullanıcı, yerel kök, yerel kullanıcı]. Gerçek sunucular ve uzak makinalar için kökten kaçınıyorum ve mümkün olduğunca az kök kullanıyorum ve bunlardan çıkmayı unutmadan elbette. Sadece uzaktan kumandalarımı "bulut" olarak kullanıyorum (bulut yutturmaca öncesinde, bu yüzden eski hallerde).
Giacomo Catenazzi

1

Sudoers dosyası, * 'sudo' * kullanmasına izin verilenden çok daha yüksek düzeyde bir ayrıntı düzeyi sağlar; özellikle, belirli bir kullanıcı veya grubun sınırlandırdığı komut gruplarının beyaz listelerini oluşturmak için komut takma adlarını kullanabilirsiniz. Ben ssh erişimi ile sınırlı ve şifre-az sudo izin (uzak parola korumalı ssh anahtarlarını gerektiriyordu) uzak sunucuları ile çalıştım. Bunu yapmanın bazı iyi nedenleri var, ancak tehlikeleri var, bu yüzden yapmadıkları şeyler için kendilerine ayrıcalıklı izinler vermeden (sunucuların yeniden başlatılması vb.) Sınırsız erişimine izin vermek için komut takma adları kullandık.

'Bu komutu çalıştıramazsınız' diyen sözdizimi de var . Etrafında çalışılabilir, bu nedenle gerçek bir güvenlik önlemi olarak kullanılmamalıdır, ancak tarif ettiğiniz senaryo için işe yarayacaktır.

Man sudoers, bunun nasıl kurulacağına dair iyi örneklere sahip.

Elbette bu sudo kullanmayı gerektirir, ancak söylemeden geçmesi gerekir.


1

Yeni bir Ubuntu aptallığına kurban olmuş olabilirsiniz.

Ubuntu, shutdownzorunlu bir zaman argümanını alan normal, klasik bir komutu kullanıyordu.

shutdownNormal bir kullanıcı olarak bile yazarsam Ubuntu 12'de olanlar :

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

Sonra

$ shutdown +100
shutdown: need to be root.

Şimdi, işte Ubuntu 16.10. Ben kök değilim:

$ 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.

Argüman olmadan, 60 saniye sonra bir kapatma zamanlar ve root olmasanız bile - yalnızca yönetici ayrıcalıklarına sahip bir hesap.

Kanonik suçla.


6
/sbin/shutdown systemd-sysvvarsayılan olarak paket tarafından sağlanır , bu yüzden Ubuntu aptallığı değildir, systemdaptallığıdır ve Ubuntu'dan gelmez, ama en azından Debian'dan gelir, ki bu da tüm systemdhareketi Red Hat'ten alır. Suçlama yaparken, doğru olanı suçlayın - yalnızca sevmediğiniz birini değil.
Ruslan

1
@Ruslan Bu saçmalığı dağınıklığıyla paketleyen hiç kimse aptallık suçundan kaçamaz.
Kaz

0

Kapatmak için molly-guard var. Sadece yüklemeniz gerekir ve ssh ile kapatmayı denediğinizde, ana bilgisayar adını yazmanız istenir.

Dosyaları silmek için libtrash gibi, bir LD_PRELOADkütüphane yoluyla bir çöp kutusu taklit eden çözümler vardır .

Ve belki de programla hangi dosyaları değiştirdiğinizi / sildiğinizi / ... test edebilirsiniz . Bir şeyi test ederken çok güzel.


1
Bu maybeşey tasarımdan kaynaklanıyor gibi gözüküyor: no-op'larla bazı sistem çağrılarını bastırmak, başarılı olmak için bu sistemlere dayanan önemsiz olmayan herhangi bir programı çökertecek.
Dmitry Grigoryev

-2

Bunu deneyin: Uzak bir kabuğun üzerindeyken, "return" tuşunu yazmak üzereyken, 5 saniye durun, parmağınızı "return" tuşunu basılı tutun ve göndermek üzere olduğunuz komutu tekrar okuyun. Tamam mı? Emin misiniz?

Bu zor görünüyor, ancak diğer taraftan, uzak mermilere çok fazla zaman harcamamalıyız. Bakım çalışmalarımızı otomatikleştirmenin tüm yollarını bulmalıyız, böylece nadiren de olsa uzaktaki bir sunucuya giriş yapmamız gerekir.


Denedim, çalışmıyor. Girdiğim shutdown, 5 saniye durdu, (yüksek sesle!) Komutu tekrar okumak ve bunu doğru eminim. Ardından enter tuşuna basın ve sadece komut çalıştırıldı. Bu korkutucu komutları etkisiz hale getirmedi, korkarım. Bu parmak gezdirme olayını deneyeceğim, belki mesafe çok küçük / büyüktü.
wojciech_rak
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.