"chmod -x chmod"から回復する方法は? [コピー]

"chmod -x chmod"から回復する方法は? [コピー]

インターネットにアクセスできず、コンピュータを再起動できない場合は、どのように回復できますか?

chmod -x chmod

答え1

1 - プログラミング言語を使用した実装chmod

ルビー:

ruby -e 'require "fileutils"; FileUtils.chmod 0755, “chmod"'

Python:

python -c "import os;os.chmod('/bin/chmod', 0755)”

真珠:

perl -e 'chmod 0755, “chmod”'

ノード.js:

require("fs").chmod("/bin/chmod", 0755);

氏:

$ cat - > restore_chmod.c 
#include <sys/types.h>
#include <sys/stat.h>

int main () {
    chmod( "/bin/chmod", 0000755 );
}
^D

$ cc restore_chmod.c

$ ./a.out

2 - chmodを使用して別の実行可能ファイルを作成する

実行可能ファイルを作成して:

$ cat - > chmod.c 
int main () { }
^D

$ cc chmod.c

$ cat /bin/chmod > a.out

実行可能ファイルをコピーします。

$ cp cat new_chmod

$ cat chmod > new_chmod

3 - BusyBoxの起動(内部にchmodを含む)

4 - Gnu Tarの使用

特定の権限を持つアーカイブを作成し、それを使用してchmodを復元します。

$ tar --mode 0755 -cf chmod.tar /bin/chmod

$ tar xvf chmod.tar

ファイルを作成しなくても、すぐに同じことができます。

tar --mode 755 -cvf - chmod | tar xvf -

別のマシンのソケットを開き、アーカイブを作成してローカルに復元します。

$ tar --preserve-permissions -cf chmod.tar chmod

$ tar xvf chmod.tar

もう1つの可能性は、定期的にアーカイブを作成し、編集して権限を変更することです。

5 -cpio

cpioアーカイブを操作できます。を実行すると、cpio file最初の21バイトの後にファイル権限を表す3バイトが続きます。

echo chmod |
  cpio -o |
  perl -pe 's/^(.{21}).../${1}755/' |
  cpio -i -u

6 - 動的ローダー

/bin/ld.so chmod +x chmod

(実際の経路は異なる場合があります)

7 -/proc魔法(テストされていない)

ステップバイステップ:

  • inodeをキャッシュ(など)に強制するためにいくつかのことを行いattribますls -@
  • kcoreのVFS構造の確認
  • sedカーネルが認識しないまま実行ビットを変更するため、または同様の方法を使用する
  • chmod +x chmod一度実行

8 - タイムトラベル(git、まだテストされていません)

まず、他の要因の影響を受けないことを確認したいと思います。

$ mkdir sandbox
$ mv chmod sandbox/
$ cd sandbox

それでは、リポジトリを作成して返すことができるコンテンツとして表示しましょう。

$ git init
$ git add chmod
$ git commit -m '1985'

それでは、時間旅行について話しましょう。

$ rm chmod
$ git-update-index --chmod=+x chmod
$ git checkout '1985'

gitベースのソリューションはたくさんありますが、実際にシステムを使用しようとしているgitスクリプトに遭遇する可能性があることを警告する必要があります。chmod

9 - 火で火を鎮める

あるオペレーティングシステムを他のオペレーティングシステムと比較できれば良いでしょう。つまり、マシン内部でオペレーティングシステムを起動し、外部ファイルシステムへのアクセス権を付与できる場合です。残念ながら、起動するほとんどすべてのオペレーティングシステムは、Docker、コンテナ、Jailなどの一種の内部にあります。したがって、残念ながらこれは不可能です。

それともそうでしょうか?

これがEMACのソリューションです:

Ctrl+x b > *scratch* 
(set-file-modes "/bin/chmod" (string-to-number "0755" 8))
Ctrl+j

10 - ウィム

EMACソリューションの唯一の問題は、私が実際にVimタイプの人であることです。最初にこのトピックに取り組んだとき、Vimはこれを行う方法はありませんでしたが、ここ数年で誰かが宇宙を修正したので、次のことができます。

vim -c "call setfperm('chmod', 'rwxrwxrwx') | quit"

関連情報