シェルスクリプト総合 その22
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2013/11/01(金) 07:58:50.52□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
FreeBSDユーザは/bin/shの正体がashなので注意。
v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/
http://heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆーな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
「そういうのはperl使いましょう」と回答するのはやめましょう。
安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その21
http://toro.2ch.net/test/read.cgi/unix/1352973453/
教祖様にいってやれよ。
つーか、お前のようなバカをサニタイズするために始まったキャンペーンだろw
http://takagi-hiromitsu.jp/diary/20060115.html
>> たとえば、データファイルのファイル名の一部をCGIのパラメータと して受け取るようになっているPerlスクリプトなら/^[a-z]+$/のような正規表
>> 現(Rubyなら\A[a-z]+\z/)で期待している文字しか入っていないこと を確認して(Perlの場合はuntaintもこれで出来る)、違っていたらエラーにする
>> というのが「 セキュリティ対策以前に元来本質的に必要な処理」だと思います。
> ブラックリスト方式ではなくホワイトリスト方式にせよという話だと誤読した事例
> 「/^[a-z]+$/のような正規表現」を使う手法はサニタイズ処理そのものであって、まさにセキュリティ対策のための処理である
0548名無しさん@お腹いっぱい。
2014/03/17(月) 14:52:10.17あなたが教祖様?
0549名無しさん@お腹いっぱい。
2014/03/17(月) 15:18:06.420550名無しさん@お腹いっぱい。
2014/03/17(月) 20:24:54.090551名無しさん@お腹いっぱい。
2014/03/17(月) 23:11:30.64大ざっぱにいえば、
サニタイズは、不要な文字を削ること。
エスケープは、特殊な意味を打ち消すことだよ。
用途、目的がぜんぜんちがうべ。
サニタイズされた文字列に特殊な文字が含まれる事はないし、逆にエスケープされた文字列から特殊文字が消えることもない。
0552名無しさん@お腹いっぱい。
2014/03/18(火) 03:27:47.75エスケープすべきところでサニタイズしたりする
>>523みたいなサニタイズ脳がわらわら居るからな
SQLインジェクションなんてエスケープ漏れの代表例出して
サニタイズすべきとか言う馬鹿を勘違いさせないためにも
サニタイズなんて単語は捨てた方が良い
0554名無しさん@お腹いっぱい。
2014/03/18(火) 05:31:33.51エスケープの一種ってことで
0555名無しさん@お腹いっぱい。
2014/03/18(火) 05:40:22.480556名無しさん@お腹いっぱい。
2014/03/18(火) 06:16:47.810557名無しさん@お腹いっぱい。
2014/03/18(火) 08:41:56.99> エスケープの一種ってことで
そういう定義にするのか? キャンペーンの信者 www
「エスケープ言うなキャンペーン」始めるべきですよ。ひろみちゅ先生
戻せないものはエスケープとは言わない。
0558名無しさん@お腹いっぱい。
2014/03/18(火) 08:59:59.970559名無しさん@お腹いっぱい。
2014/03/18(火) 09:02:46.08とっとと、SQLをシェルスクリプトでエスケープしろよ。
0560名無しさん@お腹いっぱい。
2014/03/18(火) 09:12:57.21誰と戦ってんだ?
0561名無しさん@お腹いっぱい。
2014/03/18(火) 09:18:44.310562名無しさん@お腹いっぱい。
2014/03/18(火) 10:35:22.700563名無しさん@お腹いっぱい。
2014/03/18(火) 14:42:42.83サニタイズの用例には3つある
1、エスケープをサニタイズと呼ぶ
2、エスケープするべき文字(列)を単純に除去することをサニタイズと呼ぶ
3、NGワード同様、通過させては駄目なデータを除去・置換することをサニタイズと呼ぶ
複数の用例を区別せず「サニタイズは正しい」などと言ってると、
1の人はエスケープという概念を知りそこねて間違ったエスケープを行いエスケープ漏れを起こしやすくなるし
2の人は無意味にシステムへの入力制限やデータの損傷を起こした挙句エスケープ漏れを起こしやすくなる
そもそもエスケープをサニタイズなどと呼ぶべきではないし、3の用例もNGワードやフィルタリングと呼べばいい
この半ばスレチな話の発端である>>523はSQLインジェクションを例に出してる事から3の用例では無いんだが、
サニタイズを擁護してる人は何故かその事実やサニタイズに複数の(誤)用例があるって事実を無視したり、
あるいは複数の用例を都合よく入れ替えて話を捻じ曲げて理論展開してたりと、無茶苦茶やってんだよね
誤用した自分の擁護で捻じ曲げてんのか、高木への恨みで捻じ曲げてんのか、自覚なく捻じ曲げてるのか…
0564名無しさん@お腹いっぱい。
2014/03/18(火) 14:56:36.970565名無しさん@お腹いっぱい。
2014/03/18(火) 23:37:24.97とりま、釣られてみる。
何度も指摘されているけれど、エスケープをサニタイズとは言わない。
全く別のものなのに同じものと理解してるのがまずい。
正規化の一種として同じとかならまだわかるけど。。。
0566名無しさん@お腹いっぱい。
2014/03/19(水) 00:42:35.04盲信云々以前に523が明らかにキャンペーン対象の典型例なんだが
>>565
563はエスケープをサニタイズと言う奴が居るとは書いているけれど
エスケープをサニタイズと言わない奴が居ることを否定はしてないぞ?
0567名無しさん@お腹いっぱい。
2014/03/19(水) 03:05:59.49まず間違いなく意味わかってないってことでいいだろ
0568名無しさん@お腹いっぱい。
2014/03/19(水) 08:31:58.990569名無しさん@お腹いっぱい。
2014/03/19(水) 09:27:38.19シェルスクリプトでSQLをエスケープする実例見せてよ
0570名無しさん@お腹いっぱい。
2014/03/19(水) 09:28:38.920571名無しさん@お腹いっぱい。
2014/03/19(水) 09:44:45.75プリペアードステートメントのない言語選択するのって、
シェルスクリプトしか使えない老害ぐらいじゃねえ?
悪意あるデータは数字しか来ないと分かってる
例外的状況ぐらいしか、使う言い訳できるケースを思いつかん。
0572名無しさん@お腹いっぱい。
2014/03/19(水) 10:02:06.63エスケープ脳を量産する結果に終わってしまいましたとさ。
エスケープ脳の見分け方
「サニタイズ」と唱えると楽勝で判定できる
プリペアードステートメント万能かというとそうでもない
ひろみちゅも当初は誤解してたふしもあったけど
実装によっては(例: 古めのpostgreSQL)SQLへの展開をクライアント側でやっ
てて、結局phpとかに標準で入ってるエスケープ関数と同等ってのもある
0573名無しさん@お腹いっぱい。
2014/03/19(水) 10:07:34.99それは、「プリペアードステートメントではないものを、プリペアード
ステートメントだと誤解していた」っていう例だぜ。
そいつを「プリペアードステートメント万能かというとそうでもない」と
表現しちゃうってことは、おまえさんが、プリペアードステートメントを
理解してないか、致命的に日本語が不自由か、どちらかだっていうことだ。
0574名無しさん@お腹いっぱい。
2014/03/19(水) 10:25:59.420575名無しさん@お腹いっぱい。
2014/03/19(水) 10:57:33.54> PQprepare
> Submits a request to create a prepared statement with the given parameters,
> and waits for completion.
と「プリペアードステートメントではないものを、プリペアードステートメント
だと詐称していた」わけだが。
何かほかに質問はあるか? 無職
0576名無しさん@お腹いっぱい。
2014/03/19(水) 11:13:05.60て、ことだろう
このスレに対立楽しみたいという血気盛んな若者が居るとも思えんのだが
そうなんだろう
0577名無しさん@お腹いっぱい。
2014/03/19(水) 11:15:32.60さすが老害は時代感覚が狂ってるな。
PostgreSQL にホンモノのプリペアードステートメントがなかったのって、
PostgreSQL 7 の時代だぜ。
10年くらい前にはもうホンモノのプリペアードステートメントが入ってる。
Wikipedia ttp://en.wikipedia.org/wiki/Prepared_statement で確認しても、
ホンモノのプリペアードステートメントは server side で動くものって
書き方になってて、client side でやってる奴は emulation 扱いになってるぜ。
つまりホンモノのプリペアードステートメントじゃないってことだよ。
10年前ならともかく、いまさら PostgreSQL の過去の誤用を元に主張されても。
0578名無しさん@お腹いっぱい。
2014/03/19(水) 11:23:10.35お前、全部の実装が「ホンモノのプリペアードステートメント」であることを
確認してるのか? 大変だな。 w
0579名無しさん@お腹いっぱい。
2014/03/19(水) 11:29:42.17実際、クライアント側でエミュレートしているおかげで、
セキュリティホールがあったって事例はいくつもあるわけで。
そういう当たり前の作業もやらずに、セキュリティを語ってるわけ?
呆れた。
そりゃシェルスクリプトでサニタイズに問題感じないわけだ。
0580名無しさん@お腹いっぱい。
2014/03/19(水) 11:36:20.42>>577
> 10年前ならともかく、いまさら PostgreSQL の過去の誤用を元に主張されても。
>>579
> セキュリティ気にしてる人間なら、当然チェックするだろう。
0581名無しさん@お腹いっぱい。
2014/03/19(水) 11:48:14.19クライアント側でエミュレートするケースってのがありうるんだよ。
PHPのPDOとか、DB側でプリペアードステートメント用意してる場合には
当然使うが、用意してない場合には、クライアント側でエミュレーション
する機能がある。当然、こういうライブラリ使う場合には、そのDBで、
ちゃんとプリペアードステートメントになるか確認する必要がある。
こんなことも知らずに矛盾だと思っちゃうとか、よくセキュリティを
語る気になれるなあ。こういう奴の言ってることを間違って信じちゃう
奴がいると危険だから、ホント黙って欲しい。
0582名無しさん@お腹いっぱい。
2014/03/19(水) 11:52:16.22いや独演でひとりか?
0583名無しさん@お腹いっぱい。
2014/03/19(水) 11:53:30.89>>577
> 10年前ならともかく、いまさら PostgreSQL の過去の誤用を元に主張されても。
0584名無しさん@お腹いっぱい。
2014/03/19(水) 11:56:26.77・10年くらい前の PostgreSQL は誤用していた。
・今でもプリペアードステートメントを、「エミュレート」するケースは存在する。
(エミュレートなので、実際にはプリペアードステートメントにはなってない)
ってだけでしょ。
0585名無しさん@お腹いっぱい。
2014/03/19(水) 12:05:07.42プリペアードステートメントではないものを、プリペアードステートメントだと詐称している実装が存在する事を知っているなら
>>573のような間抜けな発言はしない。
>>573
> おまえさんこそ、反省した方がいいよ。
> それは、「プリペアードステートメントではないものを、プリペアード
> ステートメントだと誤解していた」っていう例だぜ。
0586名無しさん@お腹いっぱい。
2014/03/19(水) 12:08:06.83何が言いたいのかさっぱり分からんわ。
0587名無しさん@お腹いっぱい。
2014/03/19(水) 12:23:30.19> ひろみちゅも当初は誤解してたふしもあったけど
最初から言ってるが。
0588名無しさん@お腹いっぱい。
2014/03/19(水) 12:29:33.11当時ひろみちゅが誤解してたって話と、>>584 にどういう矛盾があるんだ?
0589名無しさん@お腹いっぱい。
2014/03/19(水) 12:44:25.52>>573と言いがかりをつけるのは、お前の日本語能力が欠如しているせいだろう。
0590名無しさん@お腹いっぱい。
2014/03/19(水) 13:01:07.960591名無しさん@お腹いっぱい。
2014/03/19(水) 13:03:33.86主張してるから、client side でやっててもプリペアードステートメントだ」
って意味の主張してるじゃん。
自分の主張ももう忘れたの?
当時のPostgerSQLは間違えてんだよ。
そのことを分かってないのは、>>575 を書いた奴だ。
0592名無しさん@お腹いっぱい。
2014/03/19(水) 13:04:37.87スレ違いすまん。少なくとも2人はいるんだ。
0593名無しさん@お腹いっぱい。
2014/03/19(水) 13:24:03.800594名無しさん@お腹いっぱい。
2014/03/19(水) 13:45:09.84どうしたらいいかな
0595名無しさん@お腹いっぱい。
2014/03/19(水) 13:48:30.690596名無しさん@お腹いっぱい。
2014/03/19(水) 15:41:59.44シェルスクリプトでエスケープできると言ってる奴は居ない
むしろサニタイズすべきといった奴がサニタイズ例出すべきだな
0597名無しさん@お腹いっぱい。
2014/03/19(水) 15:55:44.46徹底的に日本語能力が欠如しているな。
「お前の論理で言うと」と前置きしてるだろ。
0598名無しさん@お腹いっぱい。
2014/03/19(水) 16:40:24.560599名無しさん@お腹いっぱい。
2014/03/19(水) 16:41:54.410600名無しさん@お腹いっぱい。
2014/03/19(水) 16:54:31.410601名無しさん@お腹いっぱい。
2014/03/19(水) 17:20:09.440602名無しさん@お腹いっぱい。
2014/03/19(水) 17:43:11.930603名無しさん@お腹いっぱい。
2014/03/19(水) 17:55:03.76じゃあ、IDの出る板で、ここじゃないどこかで、
納得のいくまで議論をしてきてください。
0604名無しさん@お腹いっぱい。
2014/03/19(水) 18:10:16.370605名無しさん@お腹いっぱい。
2014/03/19(水) 18:11:04.90誰も見てないよw
0606名無しさん@お腹いっぱい。
2014/03/19(水) 20:29:36.390607名無しさん@お腹いっぱい。
2014/03/19(水) 21:42:48.00あ、飛ばしてた
0608名無しさん@お腹いっぱい。
2014/03/19(水) 22:05:25.510609名無しさん@お腹いっぱい。
2014/03/19(水) 22:52:46.860610名無しさん@お腹いっぱい。
2014/03/23(日) 15:02:29.91でmigemoしたpatternで検索できる以下のようなmgrep関数を作った。
しかしこのままだと、patternの前に必ず -e オプションを付けんにゃならん。
$ mgrep [<options>] <pattern> <file>
でも同じようにmigemoしたpatternで検索したいんだけどどうしたら良い?
パイプした時も使いたいから <file> は存在しない可能性もある。
function mgrep() {
local -a args
local prev
for arg in "$@"; do
if [ "$prev" = '-e' ]; then
args+=$(cmigemo -d /usr/local/share/migemo/utf-8/migemo-dict -w "$arg")
else
args+="$arg"
fi
prev="$arg"
done
grep -E "${args[@]}"
}
0611名無しさん@お腹いっぱい。
2014/03/23(日) 21:06:15.72expr match "$arg" '/\(.*\)/'
にマッチすればパターンとみなすとか
0612名無しさん@お腹いっぱい。
2014/03/28(金) 01:59:44.83↑こういう書き方をしてるスクリプトがあるんですが、これって
if [ -n "${file}" ]; then
↑
と単に書くのと何が違うんでしょうか?
0613名無しさん@お腹いっぱい。
2014/03/28(金) 04:43:52.290614名無しさん@お腹いっぱい。
2014/03/28(金) 04:51:02.05set -u してる場合にエラーを回避することができる
>>613
すみませんが詳しい方のみ回答をお願いします
0615名無しさん@お腹いっぱい。
2014/03/28(金) 06:17:11.97http://linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html#lbBB
0616名無しさん@お腹いっぱい。
2014/03/28(金) 06:51:18.06${parameter:-word} 自体の意味を質問してるんじゃないよw
だから >>614 の回答が適切。
0617名無しさん@お腹いっぱい。
2014/03/28(金) 06:55:53.38$ set -u
$ unset file
$ echo "${file}"
file: unbound variable
$ echo "${file:-}"
(エラーなし)
set -u してなければ "${file:-}" も "$file" も同じ。
>>615 は問題ちゃんと読まずに解答するタイプw
0618名無しさん@お腹いっぱい。
2014/03/28(金) 07:00:40.67${parameter:-word} 自体の意味がわかってたら
なぜそう書くのかもわかるんじゃね?
0619名無しさん@お腹いっぱい。
2014/03/28(金) 07:09:57.05${parameter:-word} 自体の意味はわかってても、
その word の部分を空文字列にする場合の意味がわからないってことだろ
wordが空文字列なら ${parameter} と同じでは? という質問だろ
0620名無しさん@お腹いっぱい。
2014/03/28(金) 07:24:33.13> wordが空文字列なら ${parameter} と同じでは? という質問だろ
そういう疑問が出るってことは
${parameter:-word} 自体の意味をわかってないでしょ。
0621名無しさん@お腹いっぱい。
2014/03/28(金) 07:30:23.60${parameter:-word} 自体の意味をわかってるからこその疑問だろ。
man見ても set -u のことはそこには書いてないからますます疑問になるはず。
0622名無しさん@お腹いっぱい。
2014/03/28(金) 07:32:40.06ありがとうございました。変数未設定の場合の /bin/sh -u の対応ですね。
>>615 さん、それは知ってますよ。
0623名無しさん@お腹いっぱい。
2014/03/28(金) 13:44:52.410624名無しさん@お腹いっぱい。
2014/03/28(金) 14:15:56.730625名無しさん@お腹いっぱい。
2014/03/28(金) 17:27:58.23だけど、set -u してる場合はエラーを回避しちゃ
駄目なんじゃないだろうか
0626名無しさん@お腹いっぱい。
2014/03/28(金) 17:58:13.66おまえ、ホントに理解してない奴だな。
set -u はプログラムミスで変数名が違ってたりするのを防ぐのが狙い。
if [ -n "${file:-}" ]; then
なんかの場合は $file がセットされてないかどうか自体を条件判断してるんだから、
if文を実行して file: unbound variable なんてエラーメッセージ出されたら困るだろ。
0627名無しさん@お腹いっぱい。
2014/03/28(金) 18:22:18.06のが目的なんじゃないの?
0628名無しさん@お腹いっぱい。
2014/03/28(金) 19:00:02.16「検出する(そして人間が修正する)」のことを簡潔に「防ぐ」って言ってるんだろw アスぺかよw
0629名無しさん@お腹いっぱい。
2014/03/28(金) 19:11:45.22お前ホントに何もわかってないのな
プログラムミスを検知するために-uしてるのに
プログラムミスを検知しないようにしてどうする
ってことだ
0630名無しさん@お腹いっぱい。
2014/03/28(金) 19:37:00.09if [ -n "${file:-}" ]; then
の場合はそもそも set -u ではミス検出できない。
$file の状態がどちらであっても正常だから。
お前ホントに何もわかってないのな
0631名無しさん@お腹いっぱい。
2014/03/28(金) 20:14:13.71それ、全然意味が違う
0632名無しさん@お腹いっぱい。
2014/03/28(金) 20:16:29.56「set -u を使う事を前提とするなら」、 if [ -n "${file}" ]; then と書くべきなんじゃないか?って話
0633名無しさん@お腹いっぱい。
2014/03/28(金) 20:54:49.04正反対。
「set -u を使う事を前提とするなら」、 if [ -n "${file:-}" ]; then と書くべき
set -u には、${file} 以外の箇所を検出させる。 $hoge とかが他の場所にある。
0634名無しさん@お腹いっぱい。
2014/03/28(金) 20:56:38.96言葉の表面上の意味でしか捉えられないアスペ乙
0635名無しさん@お腹いっぱい。
2014/03/28(金) 21:01:24.80Makefileで、 (コマンド || true) とかやってエラーにならないようにするのと同じようなもの。
この行だけ set -u に検出されないように "${file:-}" って書くわけ。
C言語でwarning消すためにキャストするのとも似てる。
warning消しておかないと本当のwarningが出る他の行と紛らわしいから。
0636名無しさん@お腹いっぱい。
2014/03/28(金) 21:05:43.98「アスペ」の使い方間違ってるぞ
0637名無しさん@お腹いっぱい。
2014/03/28(金) 21:08:00.67う〜ん、間違えて if [ -n "${flie:-}" ]; then って書いちゃったらどうするの?
0638名無しさん@お腹いっぱい。
2014/03/28(金) 21:10:16.75そこは検出できないから仕方ない
0639名無しさん@お腹いっぱい。
2014/03/28(金) 21:11:38.06それもよく判らないなぁ。$file が未定義なのかNULLなのか判別しないまま
スクリプトの実行を続けても構わない、ってこと?
0640名無しさん@お腹いっぱい。
2014/03/28(金) 21:13:02.51∧∧
ヽ(・ω・)/ ズコー
\(.\ ノ
、ハ,,、  ̄
 ̄
0641名無しさん@お腹いっぱい。
2014/03/28(金) 21:45:19.90他の例を挙げると、引数を確認する目的で
echo "arg1=${1} arg2=${2}"
と書くのを、
set -u
echo "arg1=${1:-} arg2=${2:-}"
としないといけない、とか
0642名無しさん@お腹いっぱい。
2014/03/28(金) 22:01:46.73それだったら
file=""
:
:
if [ -n "${file}" ]; then
って書いたほうがいいんじゃない? 変数名の書き間違ちがいもチェックできるし
0643名無しさん@お腹いっぱい。
2014/03/28(金) 23:00:21.830644名無しさん@お腹いっぱい。
2014/03/29(土) 01:03:16.20いままでif連打して引数判定してたのが馬鹿馬鹿しくなってきた
三項演算子とかでググってたのがいけなかったのか
0645名無しさん@お腹いっぱい。
2014/03/29(土) 01:15:17.92どっちも正解
「set -u を使う事を前提とするなら」「空文字列判定を意図する部分では」「if [ -n "${file}" ]; then と書くべき」
「set -u を使う事を前提とするなら」「未設定の判定も意図する部分では」「if [ -n "${file:-}" ]; then と書くべき」
>>636
アスペ(もとい自閉症スペクトラム)の症状は色々な方向性がありうるから一概に間違ってるとも言えない
0646名無しさん@お腹いっぱい。
2014/03/29(土) 02:09:20.43とはいえ、>>634 は単に「アスペ」って言いたいだけなんじゃないかと
色々な方向性がありうるとなると >>634 がアスペなのかもしれないが…
■ このスレッドは過去ログ倉庫に格納されています