Capistrano でも sudo したい!
概要
ある晴れた日のこと。内部で sudo してる Capistrano のレシピを実行したら、こんな風に怒られた…
sorry, you must have a tty to run sudo
deploy.rb に
set :use_sudo, true
と書くだけでは sudo は使えないのかな?
解決方法
これは deploy.rb の中で
default_run_options[:pty] = true
と書けば動くようになった。
原因と理由
まず tty って何?
tty でググると…
ttyとは、標準入出力となっている端末デバイス (制御端末、controlling terminal) の名前を表示するUnix系のコマンドである。
って Wikipedia に書いてある。
つまりは you must have a tty to run sudo
ってのは「端末がないとダメよ。」ってことらしい。
じゃあどうしたらいいの?
そこで deploy.rb に default_run_options[:pty] = true
と記述する。
内部的には ssh -t
コマンドが呼ばれるらしい。
ssh コマンドに -t オプションを付けると…
強制的に仮想端末を割り当てます。これはリモートマシン上で任意の画面ベースのプログラムを実行するとき(たとえば、メニューサービスを実装するときなど)に非常に便利です。複数の-t をつけると、たとえssh がローカル側での端末を持っていない場合でも強制的に仮想端末を割り当てます。
となる。仮想端末 (pseudoterminal, pty) を割り当てるので問題解決になるわけね。