怖い端末コマンドを無効にする方法は?


82

恐ろしい端末コマンドを無効にするにはどうすればよいですか?

SSHを使用して、物理サーバーにアクセスせずにリモートUbuntuサーバーにアクセスしていました。shutdownUbuntu OSで実行されているNoSQLサーバーに「」と入力していると思いましたが、実際にはUbuntuサーバーにシャットダウンするように指示しました。その後、彼が私のために物理サーバーを起動できるように、サーバー管理者に何をしたかを伝えなければなりませんでした。それは恥ずかしかった!

これが再び起こらないようにするにはどうすればよいですか?


100
これは長さについて議論されてきましたが、通常は、rmどの副作用と比べて副作用が悪化しshutdownます。結論:ランダムコマンドをルートとして実行し続けると、悪いことを防ぐ方法はありません。
ドミトリーグリゴリエフ

5
他の人々がエイリアシングに関して指摘したように、そうすることで人々を「非標準的な方法で動作するコマンドの習慣に陥らせる」ことができます。だから、愚かなNoSQLサーバーがこのコマンドを使用するのは他の人には悪いように思えますか?
bmb

私が使用していたNoSQLサーバーはRedisです。
MelodiousFires

60
rootアカウントでは動作しません。
alk

12
レッスンを学んだので、コマンドを再び無効にする必要性を感じる必要はありません。また、あなたは愚か者GNU / Linuxではなく、愚か者よりも良くなると付け加えます。

回答:


204

標準的な答えは「rootとしてログインしない」です。ルートとして実行されるすべてのコマンドは怖いです。それがオプションでない場合は、.bashrc特に怖いコマンドを無効にするためにいくつかのエイリアスコマンドを入れることができます。例えば:

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

次に、shutdownと入力すると、次のメッセージが表示されます。

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

(本番サーバーでこれを試す前に、最初にロードしたことを確認してください).bashrc

現在のsshセッションを終了して再度ログインするか、使用して. ~/.bashrc.bashrcをロード/実行する必要があります。おそらくrm引数なしで実行して.bashrc、ログインなどでサーバーが自動的に読み込まれないようにしないでください。

主に停止とシャットダウンに関心がある場合は、molly-guardのインストールを検討してください。これにより、マシンをシャットダウンする前にホスト名を入力することができます。これは、コマンドラインでOS全体を定期的にシャットダウンするが、正しいOSを確実にシャットダウンしたい場合に便利です。

また、ログアウトや終了など、それほど怖くないコマンドでテストしてみることもできます。


70
rootとしてログインしないでください。これは、ログインしているマシンを混乱させている場合には役に立ちません。プロンプトを視覚的な手がかりになるようなものに変更することをお勧めします
-isanae

145
私の経験では、「怖い」コマンドを「安全な」動作にエイリアスすることは悪い考えです。これは、人々が非標準的な方法で作業するコマンドの習慣を身に付け、バニラシステム上で非常に残念なことをする傾向があるためです。簡単な答えは、rootとしてログインするときに非常に慎重に進むことです。
TimGJ

22
@isanae本番サーバーへのsshでターミナルを開くために使用したショートカットは、ターミナルの背景を明るい赤にします。それで私は注意を払った。
ピーターA.シュナイダー

6
sourceのエイリアスで.あり、すべてのシェルでサポートされているわけではありません。
グロノスタジ

4
また、Debianおよび拡張機能により、Ubuntuにはdefaullt ~/.bash_profilesource がありますが.bashrc、これは標準の動作で.bashrcはなく、ほとんどのシステムではssh経由でログインするときに読み取られないため、違いはありません。~/.profileまたは、~/.bash_profile代わりにエイリアスを追加することをお勧めします。
テルドン

73

sudo理由のために存在する-それを使用してください。コマンド(この場合は対話型CLI)が終了すると、ルートシェルではなく、ユーザーレベルのシェルにダンプされます。ルートシェルを使用する正当な理由はほとんどありません。(私はこれがすでに答えではないことに驚いています...)

使用していますマペットてはいけない、と言ったsudoためにすべてのもの。あなたが何をしているかを理解し、それがルート権限を必要とする/必要としない理由を理解してください。


さらに、ルート/ユーザーシェルのプロンプトを区別できます。これにより、「他のCLI」ではなく、シェルプロンプトに戻っていることがより明確になります。私は非常にカラフルで、多くの有用な情報(ホスト名など)を持っています。これにより、コマンドが実行されるホストを非常に簡単に知ることができ、履歴を振り返ってプロンプトを見つけるのも簡単になります-ルートシェルはデフォルトのプロンプトを使用します。

私のPS1

これは " your "アカウントでの使用に適していますが、セキュリティ/システム管理を真剣に考えている場合は、パスワード/アカウントを共有することはなく、完全に気付かないうちにルートシェルに座ることはありません。


人々が何度も何度も言っているように、「安全な環境を作るためにコマンドをエイリアスすることは悪い考えです」。安全な環境で快適になり、「怖い」コマンドを入力すべきではない場所に入力します。それからある日、あなたは仕事を変えるか、新しいマシンにログインして、「おっと、私はつもりはない、ごめんなさい」...



2
彼は同じ問題を抱えていsudo shutdownませんか?彼が間違ったマシンでそれを実行すると、それはまだ災害になります。
バーマー

2
@Barmar NoSQLはsudoコマンドを理解しますか?
Taemyr

2
@Taemyr sudoはシェルコマンドであり、データベースとは関係ありません。
バーマー

4
@Barmar:実際、OPはbashではなくNoSQL cmdlineプログラムに入力することを意図していたと思います。だからsudo shutdown、私sudoはNoSQLコマンドではないと思うので、彼らはタイプしなかったでしょう。ルートシェルにいないことは、その問題を完全に解決し、非常に良いアイデアでした。そのため、重要なコマンドを実行する前にプロンプ​​トを注意深く見てください。
ピーターコーデス

44

パッケージ「molly-guard」(少なくともDebian派生システム)は、シャットダウン、停止、電源オフ、および再起動の周りにラッパーをインストールします。端末がリモート端末であることを検出すると、ホスト名の入力を求められます。一致しない場合、コマンドはキャンセルされます。


4
他の(おそらくもっと恐ろしい)ものはrm -rf /どうですか?
-marcellothearcane

9
@marcellothearcane set -uは、を書くときのように、場合によってはそれを助けるかもしれませんrm -rf /$SOME_VARIABLE_WHICH_I_THOUGHT_EXISTS_BUT_DOESNT
アレックスホール

4
@marcellothearcane現代のLinuxシステムに似ているもの--no-preserve-rootについては、偶然に入力する可能性が低いものです。
CVn

3
誰がモリーだろうか...おそらく誰かの猫。
the0ther

7
@ the0ther、恐竜のマシンでSCRAMスイッチをトリガーした2歳の子供、同じ日に2回。部屋の人々は、スイッチのカバーを装備しました。 catb.org/jargon/html/M/molly-guard.html
CSM

4

私はとても気に入った答えを受け入れましたが、誰か他の人が読んでいてもっと簡単な答えが欲しいなら、ここにあります。

.bashrcファイルを見つけて、最終行として配置します。

alias shutdown=notforuse

次に、shutdownと入力すると、次のようになります ~bash: notforuse is not a command

これはばかげているかもしれませんが、単純であり、機能します。しかし、これを行うためのより良い方法で答えを感謝しています!


4
フム、私はこれを行うために使用されるrm人々を荒しする-alias rm='echo "You can't use rm!" #'
MD XF

52
3つの理由から、これは悪い考えだと思います。まず、マシンへのルートアクセス権を持っている他の人にとっては混乱を招きます。次に、「shutdown」と入力してEnterキーを押しても問題ないことをトレーニングします。これは、ルートアクセス権を持つ次のシステムで同じ間違いを犯す可能性が高いことを意味します。第三notforuseに、パスで有効なコマンドが呼び出された場合、これは非常に混乱するでしょう。
デビッドリチャービー

5
これについては@DavidRicherbyと一緒です。良い考えではありません。
ティコ

エイリアスを本当に使いたい場合は、少なくともそれらの怖いコマンドエイリアスをファイルに入れ~/.SaveMyReputation.bashrc、行の最後の行としてを追加してみましょう[ -f ~/.SaveMyReputation ] && source ~/,SaveMyReputation。最終的に、echo "#Scaring command protected shell, comment the last line of .bashrc and log again to have a full working shell"そのファイル内に余分な行を追加することができます。少なくとも、このエイリアスファイルを他のマシンに持ち込むことはできます(.bash_aliasesただし、この「非推奨」の場合は、別の名前を使用することをお勧めします)。
ハスター

これを行う場合は、などの名前を使用して混乱を少なくしますalias shutdown=shutdown-disabled-by-an-alias。(これは、@ DavidRicherbyが指摘した3番目で最も小さな問題にのみ対処します。)おそらく、次の人がエイリアスの表示notforuse is not a commandから実行type -a shutdown、検索に移り、sudo \shutdownエイリアスの展開を無効にするために入力するのに2秒しかかかりません。(それらがsudoエイリアスを持っていると仮定してsudo='sudo '、最初の引数でエイリアスを展開します)。
ピーターコーデス

1

以下のためにshutdownreboothaltおよび関連):私は、私は本当に確信している(と、それはとにかく何もしない)なら、私に尋ねるとコピーを持っています。このようなスクリプトはに保存し/usr/local/sbinます。Debianでは、これは他の優先順位があります/sbin(PATHの最初のディレクトリです)。

システムスクリプトはフルパスを使用するため、このようなハッキングにより、ローカルマシンではなくリモートサーバーを停止できなくなります(Awesome WM からの悪い動作)が、他の間接的な効果はなく、本当に必要なときに/ sbin / shutdownとして使用できます。


このようなハッキングは、ログインしたすべてのコンピューターに適用した場合にのみ機能します...これは非常に非現実的であることが多く、ハッキングのないshutdown重要なシステムに入力することで手遅れになるまで気付かないでしょう。
jpaugh

@jpaugh:ええ、それはハックです。私は頻繁にログインし、端末が長時間開いたままになっている個人用サーバーにのみ使用します。[注:私は、パーソナルマシンにも異なる色のプロンプトを使用します:リモートルート、リモートユーザー、ローカルルート、ローカルユーザー]。実サーバーとリモートマシンの場合、rootを避け、可能な限りrootになります。確かに、それらを終了することを忘れることはありません。私は自分のリモコンを「クラウド」として使用しています(クラウドの誇大広告の前に、古い方法で処理されていました)。
ジャコモカテナッツィ

1

Sudoersファイルでは、「*がsudoの使用を許可されている」*だけでなく、特に特定のユーザーまたはグループが制限されているコマンドのグループのホワイトリストを作成するために、より細かなレベルを使用できます。sshアクセスに制限され、パスワードなしのsudoを許可したリモートサーバーで作業しました(パスワードで保護されたsshキーが必要でした)。これを行うにはいくつかの正当な理由がありますが、危険があります。そのため、コマンドエイリアスを使用して、必要なこと(サーバーの再起動など)への無制限のアクセスを許可しました。

「このコマンドを実行できませと言う構文もあります。回避することができるので、実際のセキュリティ対策として使用するべきではありませんが、説明したシナリオでは機能します。

Man sudoersには、これをすべて設定する方法の良い例があります。

もちろん、これにはsudoを使用する必要がありますが、それは言うまでもありません。


1

新しいUbuntuの愚かさの犠牲になったかもしれません。

Ubuntuにshutdownは、必須の時間引数をとる通常の古典的なコマンドがありました。

ここにshutdown、通常のユーザーであってもを入力すると、Ubuntu 12で何が起こるかを示します。

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

それから

$ shutdown +100
shutdown: need to be root.

さて、ここにUbuntu 16.10があります。私はルートではありません:

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

引数なしで、60秒後にシャットダウンをスケジュールします。rootでなくても、管理者権限で作成されたアカウントのみです。

非難する。


6
/sbin/shutdown systemd-sysvデフォルトでパッケージで提供されるため、Ubuntuの愚かさsystemdではなく、愚かであり、Ubuntuからではなく、少なくともDebianからもたらされますsystemd。責めるときは、あなたが嫌い​​なものだけでなく、正しいものを責めましょう。
ルスラン

1
@Ruslanこのがらくたをディストリビューションにパッケージ化する誰も、愚かさのせいから逃れることはできません。
カズ

0

シャットダウンには、molly-guardがあります。インストールするだけで、sshでシャットダウンしようとすると、ホスト名の入力を求められます。

ファイルを削除するために、LD_PRELOADライブラリを介してごみ箱をエミュレートするlibtrashのようなソリューションがあります。

そして、多分プログラムを使用して、変更/削除/ ...しているファイルをテストできます。何かをテストするとき、それはかなりクールです。


1
このmaybeことは設計上壊れているようです:いくつかのsyscallを無操作でスタブすると、これらのsyscallに依存して成功するために重要なプログラムがクラッシュします。
ドミトリーグリゴリエフ

-2

これを試してください:リモートシェルを使用している場合は、「return」キーを入力しようとするたびに、「return」キーに指を置いて5秒間停止し、送信しようとしているコマンドを再読み取りします。大丈夫ですか?本気ですか?

これは厳しいように見えますが、一方で、リモートシェルに多くの時間を費やすべきではありません。メンテナンス作業を自動化するすべての方法を見つけて、リモートサーバーにログインする必要がほとんどないようにします。


試してみましたが、機能していません。入りshutdown、5秒間停止し、コマンドを読み直し(大声で!)、それが正しいと確信しています。次に、Enterキーを押すと、コマンドが実行されます。怖いコマンドを無効にしたわけではないので、私は恐れています。私はこの指でホバリングすることを試みます、多分距離が小さすぎる/大きすぎました。
wojciech_rak
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.