これは」Linuxはシェルなしで動作できますか?「しかし、他の問題に邪魔されずに殻を取り除くメカニズムにのみ焦点を当ててください。
同じシステムを考えてみましょう。 Ubuntu Linux Server LTSバージョン16には、エンドユーザー(または実際に管理者)ログインを必要とせずにsystemdサービスとして実行されるコンパイル済みバイナリで構成されたカスタムシステムがあります。
シェルを取り除くには?そうすると、どのような結果が発生しますか? Bourne Identityケースを削除してもよろしいですか?削除された/bin/sh
システムはどのくらい実行できますか?
ちなみに、この質問はいいえ人々がこれをやろうとしている理由、端末の使用、システムのセキュリティ方法、または使用できるコマンドの使用に興味があります。逃げるシェル。ここでの焦点は、シェル、除去メカニズム、および結果にあります。
ベストアンサー1
これはかなり複雑な考慮事項です。最初:
- 単一の Unix 仕様とも呼ばれる POSIX 標準は、一貫したシステムが特定の
sh
シェル言語を実装する呼び出し可能なプログラムを持つことを保証します。特定の物理システムでは、sh
実際にはZシェル、Almquistシェル、Kornシェル、Bourne Againシェルなどの実際のシェルの1つであり、通常名前で呼び出されると認識されますsh
。POSIXモード。 - 10年以上前、DebianとUbuntuコミュニティは、POSIXモードでもBourne Againシェルが提供する拡張に対するオペレーティングシステムのさまざまな部分の依存関係を排除することに熱心に取り組んでいました。インタプリタで指定されたスクリプトは、
#!/bin/sh
いわゆる話すスクリプトに依存する必要はありません。バシズム対照的に、Bashismを使用するスクリプトはBourne Againシェルをインタプリタとして明示的に宣言する必要がありますsh
。 - systemdの人々は、2011年にシステムおよびサービス管理の一部としてシェルスクリプトの使用を削除することを目標の1つにしました。
シェルを取り除く方法はやや簡単です。 1つはash
、、、、、bash
などposh
のパッケージを削除します。たとえば、パッケージ管理ツールを使用します。難しい部分は、そのうちの2つが「必須」とマークされていることですmksh
。これは、他のパッケージが明示的になくても存在すると仮定できることを意味します。これに対する依存関係を宣言し、パッケージマネージャの意図に従って意図的に削除することは簡単な作業ではなく、実際に削除することを確認するために追加のプロセスを経なければなりません。pdksh
tcsh
dash
aptitude
dash
bash
これを行うと問題が発生します。
- DebianとUbuntuの人々の仕事のおかげで、次のようなスクリプトがあります。明らかに
#!/bin/bash
スクリプトインタプリタとして宣言されました。 Bourne Again シェルが削除されると、Debian Almquist シェルが残ってもそのスクリプトは機能しません。 - Debian Almquist シェルを削除すると、POSIX 互換シェルに依存するスクリプトは実行されません。
- Debian Almquist シェルが削除されると、POSIX 互換シェルに依存するコンパイル済みプログラムは実行されなくなります。これらのプログラムは、
system()
ライブラリ関数や明示的なユーティリティ呼び出しなどのexecvpe()
操作を実行しますsh
。
したがって:
- アプリケーションが実行されない可能性があります。はい、シェルスクリプトではなくコンパイルされた言語で書かれています。これは、アプリケーションプログラマがあちこちで奇妙なシェルプロセスを素早く分岐して実行するのを防ぎません。
- システムプログラムが実行されない可能性があります。同じ理由で。
- システムプログラムは実際にはシェルスクリプトなので、実行されない可能性があります。
- 起動プロセスと終了プロセスでシェルスクリプトの削除が完了していません。多くのサービスはまだvan Smoorenburgスクリプトによって制御され、解釈されないと
rc
失敗します。sh
走るsystemctl リスト単位
説明 先頭に "LSB:" または "SYSV:" を含むすべてのサービスが機能するには、シェルインタプリタが必要です。同様に、サービスとして使用されるプログラム(またはなどrabbitmq-server
)がmysqld_safe
実際にはシェルスクリプトである場合もあります。 - 多くのヘルパープログラムとユーティリティはシェルスクリプトです。 Debian は
/lib/systemd/systemd-sysv-install
単なる例です。他のものには/usr/sbin/service
、、/usr/sbin/invoke-rc.d
も含まれます/bin/fgrep
。
- 起動プロセスと終了プロセスでシェルスクリプトの削除が完了していません。多くのサービスはまだvan Smoorenburgスクリプトによって制御され、解釈されないと
- 構造および緊急モードのブートローダは機能しません。 (Ubuntu 16のsystemdバージョンから始まります)
rescue.service
両方。emergency.service
/bin/sh
追加読書
- ダッシュ
/bin/sh
。 Ubuntu Wiki。 - ダッシュ
/bin/sh
。 Debian Wiki。 - バシズム。グレッグのウィキ。
- Shebangが/bin/bashの代わりに/bin/shを指す理由はありますか?
- レナート・ペトリング(2011-04-20)。管理者向けシステム、パート8。 0pointer.de.
- https://unix.stackexchange.com/a/233581/5132