![]() |
Helloやアメリカ合衆国へようこそ! UNIXおよびLinuxフォーラム!訪問し、当社のグローバルコミュニティに参加いただきありがとうございます。
|
|
Googleのunix.com
|
|||||||
| ヒントとチュートリアル 我々のユーザからの役立つ記事。 |
その他のUNIXおよびLinuxフォーラムトピックは参考にすること
|
||||
| スレッド | スレッドスターター | フォーラム | 返信 | 最後の投稿 |
| 学習のOracle ADF :初級の物語 | アイボット | Oracleの更新情報( RSSフィード) | 0 | 2008年4月6日 05:10午前 |
| セップと魚たちの物語 | アイボット | CEPのRSSニュース | 0 | 2007年12月17日 05:50午前 |
| バンコクポスト記事: Linuxオペレーティングシステムの背後にある物語 | ネオ | ニュース、リンク、イベントのお知らせ | 0 | 2003年4月5日 09:05午前 |
|
|
LinkBack | スレッドツール | このスレッドを検索 | スレッドを評価 | 表示モード |
|
|
|
|||||
|
パート2 -の詳細
のフォーマットは、 # !ライン
私たちは、特定のためには、最初の2文字"#!".しなければならないと言うことができますまたはすることができますか。多くのシステムでは、ホワイトスペースを削除するようリードしている。私の推薦を開始することです。 # ! 。また、伝統的だ。 横にあるオプションのスペースれることがあります。いくつかのドキュメントをこの空間は限り誰でもスペースを必要とする唯一のUnixのBSD 4.1のリリースを決定することができるのスナップショットをリリースしましたが必要だという...これは一般公開)されていない。実際には、以下のような場合は、いくつかのスペースがある場合がありますが表示されます。とタブ文字をいくつかのテストを完了されており、動作しているようです。私の勧告を0または1つの空間に滞在することです。 横に通訳して、フルパスはすべてフルパスのように、それを起動する必要がありますが/ 。おっと、別の例外... Linuxカーネル(バージョン2.0.34以上)は、相対パスを受け入れてくれている。私の推薦しないとしている。 は完了することがあります。私たちは私たちの単一の引数やオプションのホワイトスペースにつながる可能性があります。ただし、 FreeBSDの複数の引数を処理の一部のバージョン。 BSDとのほとんどのバージョンのHP - UXの空白を削除するストリップされます。他のバージョンのUnixの空白を削除する有効な文字として扱う。とBSDのいくつかのバージョンでは、 #文字で区切り、末尾のコメントを受け付けることができます。 どのくらいの行することができますか? Unixのいくつかのバージョンが32文字の低い上限を設定します。 FreeBSDのどうやら8192文字を扱うことができます。 少なくとも、 Unixの標準で終わる行は、常に\ Ñ文字は、右か?うーん、そうとも限りません。 Unixの一部のバージョンを許容してしまう\研究\ Ñ終わると\研究をするのは無理だから、他のストリップだ。 このようになるが、標準ではありません... 引数が0の過程ではなく、スクリプト もう一つの方法は、実装が異なることがあります。を考慮 perlの スクリプトは、私はパート1のArの終了した。自分の殻のおおよその同等でした execl ( " 。 / perlargs " 、 " 。 / perlargs "、 " 1 " 、 " 2 " 、 " 3 " 、 (文字* )はNULL ) と、カーネルは、ほぼ同等のへと変貌 execl ( "は/ usr / local / binに/perlの" 、 "は/ usr / local / binに/perlの"、 " - w "の、 " 。 / perlargs " 、 " 1 " 、 " 2 " 、 " 3 " 、 (文字* )はNULL ) 赤で強調表示は、大会では、プログラムのパスを引数と同じですが実行されてゼロです。注目すべきは、ログインプログラムが実行されるようなもの"が設定されます- ksh "です。当初は、実行可能なシェルスクリプトではなく、通訳者の名前は、スクリプトの名前には、引数0に設定した。最近では、通訳者の名前が一般的です。最後のホールドアウトを知っている私のHP - UXのは、スクリプトの名前を引数を0にセットする。 |
|
|||||
|
パート3 -スードシェルスクリプト
最初の時に実行可能なシェルスクリプトは、スードビット光栄に導入されました。これは、災害時のセキュリティのためだった。スクリプトを呼び出しを考えては/ usr / sbin /災害。していた:
はchownルートは/ usr / sbin /災害 chmod 4755は/ usr / sbin /災害 当然のことながら、 / 、は/ usrは/ usr / sbin rootでのみ書き込み可能。また、スクリプト自体だけです: # ! / bin / shに そうだよ。このスクリプトは非表示の文字を1つのラインです。これはコメントしているがないため、他の行を終了されているシェルは無視します。このスクリプトはすでに2種類の攻撃に対して脆弱です危険です。 への攻撃1 :リンク- ı もしください: ln - sをは/ usr / sbin /災害。 / - ı シンボリックリンクと呼ばれる新たなアレンジを実行するために" - i "を。我々の場合に相当するかの/ sbin /災害、 :実際は/ usrを実行 ( " / bin / shに" 、 "は/ usr / sbin /災害" 、 "は/ usr / sbin /災害" 、 (文字* ) NULL )のexecl 問題はない。そんなことだろうと期待されています。だが、 "コピーと呼ばれる特別なリンクを実行- i "を我々は: ( " / bin / shに" 、 " - i "を、 " - i "を、 (文字* ) NULL )のexecl これは、対話型のシェルとして動作するシェルスード原因!すぐにスイッチは、シェルの設定の最後の引数として1つのハイフンを受け入れるように変更されました。だから、読んで私たちの1行のスクリプトを変更: # ! / bin / shに- 今では同じ結果になってしまうのトリック: ( " / bin / shに" 、 " - i "を、 " - " 、 " - i "を、 (文字* ) NULL )のexecl まだAugumentゼロ" - i "を、これは無害です。ので、この攻撃は、 psコマンドで顕著になると考えても、役に立つかもしれません。 攻撃2 :リンクを変更する これは説明が困難です。これまでのように、私たちは、攻撃の下にあるスクリプトへのシンボリックリンクを、この時間は、名前は関係ない。そして我々の新しいシンボリックリンクを経由してスクリプトを実行します。次に、 素早く のシンボリックリンクを変更することは、悪のスクリプトを指定します。私たちは何を変更するには、シンボリックリンクをポイントにした後、カーネルが、オープン前に、通訳が開きます。これは、競合状態であり、すべての時間は動作しません。また、巧妙なプログラミングの1つを成功させるには少し必要です。しかし、正常に完了、我々は悪のスクリプトをrootとして実行している必要があります。 スードスクリプトを無効に これは安全なスードシェルスクリプトは、シェルスクリプトスードの概念を記述することはできませんでしたUnixから削除されました。 sudoの書かれたプログラムを、この大部分スードシェルスクリプトの必要性をoviatedこの頃。私はUnixのは、過去15年間で、これらの問題のいずれかのバージョンをリリースしているとは思わない。 (そして、もし、私はこれらの攻撃がないと説明した。 )でお会いできることを願っなぜ今、多くの古い時間システム管理者(のような自分自身)は、シェルスクリプトスードに懐疑的な見方があります。スードスクリプトの戻り Solarisのスードするシェルスクリプトをサポートしていますが、これらの攻撃に免疫されています。これは、スクリプトを一度だけ、スードスクリプトの場合に開かれるようにすることでこれを行います。スードビットが設定されている場合は、 Solarisのスクリプトは、インタプリタに渡すことは、 fdファイルシステムを使用しています。私のperlargsスクリプトをSolarisにスードていたら、それを実行されているようなものだ: execl ( "は/ usr / local / binに/perlの" 、 "は/ usr / local / binに/perlの" 、 " - w "の、 " / dev/fd/3 " 、 " 1 " 、 " 2 " 、 " 3 " 、 (文字* )はNULL ) 時 perlの オープン/ dev/fd/3 、それは別のdescripter開いているファイルは同じファイルとして3 fdとして開かれているものを指し得る。は、スクリプトの中には、 / dev/fd/3よりも他の名前を取得する方法はありません注意してください。 これは、名前を使用していたintrepreterから隠していますが、何ら問題はない場合、その名前のような奇妙なものだった" - i "を。これは、スクリプトを1回開かれると、害がない場合には、邪悪なスクリプトのシンボリックリンクを突然に切り替えている。 しかし、これが最後の舞台へのコメントのみを含む1行のスクリプトを安全に実行することができます私たちを取得します。はまだ不十分スードスクリプトで書かれた他のセキュリティ問題をすることができます。スード場合は、シェルスクリプトを使用する必要があります、ここではいくつかのヒントを紹介します: 1 。使用ksh デイブのKornシェルスクリプトでは、攻撃のすべてを分析してできるだけ多くの穴を閉鎖した。特に、 ksh IFS社に攻撃をベースに免疫されています。また、対話型の場合、それが本当のUIDのルートではない、それには、 UIDを本物の前にプロンプトを発行するために効果的なUIDを設定するにはroot権限を使用すると効果的なルートのUIDを一緒に行くことができる。 2 。コントロールのPATH PATH変数を明示的に設定するスクリプトの最初のステップとして。のディレクトリのリストを作成可能な限り短い。開始しないでくださいまたはコロンでリストを終了または2つの連続するコロンしている。とすることはありません。または..一覧。明示的にエクスポートパス。とは、すべてのディレクトリパスに記載のルートだけで書き込みができることを確認します。たとえば、は/ usr / local / binには、 PATHにしては/ usr / local / binにされていない書き込みのための明白な必要性に加えて、あなたはまた、 / 、は/ usr 、を/ usr / localを確保するために必要なものすべてがあります書き込みはできません。 、それ以外のことはできませんする必要がある場合は/ usr / localにマウントされてファイルシステムのrootユーザの手配は/ usr / localマウント解除される。また、可能な限りほとんどのPATHに依存して、スクリプトを保護することができます。そのためには、たとえば、 " / usr / binに/ rm "単なる" rmむしろ"より。 注意:私は/ usr / localの例として、 / binに使用すると、私は強く抵抗するとパット/スードスクリプトのPATHにUSR社/ local / binに。再び:としてディレクトリのリストを作成して可能な限り短い。私はめったに"を超えるとのPATH \u003dは/ usr /スードスクリプト"のbin 。 3 。制御IFS社 スペース、タブを設定するIFSは、改行。輸出してIFS社。 kshは、 IFS社を攻撃する免疫中ですが、いくつかの他のシェル免疫されていません。あなたのやりたいことを間接的に別のシェルスクリプトを呼び出すことができます。 4 。は、スクリプトの書き込みではないことを確認します ファイルとしては、プロセスは、ユーザーがファイルの所有者とは異なるが所有によって書かれている上のビットが削除されますスード最近のほとんどのバージョンのUnix 。しかし、それは行動に依存することはありません。 5 。直接的または間接的にユーザを実行しないでください入力供給 あなたは、ユーザの入力は、シェルの実行可能コードとして解釈することが確実に配信する必要があります。方法を知っている場合は、このようにしないと、任意のユーザー入力を処理してはならない。は、スクリプトのパラメータをユーザの入力を考慮する必要があります注意してください。 6 。注意してプログラムを起動する場合は、ユーザからの入力を求める プログラムは、任意のプログラムを実行するためには、ユーザーを起動しないでください。たとえば、ユーザーにメッセージを表示しない 六 ファイル。 六 ユーザのためのサブを実行する方法を提供しています。はい、 kshの内蔵保護では、ユーザーが対話的に呼び出すkshはあなたを守ります。しかし、残念ながら、他のシェルが存在します。とは、ユーザーとのインタラクティブなシェルを必要としない 六。のようなコマンドを" : ! rm / etc / passwdの"より動作します 六 これは、インタラクティブなシェルを使用していません。 の手順を実行するスクリプトを書くのスードの確保に向けての長い道を行くでしょうが、私は十分に確保しているスクリプトを完全に保証することはできません。 |
|
|||||
|
パート4 :ざっぴん
デニスリッチーが発明
というコンセプトで生まれたデニスリッチー: コード:
>From dmr Thu Jan 10 04:25:49 1980 remote from research The system has been changed so that if a file being executed begins with the magic characters #! , the rest of the line is understood to be the name of an interpreter for the executed file. Previously (and in fact still) the shell did much of this job; it automatically executed itself on a text file with executable mode when the text file's name was typed as a command. Putting the facility into the system gives the following benefits. 1) It makes shell scripts more like real executable files, because they can be the subject of 'exec.' 2) If you do a 'ps' while such a command is running, its real name appears instead of 'sh'. Likewise, accounting is done on the basis of the real name. 3) Shell scripts can be set-user-ID. 4) It is simpler to have alternate shells available; e.g. if you like the Berkeley csh there is no question about which shell is to interpret a file. 5) It will allow other interpreters to fit in more smoothly. To take advantage of this wonderful opportunity, put #! /bin/sh at the left margin of the first line of your shell scripts. Blanks after ! are OK. Use a complete pathname (no search is done). At the moment the whole line is restricted to 16 characters but this limit will be raised. From uucp Thu Jan 10 01:37:49 1980 どのようなコンセプト請求する 結局、 # !行は、 " sharpbang " sharpbangラインと呼ばれるようにはまだいくつかのカーネルのソースコードの中で見つけることができますした。この"シバン"何とかに短縮された。私は" shabang期待があるだろう"しかし、それは"シバン"ほとんどの人が何を使用しているようだ。いくつかの人々 " hashplingを使用するように"見える。どうやら、上海協力機構は、スイッチを" "で、この機能を有効にするには、カーネルのビルド時間を設定する必要がありますhashplingenable求めている。と私は、いくつかの人々は"言葉"を使用しているhashbangされている。 sharppling (誰? ) 特別なルールを Perlの リコールは、上で複数の引数は、 # !行を、多くの場合、 1つの引数として渡されます。もし perlの "のような引数が渡され、 AとBの" 。それ以外のような"行為ブレークするのは" 、 " - b "が渡されていた。同様に perlの 無視していませんが# !行。 Perlの して検査するとしても、それを見つけるのスイッチがオンになります。このシステムのために補償するための非常に短い# !行を制限します。 perlの スキャンする# !行まで"という文字列が検出さperlの" 。その後、スイッチのスキャンが開始されます。このスキャン中に、 " -* "と" - "は無視されます。場合は# !ライン"という文字列が含まれていませんperlの" 、 perlの 処理する# !これはUnixのカーネルとなる行は、適切な通訳者を呼び出す方法です。 処理を別のパス のいくつかのシステムには、例があるとしましょう、は/ opt /perlの/ビン/perlの や/ usr / local / binに/perlの。どのように書くこと perlの スクリプト?私の気持ちは、システム管理者に提供するために必要な共通の滝です。私置くと perlの には/ usr / local / binです。場合は、 perlの インストール手順を置く perlの には/ opt /perlの/ビン/perlの、それはそれでいいです...しかし、その後私とのシンボリックリンクを/ usr / local / binにを指し perlの 実行可能。同じことで perlの。私の管理" # !は/ usrの下にすべてのシステムでは/ local / binに/ Pythonの"仕事やPythonを保証されていますがシステム上ではご利用いただけません。同じことで perlのなどそれは私のようなディレクトリへのリンクを追加するのは珍しいは、 / usr / binにあります。しかし、私のためにこれを行う予定ksh 、 bashのシェルのOSのいずれか欠けている必要があります。と私はいつものようなものが/または/ usr / localオプトインはbash 、 ksh動作しますがマウントされていないか確認します。これらの貝殻はどこでインストール手順をオーバーライドする場合、必要が唯一のケースです。私のシステムのようなので、この動作するもの: # ! / usr / binに/ ksh # ! / usr / binに/ bashの # !は/ usr / / binに/ローカルperlの このようなものまで作品を、私は完全にOSのインストールを検討することはありません。スクリプトは、外の世界からの輸入が予想を実行するための別の場所を微調整する必要があるかもしれませんが、通訳。しかし、 "設定"のようなプログラムが見つかります perlの 場合には、 / usr / / binにローカルです。だからこれは私のアプローチです。しかし、他のアイデアをしている... 別のアプローチを使用することですが# !の中間的なプログラムは、経路探索した後、希望のインタプリタを起動するの行は結果だ。最も頻繁に使用される例のように" # ! / usr / binになるだろう/環境変数 perlの" 。これは、環境変数と仮定している/ usr / binに(ない場合は、例えば、 Unicosが、上記の環境変数には適用のコメントを私と私)は、必要なリンクを追加する。それも想定していますが perlの をPATHのどこかにされています。より複雑な例です。 コード:
#! /usr/bin/sh -- # -*- perl -*- -p
eval 'exec perl -S $0 ${1+"$@"}'
そして、 のPosix 規格に このページ チェックして 引用:
kshの拡大は、環境 のは、排他的に使用してkshスクリプトがあると、 "#!".オフのままと仮定あなたのインタラクティブなスクリプトを実行し、失敗ksh試みる。というわけでkshスクリプトとしてスクリプトを実行している秋に戻ってあなたのインタラクティブksh 。これはサブにそれ自身のコピーを作成することによって、この分岐ありません。このフォークサブし、効果を、 "環境"の標準的なUnixのコンセプトに展開することができます。プロセス実行時に別のプロセスは、新しいプログラムは、オープンファイル、カレントディレクトリ、環境ものの束を継承します。文字列の環境は、大会では、設定の形をとるような変数を設定:パス\u003d / usr / binに:は/ usr / local / binになります。しかし、フォークkshサブサブは、親のすべてを知っている。初期のkshバージョンの配列、エイリアスをエクスポートすることによって、この方法を悪用し、機能しています。これを回避する必要が# !ラインを作成するため、この問題を持って生活する。ほとんどのサイトの使用を強く奨励するが# !ラインと、これは環境の概念を損なうksh拡大。そしてそれは、輸出のエイリアスは、ドキュメントに記載のようなものを見た初心者の混乱。 kshの最近のバージョンでは、環境の概念の拡大から後退している。だから私の提案をkshエクスポート配列、エイリアスの詳細については、忘れて、機能を使用している# !行。 |