なんかかきたい

プログラミングなどの個人的なメモやサークル「ゆきいろパラソル」の情報を載せてます

askpassのことを書いておく

askpassとは何なのか

askpass とはその名の通り、プログラムからパスワードが必要になったときに呼ばれるプログラムのこと。

よくある使われ方としては、GTKのプログラムで特権が必要になった際に、sudo のパスワードを尋ねるためのウィンドウを出すみたいなやつ。

なので、 ssh-askpass のようなワードで調べると、X11とかその辺が引っかかるが、そもそも askpass が何をするものなのかよくわからなかったので、書くことにした。

askpass を思い出したきっかけ

今の仕事で特権取得を自動化できないかというのが考え始めたきっかけで、RubyCapistranoのことを考えていた。

ちょっと前までWeb屋をやっていたころはRubyで書かれたコードをデプロイすることも多く、capistranoを使ってデプロイをしていたのですが、 その際にたまたま見かけたのが以下のエラーメッセージ。

sudo: no tty present and no askpass program specified

これは sudo が出すエラーメッセージで、tty がないし askpass もないよというものである。

当時は今より弱かったので、なんのこっちゃという感じで意味もよくわからずなんとなく直していたのですが、 ふと考えてみると、capistranoで特権がいる場合に何度もパスワードを入れた覚えがないな、ということはここは自動化してるのかと気づきました。

ところで、似たようなものは Ansible を使っているときにも見かけることがあって、-Kオプションみたいなやつですね。 もちろんどちらもSSHを自動化するものなので当たり前なんですが。

askpass がやること

askpass program とか書かれると、何やら大層なプログラムなのではないかと身構えていて、なんだか大変そうと思っていたのですが、 askpassとは要はパスワードを標準出力に書き出すプログラムのことなのである。 パスワードを書き出すまでにいろいろとやるものもあるが、必要なのはパスワードを標準出力に出すところだけ。 以下のようなシェルスクリプトでも構わないそうな。。。

#!/bin/bash

echo "secure_password!!!!"

askpass プログラムの指定

askpass の指定は環境変数を使う。例えばSSHのパスワード入力を自動化したければ、上記スクリプト/tmp/askpass という名前で置いて、 chmod +x しておいて

export SSH_ASKPASS=/tmp/askpass

としておく。SSHでパスワードが必要になった場合、代わりにこのスクリプトが出力する secure_password!!!! が使われて大変便利。

capistranoはこれと同じようなことを、sudoでも使っていて、内部的には sudo -A #{command} とでもしているんだろうとは思う。

何はともあれ

askpassを使うとパスワードの入力を自動化できるので使いこなせば非常に便利。

ただ、調べ方がうまくないとその存在に気付きづらい。こういうのみんなどうやって調べているんだろ。


すごいどうでもいいんですが、転職したばっかりなのに割と飽きてるので、現状引き抜きOKなエンジニアです。