おぼえがき。タイトルに他意はございません。
sshコマンドでログインせずにリモートでコマンド実行したいときの方法。
普通に実行しようとするとtty(端末)がないよって怒られるので、それに対する対処。
※20150424追記
よくよく考えてみたら、こんなことしなくてもansibleが使えるならansibleの-Kを使ってリモートでsudoできるような気がした。
大量のサーバ宛にコマンド実行するときはそっちのほうが確実かも、と下記のやり方をやってシェルスクリプト書こうとしてハマって思いました。
作業したいリモートサーバが1台とかで、簡単なファイル内容の確認程度とかそういうのだったら下記のほうが楽かも。
sshのtオプションを使う
ローカルからホスト名「hogehoge」の端末上でコマンド実行することを想定
hogehogeのところを任意のホスト名やIPアドレス、sudo以下のコマンドのところを実行したい任意のコマンドに変更すればいけるはず。
当然のことながら、対象のホストにログインする権限や、ホスト上で実行したいコマンドを実行できる権限がなければうまくいきません。
ssh -t hogehoge sudo ls -l
こんな感じにするとsudoのパスワードを求められるので、入力してやれば該当のコマンドが実行できるはず。
システムの制約上sudoersを変えられない時もあると思うのでこれでうまく行くときは基本これでいいと思います。たぶん。
sudoersを編集する
セキュリティリスクがありますが、それを許容するならこちらも。
/etc/sudoers
の中にDefaults requiretty
という記述があるので、それをコメントアウトするかDefaults !requiretty
と記載する方法。
ただ、セキュリティホールを突かれてsudoされる恐れがあるので全ユーザ・全コマンドでこの設定にするのは好ましくないです。
そこで、まずユーザを限定します。cronのスクリプトなどで実行したい場合は専用のユーザを作っておくといいと思います。
下記はhogeユーザを指定した場合。
Defaults:hoge !requiretty
さらに、該当ユーザがsudoで実行できるファイルを制限するには
hoge ALL=(ALL) NOPASSWD: /opt/bin/test.sh
といった感じ。/opt/bin/test.sh
に権限を絞りました。
セキュリティのために設定されているところを変えることになるので、与える権限は最小限に。