だからそんな事に spawn を使うなと!

この記事は 2013 年 1 月 16 日の「Syn の独り言」の記事を移行したものです。

いらん所で spawn を使おうとしている人がいたので、つい。

普通、プログラムを書くときはデフォルトで stdin, stdout, stderr という入出力ストリームが始めから開いている。でも、tty 上にはこれ以外の文字列が表示される事もある。

たとえば、sudo コマンド実行時にパスワードが聞かれたりする場合。
$ sudo env >/dev/null 2>&1
と実行すると、stdout も stderr も /dev/null へ捨てられるはず。でも、パスワードの入力を促す文字列(プロンプト)はちゃんと tty に表示される。

だから、「パスワード入力を促されたら “MyPass” と入力する」プログラムを書こうとした場合、「パスワード入力を促されたら」の確認部分を stdout や stderr を監視で実装する事はできない。繰り返しになるが、入力を促す文字列は tty にのみ出力されるからだ。

ではどうしたら良いか?
spawn を使えば実装できる。

spawn とは fork してから仮想 tty を開く関数の一般名。色々な言語で実装されている。そして、tty に出力される文字列を全て (stdout や stderr も含めて) 取得できる。もちろんプロンプトもだ。

ただ、安直に spawn を使う前に考えてほしい。

何で sudo はパスワード入力を stdout や stderr ではなく、プロンプトに出力するのか?

それは、sudo 実装者が「プログラムではなく、人間に見せたい」と考えたからだろう。つまり、そもそも論として「sudo のパスワードをに入力するプロラム」自体がsudo 実装者の意図に反しており、根本の設計から良くない可能性がある。

個人的には「プロンプトを制御する」とは、「例外を握りつぶす」と似ていると思う。絶対に間違っているとは言わないが、基本的には避けて通りたい。

では、プログラムの中で sudo コマンドを実行したい場合、どうすればいいか?パスワード入力をやめればいい。sudo の場合は設定次第でパスワード無しで実行可能に出来る。だから、そもそもプログラムからパスワードを入力する必要が無いのだ。

なぜ spawn を使うよりパスワード無しにした方が良いのか。例えば、パスワードを入力させるためにはどこかにパスワードを記載する必要があるから。もしプログラムにパスワードを記載すると、subversion などのアクセス権のある人全員にパスワードがばれてしまう。

もちろんソースコードを厳重に管理するとか、実行可能な sudo コマンドを制限するとか方法はいくらでもある。でも、いらんタスクや制限を増やすのは優秀なエンジニアのする事ではない。「コード中にパスワードを絶対に書くな」とは言わないけれど、それが sudo の思想なのだ。素直に従うべきだろう。

sudo に限らず、tty に出力をするコマンドはプログラムから実行するための抜け道を用意している事が多い。その抜け道がどうしても見つからない場合や、何等かの原因で抜け道を実行する事が出来ない場合は spawn を使ってもいいかもしれない。
でも、その前に「本当にそれでいいのか?」と自問自答をする必要がある。

spawn が本当に役に立つのはクロスプラットフォームで動作する、汎用性の高いプログラムやライブラリを書く時ではないだろうか?

spawn は windows でも unix でもインターフェースが似ているのでコードの OS 依存部分が少なくなる。

また、sudo の例で言うとオプションでパスワードを入力できるようにすれば何らかの理由で sudo の設定を変更出来ない環境でも使用できるようになる。
(もちろん、設定変更できる場合に備えて空パスでも動くように実装するべき)

まあ、「動けばいい」っていう考え方もあるんだけど、こういう所からバグって生まれる気がするんだよね。

Author: wbcchsyn

未来のスーパーエンジニア とりあえず、新しい物が大好き

15 thoughts on “だからそんな事に spawn を使うなと!”

  1. Pingback: できる ssh – Where is the mate to the Sock !
  2. Pingback: お詫び – Where is the mate to the Sock !
  3. After research a number of of the blog posts on your web site now, and I truly like your means of blogging. I bookmarked it to my bookmark web site checklist and shall be checking back soon. Pls try my website as nicely and let me know what you think.

  4. Can I just say what a relief to search out somebody who actually is aware of what theyre speaking about on the internet. You definitely know how to bring a problem to mild and make it important. More individuals have to learn this and perceive this side of the story. I cant believe youre not more widespread because you undoubtedly have the gift.

  5. This is the appropriate weblog for anybody who wants to search out out about this topic. You understand so much its nearly laborious to argue with you (not that I truly would need匟aHa). You definitely put a brand new spin on a subject thats been written about for years. Nice stuff, just nice!

  6. An attention-grabbing dialogue is value comment. I believe that it’s best to write more on this topic, it may not be a taboo topic but generally persons are not sufficient to talk on such topics. To the next. Cheers

  7. Can I just say what a relief to search out somebody who actually is aware of what theyre speaking about on the internet. You positively know how one can convey a problem to gentle and make it important. Extra individuals need to learn this and understand this aspect of the story. I cant believe youre not more in style since you definitely have the gift.

  8. I抦 impressed, I need to say. Actually not often do I encounter a weblog that抯 both educative and entertaining, and let me let you know, you could have hit the nail on the head. Your concept is excellent; the problem is something that not enough people are talking intelligently about. I’m very completely happy that I stumbled throughout this in my seek for something referring to this.

  9. Spot on with this write-up, I actually think this website wants much more consideration. I抣l in all probability be again to read far more, thanks for that info.

  10. A formidable share, I just given this onto a colleague who was doing somewhat evaluation on this. And he in truth bought me breakfast as a result of I found it for him.. smile. So let me reword that: Thnx for the treat! But yeah Thnkx for spending the time to debate this, I feel strongly about it and love studying more on this topic. If attainable, as you grow to be experience, would you thoughts updating your weblog with more details? It’s extremely useful for me. Big thumb up for this blog publish!

Leave a Reply

コメントは反映されるまで数分かかります。
リンクのあるコメントはスパム判定されます。