askpassのことを書いておく
askpassとは何なのか
askpass とはその名の通り、プログラムからパスワードが必要になったときに呼ばれるプログラムのこと。
よくある使われ方としては、GTKのプログラムで特権が必要になった際に、sudo
のパスワードを尋ねるためのウィンドウを出すみたいなやつ。
なので、 ssh-askpass
のようなワードで調べると、X11とかその辺が引っかかるが、そもそも askpass
が何をするものなのかよくわからなかったので、書くことにした。
askpass を思い出したきっかけ
今の仕事で特権取得を自動化できないかというのが考え始めたきっかけで、RubyのCapistranoのことを考えていた。
ちょっと前まで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なエンジニアです。