mktempコマンド、trapコマンド
Bash スクリプトでは、一時ファイルまたはディレクトリを作成する必要がある場合があります。一般的な方法は、「/tmp」ディレクトリにファイルまたはディレクトリを作成することです。これには多くの欠点があります。これは、「mktemp」コマンドを使用するのが最も安全な方法です。
一時ファイルのセキュリティ問題
特に「/tmp」ディレクトリに一時ファイルを直接作成すると、セキュリティ上の問題が発生することがよくあります。
まず、/tmp
ディレクトリは誰でも読み書き可能であり、どのユーザーもこのディレクトリにファイルを書き込むことができます。作成された一時ファイルは誰でも読み取ることができます。
$ touch /tmp/info.txt
$ ls -l /tmp/info.txt
-rw-r--r-- 1 ruanyf ruanyf 0 12 月 28 日 17:12 /tmp/info.txt
上記のコマンドは、/tmp
ディレクトリにファイルを直接作成します。このファイルはデフォルトで誰でも読み取り可能です。
次に、攻撃者が一時ファイルのファイル名を知っている場合、一時ファイルへのシンボリック リンクを作成して、システムの異常実行を引き起こす可能性があります。攻撃者はスクリプトに悪意のあるデータを提供することもあります。したがって、一時ファイルが悪用されないように、一時ファイルには予測不可能な異なるファイル名を使用することが最善です。
最後に、一時ファイルは使用が終了したため、削除する必要があります。ただし、スクリプトが予期せず終了した場合、一時ファイルのクリーンアップが無視されることがよくあります。
一時ファイルの生成は、次のルールに従う必要があります。
- 作成する前にファイルが既に存在するかどうかを確認してください。
- 一時ファイルが正常に作成されたことを確認します。
- 一時ファイルには権限制限が必要です。
- 一時ファイルには予測できないファイル名を使用します。
- スクリプトが終了したら、一時ファイルを削除します (
trap
コマンドを使用)。
mktemp コマンドの使用方法
mktemp
コマンドは、一時ファイルを安全に作成するように設計されています。一時ファイルを作成する前に一時ファイルが存在するかどうかはチェックしませんが、一意のファイル名とクリーンアップ メカニズムをサポートしているため、セキュリティ攻撃のリスクが軽減されます。
mktemp
コマンドを直接実行して一時ファイルを生成します。
$mktemp
/tmp/tmp.4GcsWSG4vj
$ ls -l /tmp/tmp.4GcsWSG4vj
-rw------- 1 ruanyf ruanyf 0 12 月 28 日 12:49 /tmp/tmp.4GcsWSG4vj
上記のコマンドでは、「mktemp」コマンドによって生成される一時ファイル名はランダムであり、アクセス許可はユーザー自身のみが読み取りおよび書き込み可能です。
Bashスクリプトでのmktempコマンドの使い方は以下の通りです。
#!/bin/bash
TMPFILE=$(mktemp)
echo "一時ファイルは $TMPFILE です"
一時ファイルが正常に作成されたことを確認するには、mktemp
コマンドの後に OR 演算子 (||
) を使用して、作成が失敗した場合にスクリプトが確実に終了するようにするのが最善です。
#!/bin/bash
TMPFILE=$(mktemp) || 出口 1
echo "一時ファイルは $TMPFILE です"
スクリプトの終了時に一時ファイルが確実に削除されるようにするには、「trap」コマンドを使用して終了時のクリーンアップ操作を指定します。
#!/bin/bash
トラップ 'rm -f "$TMPFILE"' EXIT
TMPFILE=$(mktemp) || 出口 1
echo "一時ファイルは $TMPFILE です"
mktemp コマンドのパラメータ
-d
パラメータは一時ディレクトリを作成できます。
$mktemp-d
/tmp/tmp.Wcau5UjmN6
-p
パラメータは、一時ファイルが配置されるディレクトリを指定できます。デフォルトでは、$TMPDIR
環境変数で指定されたディレクトリが使用されます。この変数が設定されていない場合は、/tmp
ディレクトリが使用されます。
$ mktemp -p /home/ruanyf/
/home/ruanyf/tmp.FOKEtvs2H3
-t
パラメータは、一時ファイルのファイル名テンプレートを指定できます。テンプレートの末尾には、ランダムな文字を示す少なくとも 3 つの連続した X
文字が含まれている必要があります。少なくとも 6 つの X
を使用することをお勧めします。デフォルトのファイル名テンプレートは、「tmp.」の後に 10 個のランダムな文字が続きます。
$ mktemp -t mytemp.XXXXXXX
/tmp/mytemp.yZ1HgZV
トラップコマンド
「trap」コマンドは、Bash スクリプトでシステム信号に応答するために使用されます。
最も一般的なシステム信号は SIGINT (割り込み) で、Ctrl + C を押すことで生成される信号です。 「trap」コマンドの「-l」パラメータを使用すると、すべてのシステム信号をリストできます。
$ トラップ -l
1) ため息 2) 署名 3) 署名 4) 署名 5) 署名トラップ
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) シグティン 22) シグトゥ 23) シグルグ 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
「trap」のコマンド形式は以下の通りです。
$ トラップ [アクション] [シグナル 1] [シグナル 2] ...
上記のコードでは、「アクション」は Bash コマンドであり、一般的に使用される「シグナル」は次のとおりです。
- HUP: No. 1、スクリプトは、スクリプトが配置されている端末から切断されます。
- INT: 番号 2、ユーザーはスクリプトを終了するつもりで Ctrl + C を押しました。
- QUIT: 番号 3、ユーザーはスクリプトを終了する目的で Ctrl + スラッシュを押します。
- KILL: 番号 9、このシグナルはプロセスを強制終了するために使用されます。
- TERM: 番号 15、これは
kill
コマンドによって発行されるデフォルトのシグナルです。- EXIT: 番号 0。これはシステム シグナルではなく、Bash スクリプトに固有のシグナルです。状況に関係なく、スクリプトが終了する限り生成されます。
「trap」コマンドは「EXIT」信号に対して次のように応答します。
$ トラップ 'rm -f "$TMPFILE"' EXIT
上記のコマンドでは、スクリプトが「EXIT」シグナルに遭遇すると、「rm -f "$TMPFILE"」を実行します。
トラップ コマンドの一般的な使用シナリオは、Bash スクリプトの終了時に実行されるクリーンアップ コマンドを指定することです。
#!/bin/bash
トラップ 'rm -f "$TMPFILE"' EXIT
TMPFILE=$(mktemp) || 出口 1
ls /etc > $TMPFILE
if grep -qi "kernel" $TMPFILE;
エコー「検索」
フィ
上記のコードでは、スクリプトが正常に終了するか、ユーザーが Ctrl + C を押して終了するかにかかわらず、「EXIT」シグナルが生成され、一時ファイルの削除がトリガーされます。
「trap」コマンドはスクリプトの先頭に置く必要があることに注意してください。そうしないと、スクリプトを終了させる上位のコマンドはスクリプトによって捕捉されません。
「trap」が複数のコマンドをトリガーする必要がある場合は、Bash 関数をカプセル化できます。
関数出口 {
コマンド1
コマンド2
コマンド3
}
トラップ出口 EXIT
参考リンク
作者: wangdoc
アドレス: https://wangdoc.com/
ライセンス: クリエイティブ・コモンズ 3.0