コマンドラインの安全性のトリック[終了]


34

コマンドラインとスクリプトは危険です。rm -rfで少しタイプミスをすると、あなたは怪我の世界にいます。インポートスクリプトの実行中にデータベース名の段階でprodと混同します(同じサーバー上にある場合、それは良くありませんが、起こります)。sshしたサーバー名が、いくつかのコマンドを楽しんだ後に思っていたものではないことに気付くのも同じです。あなたはHole Hawgを尊重しなければなりません。

危険なコマンドを実行する前に、いくつかの小さな儀式があります-私がいるサーバーのトリプルテイクチェックを行うなど。ここだRM安全に関する興味深い記事が

コマンドラインで安全を保つための小さな儀式、ツール、トリックは何ですか?そして、「最初にls foo *を実行し、その出力を見てからlsをrm -rfに置き換えて、rm -rf foo *などを実行しないようにする」などの客観的なことを意味します。コマンドが実行します」。


3
「初めにコマンドラインだった」を参照するための1 cryptonomicon.com/command.zip
エイブリー・ペイン

これはコミュニティWikiの質問ではありませんか?信頼できる、または完全な答えはありません。
ビルヴァイス

回答:


45

うまく機能するのは、prod / staging / testサーバーのシェルで異なる背景色を使用することです。


6
はい。また、ルート権限がある場合は、明るい悲鳴を上げる赤またはオレンジを使用します。
アダムダミコ

1
リモートマシンの端末の色をログイン時とは異なる色に自動的に設定する方法はありますか?Gnomeを使用する-これは別の質問になるはずです。
ジョナ

2
マシンのホスト名に応じてPS1変数を変更するswitchステートメントがあるだけです。
ニール

2
Windowsの人なら誰でも、壁紙にホスト情報を目立つように表示するSysinternalsのこの逸品があります。 technet.microsoft.com/en-us/sysinternals/…–
squillman

はいはいはい-私の実稼働iSeriesセッションは赤から白になり、以下を防止します。pwrdwnsys option(* IMMED)restart(* YES)
Peter T. LaComb Jr.

14

開始する前にバックアウト計画を念頭に置いてください。

  • すぐに削除するのではなく、ファイル/ディレクトリを圧縮します
  • (cisco)ルーターを「x」分で再起動するように設定し、すぐに「wr」しないでください
  • 変更するインターフェイスがシステムに入力したインターフェイスではないことを確認してください。これは、telnetで接続されたルーターインターフェイスまたはVNCで接続されたイーサネットポートです。
  • 「root」としてログインしないでください
  • バックアップを作成します。それが良いことを確認してください。別のものを作ります。
  • 「ここで何かおかしいことをしようとしていますか」と信頼する人に尋ねてください。

3
+1 cisco iosは、確実に機能するまで保存しません。くそー、すべてのOSダイアログに「使用」、「保存」、「キャンセル」があったAmigaの日を覚えています。「使用」は設定を適用するだけで、次の再起動のために保存しません。それは非常に便利でした!
オスカーデューブボーン2009年

今日のより良い解決策は、代わりにすべてのシステムの変更を無制限に元に戻すことです-そうすれば、はるかに安全です。もちろん、変更した設定によってシステムの元に戻す機能が使用できなくなった場合は、とにかくねじ込まれます。..うーん^^
オスカーデューブボーン09年

1
「5でリロード」の場合は+1。ACLの変更によりリモートルーター/スイッチからロックアウトされたときに、数回以上お尻を助けました。
グレッグワーク

最後のポイントに+1-健全性チェック。簡単に実行できます。少なくとも、発生した問題を修正するための利害関係を持つ2人のユーザーがいます;)
アシュリー

10

これらのいくつかに対するローテクのソリューションがあります。

私は次のことをやる習慣を開発しました(rootとして働くことを計画しているとき):

  • まず、通常のユーザーとしてログインし、次にを使用sudo su - rootしてルートに切り替えます。私は精神的な準備としてこれを行います。非常に危険なエリアに精神的に入り込んでおり、常に警戒して警戒する必要があることを思い出させてくれます。おもしろそうに聞こえますが、この小さな儀式だけでも、私が不注意になれないことを単に補強するだけで、私は多くの悲しみを救います。
  • 各コマンドは入力されますが、[Return]キーは押されません決して
  • いいえコマンドがされ、これまで理解せずに実行されません正確にそれが何をしますか。 それが何をするか知らずにこれをしている場合、あなたはあなたのシステムでロシアンルーレットをプレイしています。
  • [Return]キーを押すに、CLIで打ち出されたコマンドが注意深く目で調べられます。ためらい、潜在的な問題のヒントがある場合は、再度再検討されます。そのためらいが続く場合、コマンドはその行に残され、別のコンソールにAlt-F2を押してmanページなどを調べます。グラフィカルセッションの場合は、ブラウザーを起動して検索を行います。
  • 一般的なユーザーいいえ、これまで渡されていないsudo、私のシステムではないので、私はBOFHだが、準備と訓練なしで、これはサルにロードされた銃を与えるようなものですので。猿が樽を見下ろして絞るまで、最初は面白くて楽しいです...

rmを使用する場合、常にcd最初にディレクトリに移動し、次にプレフィックスを使用./してディレクトリが正しいことを確認します。つまり、

cd /usr/some/directory ; rm ./targetfile

または、ファイルの完全なパスを指定します

rm /usr/some/directory/targetfile

これはPITAですが、...申し訳ありませんが安全です。


1
apache2 reloadのような事前に選択されたコマンドのリストに対してのみsudoを提供します。それ以外の場合、ユーザーは私を通過する必要があります。お尻の痛みですが、15人でdevboxを実行するのに最適な防御策です。
アルテムルサコフスキー2009年

2
「しかし、準備と訓練なしでは、これはサルに装填された銃を与えるようなものです。猿が樽を見下ろして絞るまでは、最初は面白くて楽しいです...」 ..かなり
ややこしい

sudo suの代わりにsudo -iを使用する必要があります。通常は、sudoを使用して特定のコマンドを実行する方が少し安全です。
LapTop006 2009年

Returnキーを絶対に押さない場合、どのようにコマンドを実行しますか?
g

1
&& あなたの友だちです!cd / usr / some / directoryを実行するのではなく、rm ./targetfile cd / usr / some / directory && rm ./targetfileこの方法では、cdが失敗した場合、元のディレクトリにrm'ing targetfileを作成することはありません。ただし、フルパスrmを実行することをお勧めします。
マイクG.

10

これはWindows Powershellに固有のものです。

ポリシーとして、各サーバーのマシンprofile.ps1に以下を追加します。これにより、次のことが保証されます。

  1. 管理者のPowerShellコンソールウィンドウの背景色は濃い赤です
  2. 管理者がタイトルに追加されます
  3. 「警告:Powershellは管理者として実行されています。」というメッセージ 起動時に書き込まれます
  4. タイトルバーの先頭に「管理者:」
  5. 標準ユーティリティ(企業のシェルスクリプト、vim、infozipなど)がパスにあります。
$ currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity] :: GetCurrent())
&{
    if($ currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole] :: Administrator))
    {
        (get-host).UI.RawUI.Backgroundcolor = "DarkRed"
        クリアホスト
        write-host "警告:PowerShellは管理者として実行されています。`n"
    }

    $ utilities = $ null
    if([IntPtr] :: size * 8 -eq 64)
    {
        $ host.UI.RawUI.WindowTitle = "Windows PowerShell(x64)" 
        $ utilities = "$ {env:programfiles(x86)} \ Utilities"
    }
    他に
    {
        $ host.UI.RawUI.WindowTitle = "Windows PowerShell(x86)"
        $ utilities = "$ {env:programfiles} \ Utilities"
    }
    if((テストパス$ utilities)-and!($ env:path -match $ utilities.Replace( "\"、 "\\")))
    {
        $ env:path = "$ utilities; $ {env:path}"
    }
}

機能プロンプト
{
    if($ currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole] :: Administrator))
    {
        if(!$ host.UI.RawUI.WindowTitle.StartsWith( "管理者:"))
        {$ Host.UI.RawUI.WindowTitle = "管理者:" + $ host.UI.RawUI.WindowTitle}
    }
    'PS' + $(if($ nestedpromptlevel -ge 1){'>>'})+ '>'
}

それは素晴らしいことです。すべてのサーバーでLinuxでそのようなことを簡単に行えるといいのですが。
ジェイソンタン

1
PowerShellでは、これは$ pshome / profile.ps1(マシンプロファイル)を編集することで実行されます。Linuxで/etc/.bash_profileで同等のことをできないのはなぜですか?
ブライアンライター

2
また、$ ConfirmPreferenceを "medium"(デフォルトはhigh)に変更すると便利です。これにより、確認が求められます。
リチャード

6

上記のすべての答えに同意できますが、この非常に重要なヒントを強調する必要があります。

マルチタスクを回避するタイミングを把握します。


5

私がいるシステムのホスト名がbash(または他のシェル)プロンプトにあることを確認します。私がchrootされている場合、それが何らかの形でそこに確実に収まるようにします。

私はかつて別のライブLinuxディストリビューション内からGentooシステムをインストールrmしていて、誤ったシェルで誤ってかなり破壊的なコマンドを実行し(ATMとは何かを思い出せません-のバリアント)、ライブシステムに大量のものを引き起こしましたchroot内からのものではなく、削除されます。それ以来、私はいつもやった

export PS1="(chroot) $PS1"

chroot内で作業していたときはいつでも。


1
+1-また、プロンプトに現在の作業ディレクトリ(または深くネストされたファイルシステムで作業している場合は最後のn層)があると便利です。
ムラリSuriar

公式のGentooハンドブックは、ライブCDから新しく作成されたGentooにchrootするとき、まさにそれを示唆しています!
cd1 09年

CD1:はい。ただし、x86クイックインストールガイド(gentoo.org/doc/en/gentoo-x86-quickinstall.xml)はサポートしていません。これは当時使用していたものです。しかし、今私はそれを再帰的に行います:)
ティム

5

サーバーを変更する前に知っておくべき重要なことがいくつかあります。

  • 正しいサーバーにいることを確認してください

  • **このアクションの影響を受ける人数*に注意してください(間違いを犯したかどうか)

  • 「Enter」キーを入力する前に、元に戻す可能性に注意してください

  • このコマンドがセッション切断する可能性があるかどうかを自問してください(fwルール、不適切なシャットダウンなど)。フェイルオーバーが戻ってくることを確認してください(特にオフサイトの場合)


4

まだrmからrm -iにエイリアスしていない場合


7
いや、いや、いや、いや。これはあなたができる最悪のことの一つです。ある日、エイリアスを持たないボックスに自分自身を見つけるか、何らかの形で環境を破壊します。代わりにrm -iを使用することを学んでください。
オルレ

いや、いや、いや、いや。これをしてください。ある日、あなたは誤って間違ったことをして、自分自身を救います。頻繁に-iを行に追加して、間違ったものを削除して削除するのを忘れます。
ジェルブ09年

複数のマシンで作業する場合、私はそれをしません...新しいマシンをセットアップするまで作業することは大きな挑戦です。
slovon

ひどいのは、@ olleと@Jerubの両方が正しいということです。「安全オフ」/「安全オン」を示す、おそらく色付きのフラグをPS1に置くのは賢明でしょう
...-ikso

4

ルール1-バックアップを作成する

ルール2- 「モリーガード」ラッパーを標準コマンドに決して追加しないでください。独自のバージョンを作成してください。

ルートと(部分的な)ディレクトリツリーの色を変えるなどのプロンプトトリックは優れたヘルパーですが、繰り返しますが、それらがなくても作業できることを確認してください。


これまで聞いたことのない「モリーガード」とは何ですか?
ジェイソンタン


4

これは直感に反すると少ない「ardkoreに見えるかもしれませんが、私が持っている最高のコマンドラインの安全性のヒントは次のとおりです。GUIモードの選択肢が利用可能と実用的であれば、それを使用します

どうして?とても簡単です。通常、GUIモードには、「警告-freeblefropを鳴らそうとしています。これを実行してもよろしいですか?」という形で、安全ネットが組み込まれています。そうでなくても、それはあなたを遅くし、思考時間のためにより多くのスペースを与えます。コミットする前にオプションをより簡単にダブルチェックできます。状態の前後にスクリーンショットを作成でき、タイプミスから保護します。すべての便利で便利なもの。

恐ろしい「rm -rf」の古典的なケースでは、誤ってGUIまたはCLIから発行する方が簡単だと思いますか?

最終的に、GUIに頼ることに恥はありません。大災害を確実に防ぐことはできません。CLIの場合と同じようにGUIでもトリガーに満足することができます。しかし、それがあなた自身を救うならば、それは価値があると証明されます。


3

常識を使用し、理解できないコマンドを実行しないでください。それはすべて良いアドバイスです。rmに渡すすべての絶対パスを書き出すこと、またはsudoを介して何かを実行することに苦労したい場合は、お気軽に。その場合はsu -cをお勧めします。少なくともパスワードはキャッシュされません。パスワードを確認せずにroot権限で実行することを許可されている通常のユーザーには不安を感じるでしょう。

〜/ .bashrcに入れると、物事をもう少し安全にするためのいくつかのことができます。

alias srm='rm -i'

rmの安全な代替手段を使用できるようにする...

しかし、最終的には、いつでも失敗する可能性があります。先日、機能のないconfigureスクリプトが/ usr / binフォルダー全体を混乱させ、いくつかのことを壊してしまいました。はい、バグのあるあらゆる種類のソフトウェアの単純な「make install」は、システムを破壊する可能性があります。あなたが何をしても、あなたは決して安全ではありません。私が得ているのは、最も重要なことです:

定期的にバックアップしてください。


2
繰り返しますが、別名「rm」は絶対にしないでください。最終的には、エイリアスを持たないシステムで作業するとき、あなたはそれに夢中になります。
SilentW

非常に悪い考え。あなたがこれまでのMac OS X(多分他のプラットフォーム?)に自分自身を見つける場合srmである安全な削除
モーガン

3

rmをrm -iにエイリアスする代わりに、removeまたはsaferemoveをエイリアスに指定することをお勧めします(そして、それらを好みの削除ツールとして使用します)。その後、この設定が行われていないボックスを使用しても、損傷は発生しません。


2

彼らが何をしているかを完全に理解していない限り、あなたがオンラインで見つけたコマンドを決して実行しないようにしてください。

お使いのシステムは、ポスターのシステムとは異なる場合があり、それが怪我の世界を引き起こす可能性があります。


2

Unix / Linuxの観点からのコマンドラインの安全性のための明白なものは、rootアカウントの適切な使用です。
通常、rootとしてのrm -rfはユーザーとしてよりも危険であり、rootとしてログインするのではなく、sudoなどの組み込みのものを使用することが不可欠です。素敵なシンプルなwhoamiは、通常、統合失調症または複数の人格に役立ちます。

特に、グロブまたは正規表現が正しく一致することを確認する場合は、ファイル変更コマンドにエコーを追加します。


2

作業中のマシンへのセカンダリ接続は、プライマリセッションを強制終了したり、それをロックするようなバカなことをしたり、重い処理をしたりする場合に便利です。

そうすれば、マシンにアクセスでき、プライマリセッションを終了できます。

上記のコメントのほとんどはrmを参照していますが、私は他のコマンドでも愚かなことをしました...

ネットワークを停止するifconfig-痛い、それは修正するために物理的な存在が必要です。

スクリプトについては、通常2つのウィンドウで作業します。1つ目はスクリプトの作成に使用し、2つ目は作成中の各行をテストするために使用します。ゆっくりと慎重に進むと、コードを書くときにすべての行が期待どおりに動作することを確認でき、同じ変数を維持するように注意するなど

個人的には、rm -iなどの追加のプロンプトは本当に役立ちません。v。疲れている、ストレスがかかっているなど、ほとんどの間違いを犯します。これは、とにかくyを叩き、プロンプトを無視するときです。おそらく悪い練習。


2

bashを使用する場合、これを試してください:

TMOUT=600

あなた/root/.bashrcまたは同様の。10分後に自動的にログアウトするため、誤って開いたままにしておかしい何かを入力したルートターミナルに切り替える可能性が低くなります。

はい、sudoを使用してrootコマンドを実行する必要があることはわかっています。これは、ある日危険なプレイをすることにした場合の追加の安全策です。


2
# Allow only UPDATE and DELETE statements that specify key values
alias mysql="mysql --safe-updates"`

mysql CLIを使用する場合に使用することを強くお勧めするエイリアス。


1

lsの代わりにechoを使用して、シェルがすべてを展開した後に完全なコマンドを表示できるようにします。また、常にファイルを表す変数を二重引用符で囲み、タブやスペースが含まれる可能性のあるファイル名を使用できるようにします。


1

*可能な限り、グロブを独自の引数として使用しません。「このディレクトリ内のすべてを削除する」ことを本当に意味しているとしても、私はもっと具体的になるように努めます。rm *.php。別のディレクトリで誤って同じコマンドを履歴から実行してしまった場合の先制的なダメージコントロールです。


「cd dir; rm -rf *」ではなく、可能な限り具体的には常に「rm -rf dir」を学習しました。
slovon

1

自分のやっていることを考えさせるには、次のようなものをルートのbashrc(cshrcなど)に追加してください。

unset PATH

そうすれば、「rm」の代わりに/ bin / rmを実行する必要があります。これらの余分な文字は、あなたに考えさせるかもしれません。


OK、このコマンドをどこで実行したいのですか?which $COMMAND動作しなくなりました。
ケビンM

/ usr / bin / locate $ COMMAND?
ビルヴァイス

さらに良い、/ usr / bin / locate -r / $ COMMAND $
ビルヴァイス

1

複雑な正規表現の場合、特に「find」コマンドはエコーを前に置き、それらをファイルにキャプチャします。次に、「source」でファイルを実行する前に、自分が思っているとおりに削除/移動などしていることを確認できます。

また、正規表現で認識されなかったエッジケースを手動で追加する場合にも便利です。


1

他のいくつかの投稿の少しメタ:最初に提案された通常のecho / lsステップを使用して、コマンドが必要なファイルのセットを選択していることを確認します。

しかし、その後、シェルのコマンド履歴編集機能を使用して前のコマンドを取得し、変更する必要がある部分のみを変更します。

これらの各コマンドを個別に入力してもまったく役に立ちません...

$ ls *.bak
$ echo rm *.bak
$ rm * .bak

...誤って最後の行にスペースを入力し、すべてのファイルを削除したためです。私は常に前の行を取得し、単に「エコー」を削除します。


1

rootユーザー:
必要がない限り、rootにならないでください。
ベンダーがrootとして実行する必要があると言ったら、顧客であり、非rootとして実行したいことを伝えます。
「簡単だから」という理由で、すぐに入手できるソフトウェアパッケージがいくつありますか?

習慣:
3回見ずにremoveで '*'を使用しないでくださいls -l TargetPatternを使用する習慣を構築してから、 'rm!$'を使用するのが最善です。最大の脅威は、自分がいると思う場所にいないことです。私はほとんどしばしば「LS」などとして、「ホスト名」を入力します!

松葉杖:
標準プロンプトがとして「エイリアスのrm = 『RM -i』」などの別名が行うが、私は使用して私は頻繁に私が上だマシンを完全に制御を持っていない、たくさん助け期待するだけで、あなたのパスを設定するラッパースクリプトを、プロンプト、および「-i」を含むエイリアス

問題を見つける:
完全なパスを使用すると役立ちますが、それが不可能な場合は、より安全な場所にcdし、「&&」を使用して、検索、削除、tar、untarを行う前に「cd」が成功することを確認します。 etc:
例:cd /filesystema && tar cf - | ( cd /filesystemb && tar vxf -)
'&&'を使用すると、この場合、tarファイルがそれ自体の上に抽出されるのを防ぐことができます(ただし、この場合は 'rsync'の方が良いでしょう)

removes:
特にスクリプトの場合は、できる限り再帰的に削除しないでください。-type fおよび-name 'pattern'を使用して検索および削除します。xargsに 'nothing'を供給することを恐れてまだ生きています。


1

あなたは、オペレーティングシステムの複数のバリアントを使用する場合は、することは非常に構文の違いを認識し、あるUNIXバリアントで合理的に安全なものは、別のUNIXバリアントでは非常に危険です。

例:killall

Linux / FreeBSD / OSX-渡されたパラメーターに一致するすべてのプロセスを強制終了します。例:「killall apache」は、すべてのアパッチを殺し、他のすべてのプロセスをそのままにします。

Solaris- すべてのプロセスを強制終了ます。いいえ、本当に。manページから:killallは、shutdown(1M)によって使用され、シャットダウン手順に直接関係のないアクティブなプロセスをすべて強制終了します。


私は以前の雇用主のバックアップサーバーでそれを学んだ。夜のテープを実行している間。わあ
ビルヴァイス

1
代わりに、solarisとlinuxで動作するpkillを使用できます。
ジェイソンタン

0

の代わりに

rm foo*

つかいます

rm -i foo*

これは、少数のファイルでは実用的ですが、たとえばtarball全体ではそうではありません。エイリアスrmが邪魔になるのはそのためです。


これが-fスイッチの目的です。以前の-iスイッチを上書きします。これを.bash_profileまたは同様のシェル初期化スクリプトに入れれば、心配する必要はありません。あなたがそれをやりたいことを確かめてください、しかしそれは以前、そしてより雄弁に言われました。
ケビンM

0

最初にechoを使用してコマンドを実行するのは良い考えですが、依然としてタイプミスが発生しやすい傾向があります。

!$などの展開で使用してみてください。

echo foo*
rm -rf !$

!$は最後のコマンドの最後の単語に展開されるため、次と同等です

echo foo*
rm -rf foo*

また、最後のコマンドのすべての引数に展開される!*もあります。

本当に、あなたが望むなら、あなたはこのようにそれをすることができます

echo rm -rf foo*
!*

(bashではなくkshを使用している場合は、代わりにEsc + periodを入力して最後の単語を挿入できます。)


Esc +。bashでも動作します。
オルレ

0

次のような場合:

ls * .php
echo rm * .php
rm * .php

次のような置換演算子を使用できます。
$ ls * .php
<dir listing>

$ ^ ls ^ echo rm(前のコマンドのlsをecho rmに置き換え、コマンドラインの残りの部分を同じに保ちます)

$ ^ echo rm ^ rm(echo rmをrmだけに置き換えます。したがって、*。phpを再入力して、間違った時間にスペースを入れる必要はありません)

^ = shift-6、それをよく知らない人のために。


うん むしろ、矢印キーを使用して前の行を編集します。そうすれば、Enterキーを押したときに実行されるコマンドが何であるかを確認できます。代わりに、置換パターンを正しく取得することを盲目的に信頼しているわけではありません。
マリウスゲドミナス

たとえば、「echo rm * .php」の後、<Up> <Home> <Alt-D>を実行してから<Enter>を実行します。
マリウスゲドミナス

0

bashを使用して、PS1 = '\ u @ \ h:\ w>'を設定します。これはusername @ hostname:/ full / working / directory / path>に展開されます。他の回答で述べたように、.profileまたは.bash_profileファイルを更新できない場合は、ログインするたびに環境をセットアップすることができます。しかし、背景色を変更することは簡単に最良の答えです:-)


-1

ああ、はい。「-rf」という名前のIRCを介して誰かにファイルを送信するという古くからのトリックです。後に「rm--rf」の代わりに小さな「rm -rf」が追加され、IRCをrootとして実行しないという厳しい教訓を学ぶと、多くの笑い声が続いた。


rofl要因の+1
デビッドZ

それでは、「rm -rf」はどのようにあなたに害を与えることになっていますか?
クバンチク2009年

ファイルの実際の名前は「-rf *」ですか?
マリウスゲドミナス

-1

代わりにrm -rf <dir>put を使用する代わりに、次の-rfようにしますrm <dir> -rf。狙った後、射撃する前に安全を解除することと考えてください。そのようにして、ディレクトリ名の入力中に(またはタブ補完を使用して)E​​nterキーのスリップがあり、同様の名前のディレクトリがある場合、保護されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.