Linuxゲリラ戦記

$ echo 将来は妻に昇格する > /tmp/恋人
bash: /tmp/恋人: 許可がありません

71.tmpディレクトリの話2

ナックス「今日はtmpディレクトリの話その2です」

デビー君「はーい」

ナックス「『というか、まずそもそも一般ユーザーで本当に/tmpディレクトリに書き込めるの?私はパーミッションの表示を信じない』という、全てを疑う人間のために、一般ユーザーでtmpディレクトリに書き込みしてみようぜ!」

デビー君「オッケー!」

ナックス「せっかくなので、色々復習しながら書き込んでみます。CUI環境を立ち上げましょう(真のCUI環境じゃなくて大丈夫です)」

デビー君「CUI環境を立ち上げた直後だから、今は一般ユーザーでホームディレクトリにいるね」

ナックス「まずはechoコマンドの復習」

$ echo こんにちは
こんにちは

デビー君「echoコマンドは、指定した文字列をそのまま表示するコマンドだね。30.シェルスクリプトでプログラミングする前の予習。echoコマンド。exprコマンド。\によるエスケープ処理。でやったね」

ナックス「そうです。正確には『標準出力に指定した文字を表示する』です」

デビー君「ひょうじゅんしゅつりょく?」

ナックス「そうです。標準出力っていうのは『コマンドの結果が出る場所』のことです」

デビー君「『コマンドの結果が出る場所に、指定した文字を表示する』ってそれ、当たり前じゃない?わざわざ標準出力なんて言う難しい言葉を使わなくても……」

ナックス「そうですね。次は、echoコマンドで指定した文字を > でファイルに書き込んでみます」

$ echo こんにちは > aaa.txt

デビー君「>を使うと、バシッと書き込めるんだっけ?」

ナックス「そうです。正確に言えば『標準出力』を『PCのディスプレイ』から『指定したファイル』にリダイレクトしているのです」

デビー君「なにいきなり専門用語をバンバン出してるの?バカなの?」

ナックス「つまり、実は > はリダイレクトの機能を持つのです」

デビー君「なに無視してるの?バカなの?」

ナックス「落ち着いて読めば大丈夫ですよ、デビー君。わかりやすく処理の流れを以下に書きました」

  1. 「echo こんにちは」で、標準出力(PCのディスプレイ)に"こんにちは"と表示しようとする
  2. 「> aaa.txt」で、標準出力先を aaa.txt というファイルに変更(リダイレクト)する
  3. aaa.txt に こんにちは が書き込まれる。

ナックス「ね?そんなに難しくないでしょ?」

デビー君「うん、まあ」

ナックス「というわけでcatコマンドでaaa.txtファイルの中身を見てみましょう」

デビー君「catコマンドはファイルの中身を見るコマンドだったね」

$ cat aaa.txt
こんにちは

ナックス「ね?『こんにちは』って書かれてる」

デビー君「うん」

ナックス「せっかくなので追加書き込みも復習しましょう。以下のコマンドを使用してみてください」

$ echo こんばんは >> aaa.txt

ナックス「catコマンドで見てみましょう」

$ cat aaa.txt
こんにちは
こんばんは

ナックス「>> を使用することで、既存のファイルの下に追加書き込みができます。では、既に文字が書かれているファイルに追加書き込みではなく普通のリダイレクトを使うとどうなるのでしょう?」

$ echo おはよう > aaa.txt

ナックス「中身を見てみましょう」

$ cat aaa.txt
おはよう

ナックス「既に何か文字が書かれているファイルにリダイレクトで文字を書き込むと、既存の内容を無視して上書き保存、つまり、『こんにちは』と『こんばんは』が消されて、『おはよう』が書き込まれます」

ナックス「ちなみに、存在しないファイルに追加書き込みをすると」

$ echo こんにちは >> bbb.txt

ナックス「特に問題なく新しいファイルが作られ、文字も普通に書かれます」

$ cat bbb.txt
こんにちは

ナックス「ここまでは復習です。ただ、専門用語を使って難しそうに言っただけです」

デビー君「専門用語必要なの?」

ナックス「必要です。こうやって初心者を脅すことで、いかにも凄そうなことをしているイメージを刷り込み、いつか素人からプログラムで何か依頼をもらった時に莫大な金額を要求するために必要です」

デビー君「よーし、僕も大人になったら法外な金額を請求するぞ!」

ナックス「さて、遂に一般ユーザーから/tmpディレクトリにファイルを書き込みます。以下のコマンドを打ってみてください」

$ echo こんにちは > /tmp/ccc.txt

デビー君「おお。確かにエラーが出ない」

ナックス「何をやってるかは分かると思います」

デビー君「うん。/tmpディレクトリの中にccc.txtファイルを作って、中に『こんにちは』って書かれてるんでしょ」

ナックス「まずはlsコマンドで/tmpディレクトリの中にccc.txtファイルが存在することを確認しましょう」

$ ls /tmp
ccc.txt

デビー君「あるね。ccc.txtファイルができてる」

ナックス「念の為ccc.txtファイルの中身を確認してみましょう」

$ cat /tmp/ccc.txt
こんにちは

デビー君「おお、こんにちは、ってちゃんと書かれてる」

ナックス「これで、この世のありとあらゆる事に疑いの目を向ける皆さんも、一般ユーザーで/tmpディレクトリに書き込むことが出来ることがご理解いただけたと思います」

デビー君「うん」

ナックス「だがしかし──。/tmpディレクトリは、テンポラリファイルを置くためのディレクトリ。きっと私達が作成するプログラム以外のプログラムも、/tmpディレクトリの中にテンポラリファイルをバリバリ作成することでしょう」

デビー君「うん」

ナックス「じゃあ、運が悪いと私達が作成するテンポラリファイルのファイル名と、他のプログラムが作成するテンポラリファイルのファイル名がバッティングしちゃわない?」

デビー君「そんなことあるの?」

ナックス「そんなことあるよ」

デビー君「プログラムの作成ってそこまで考えて作るの?」

ナックス「プログラムの作成ってそこまで考えて作るんだよ」

ナックス「しかし、そこはLinux。絶対に他のファイルとファイル名がかぶらない、何も書かれていないファイルを作成するコマンドが用意されています。mktempコマンドです」

mktemp

一時ファイルや一時ディレクトリを作成する。

一時ファイルを作成する
$ mktemp
一時ディレクトリを作成する
$ mktemp -d

ナックス「実際に私がmktempコマンドを試してみたところ、こんな感じでした」

$ mktemp
/tmp/tmp.Tv5zhSIZuI

デビー君「mktempってコマンドを打つだけで/tmpディレクトリの下に、他とは絶対に名前のかぶらないファイル、今回の例では『tmp.Tv5zhSIZuI』が作成される……楽勝じゃないか!」

ナックス「そうですね。で、実際にはこのファイルに情報を書き込むときはリダイレクトとか追加書き込みを使用すれば良いのです」

ナックス「さて、今回作成した色々なファイルは特に今後使う予定はないので、削除しちゃって大丈夫です」

ナックス「次回!72.tmpディレクトリの話3

デビー君「まだあるの?」

補足

へそブルー - 画像検索サイト」に関して

この画像検索サイトですが、bingのAPIを使用して作成しています(Bing Search API | Microsoft Azure Marketplace)。で、APIに制限がありまして、1ヶ月につき5000回しか検索できません。

たまに画像検索サイトで検索できなくなってる場合がありますが、私のせいじゃないよ。検索制限回数に達したからだよ。

最近、へそブルーで検索できないことが頻発しています。たぶん、自力で画像収集スクリプトを作成して、へそブルーを利用している人がいると思うのですが、可能であれば検索回数をできるだけ少なくして収集できるようにスクリプト修正していただけると助かります(画像の検索結果一ページにつき2回APIにリクエストを投げています。つまり、例えば wget "http://www.heso.blue/?text=%E6%B0%B4%E7%9D%80%E3%82%B0%E3%83%A9%E3%83%93%E3%82%A2&page=1" という風に1回wgetコマンドを使用すると2回APIを使用したことになります。)

また、これを見ている人で「画像検索サイトを通してじゃなくて、Bing APIを直に教えてくれればいいのに」と思っている方もいると思いますが、このAPIは無料で使えますが、使用にメルアドの登録が必要です。そして、私は初心者の方の心を読めるのですが、プログラミング初心者の人って「メルアド登録したらAPI無料で使えるからメルアド登録してね」って言っても絶対に面倒臭がってメルアド登録してくれないじゃないですか。そして私のサイトから去るんだ……。というわけで解説ではへそブルーを使用して画像収集プログラムを作成する予定です。ただ、もしチャレンジ精神があるならぜひBing Search API | Microsoft Azure Marketplaceを解読して直接APIを叩いて画像収集するプログラムを作成することに挑戦してみてください。

このエントリーをはてなブックマークに追加