質問: 下記サイトを参考にして、deploy scriptを書きましたが下記エラーにより失敗してしまいます。 deploy script ``` sudo rm -rf /var/www/html/[project-name] sudo mkdir /var/www/html/[project-name] sudo cp -pr /home/[user-name]/temp/* /var/www/html/[project-name] ``` エラー ``` sudo: no tty present and no askpass program specified sudo: no tty present and no askpass program specified sudo: no tty present and no askpass program specified exit status 1 ``` `sudo`を取るとpermission deniedが出てしまいます。これはおそらく/var/ディレクトリのアクセス権限のせいですが。 本当は、例のようにデプロイする前にnginxをstopしたいのですが、下記のようにrootで起動しているようでできません。 ``` root 517 0.0 0.2 15096 2276 ? Ss 21:36 0:00 nginx: master process nginx ``` この場合はどのように書けばいいのでしょうか。またなぜ例では`sudo`が記入されていないのでしょうか。 追記 OSはDebianです
回答: > > sudo: no tty present and no askpass program specified > > > これは sudo がパスワードを要求しようとしたが、端末(tty)が利用できず、他のパスワード入力手段も設定されていない、というエラーです。今回の場合いずれにせよその場でパスワードを入力することはできないでしょうから、パスワードなしで sudo を実行できるよう設定することで回避するぐらいでしょうか。 もしこの方法を採るのであれば、一連の処理をまとめたスクリプトを書いた上で、SSH に使うユーザーかつそのスクリプトのみをパスワードなしで実行できるようにするとより安全です。 * 特定のコマンドをパスワードなしでsudo する設定 - Slow Dance * How do I sudo a command in a script without being asked for a password? - Ask Ubuntu nginx は init スクリプトで起動したのだろうと思います。この場合 `service stop nginx` `service start nginx` などとして操作できると思いますが、これも root 権限が必要です。 そしてご想像の通り、drone.io から ssh させるユーザーに適切なアクセス権が与えられていれば、sudo は不要になります。サンプルスクリプトで sudo が使われていないのもそのためでしょう。 まとめると、 * デプロイ先のパーミッションを適切に設定し、手動で nginx を起動停止するようにする → sudo 不要。drone.io のドキュメント通りで動くはず * パーミッションそのまま or 現状通り nginx の起動を init に任せる → sudo が必要なので、NOPASSWD の設定を行う のどちらかになるかと思います。