このパズルであなたのBashスクリプティング知識をテストしてください

はい、私はITを知っています。それはFOSSです。 今週のチャレンジでは、端末のスクリーンショットを表示し、結果が期待したものと異なる理由を説明してもらいます。

もちろん、最も面白い、そして最も創造的な、チャレンジの一部は、正しい結果を得るために画面に表示されたコマンドを修正する方法を見つけることです。 先週のBash Challengeはレベル1でしたが、今回は前払いし、レベル2の問題を抱えています。

あなたは本の形でこれらの課題を(未発表の課題で)購入し、私たちをサポートすることもできます。

プレイする準備はできましたか? それで、今週の挑戦はここにあります:

rmまで生き残ったファイル

今日、私たちの説明は非常に短いです:私は1つのディレクトリに3つのファイルがあります。 rootとして、そのディレクトリでrm *を使用しました。 しかし、消極的に削除を拒否するファイルが1つあります。

 root:011# ls -ls total 12 4 -rw-r--r-- 1 root root 29 nov 21 21:25 a 4 -rw-r--r-- 1 root root 29 nov 21 21:25 b 4 -rw-r--r-- 1 root root 29 nov 21 21:23 c root:012# rm * rm: cannot remove 'c': Operation not permitted root:013# ls -ls total 4 4 -rw-r--r-- 1 root root 29 nov 21 21:23 c 

あなたの挑戦は、見つけることです:

  • 3番目のファイルが削除されなかった理由は何ですか?
  • そのファイルを実際に削除する方法

以下のコメント欄であなたの解決策を読むのを楽しみにしています!

詳細が少ない

この課題を解決するために、私は使用しました:

  • GNU Bash、バージョン4.4.5(x86_64-pc-linux-gnu)
  • Debian 4.8.7-1(amd64)
  • すべてのコマンドは、標準のDebianディストリビューションに同梱されているものです。
  • エイリアスが設定されたコマンドはありません

ソリューション

再現方法

これが、この課題を解決するために使用した生のコードです。 これを端末で実行すると、チャレンジの図に表示されているのとまったく同じ結果を再現できます(私と同じソフトウェアバージョンを使用していると仮定します)。

  # as root : cd /tmp rm -rf ItsFOSS mkdir -p ItsFOSS cd ItsFOSS date > a date > b date > c sudo chattr +ic clear ls -ls rm * ls -ls 

なにが問題だったの ?

chattrコマンドを使用して、ファイルc (i)可変 Linuxファイルシステム属性を設定しました。 あなたの正確なファイルシステムによっては、すべての属性の変更は利用できません。

しかし、ここでは、 iフラグをサポートしているext2ファイルシステムを使用しています。 そしてその男を引用すると:

  A file with the 'i' attribute cannot be modified: it cannot be deleted or renamed, no link can be created to this file and no data can be written to the file. Only the superuser or a process possessing the CAP_LINUX_IMMUTABLE capability can set or clear this attribute. 

だから基本的にchattr +i後、このフラグをクリアするまでファイルはロックされます。 属性がファイルシステムに格納されていることに注意してください。 それは再起動とファイルシステムのアンマウント/マウントサイクルに耐えます。

それを修正するには?

まず、 lsattrコマンドを使用して上記の説明を確認できます。

 root:014# lsattr c ----i-------------- c 

明らかに、 (i)可変フラグが設定されています。 そのため、そのファイルを削除する(または変更を加える)には、まずそのフラグをクリアする必要があります。 その後は、いつもどおりファイルに必要なことをすべて実行できます。

 root:015# chattr -ic root:016# lsattr c ------------------- c root:017# rm c root:018# ls -ls total 0 

chattrの存在に気付いていないのであれば、その効果はかなり不可解です。 chattr言及するchattrがあるのは、もともとext2 / chattrファイルシステムに書かれたLinux固有のコマンドです。 しかし今日のその機能のいくつかは他のファイルシステムによってサポートされています。

BSDの世界では、 chflagsと呼ばれる同様のコマンドがchflagsます。 chattrと比較したそのコマンドの穏やかな紹介はWikipedia(// ja.wikipedia.org/wiki/Chattr)でもっと読んでください。

あなたがその挑戦を楽しんだことを願っています。 もっと楽しんでください。

推奨されます

AptikとUbuntuのフレッシュインストール後にアプリとPPAを復元する
2019
新しくリリースされたLinux Kernel 4.20で活躍
2019
最近の通知AppIndicatorで通知の履歴を維持する
2019