※ 件名がくどいんですが、自分がこういう観点で調べてしまって原因にたどりつくのに回り道をしてしまったので、同じように困っている方が見つけやすいようにこうしています。
まとめ
- シェルスクリプト内で別ユーザとしてコマンド実行したいときがある
- このとき、複数行をまとめて別ユーザとして実行しようとするときにヒアドキュメントを使うとクォートの仕方によって結果が変わるので注意が必要
- ヒアドキュメントは標準入力ではないことに注意
環境
Ubuntu 20.04.4 LTS
事例
aaa_userとしてログインしているときに下記コマンドでbbb_userとしてsuし、引数のコマンドを実行するcオプションでコマンドを渡すと、これはbbb_userとして実行されます。当然。
aaa_user$ su - bbb_user -c "whoami"
# → bbb_user
しかし、下記のように実行すると、実行したユーザのまま処理される。
aaa_user$ sudo su -l bbb_user <<EOF
echo `whoami`
EOF
# → aaa_user
これは、ヒアドキュメントが標準入力ではなく、suされるまでに読まれるためです。標準入力されるためですが、挙動の理由をうまく説明できないので割愛させてください。
(誤解していて誤った内容を書いていました。ご指摘ありがとうございます。また調べて説明できるようになりましたら追記します)
詳しくはこちら bashのヒアドキュメントを活用する -Qiita
下記のようにシングルクォーテーションで囲むと期待通りに動きます。
ほか、変数などもログインユーザのままわたるので注意が必要です。
aaa_user$ sudo su -l bbb_user <<'EOF'
echo `whoami`
EOF
# → bbb_user
雑感
これにはまったのは、linuxサーバでのデプロイスクリプトを考えていたときです。
安全にデプロイするためにアプリケーションファイルやデプロイスクリプトなどどういう所有者・権限でやるべきか悩んでいます。
いろんな会社がやっているはずですが、あまりプラクティスが共有されていないように思っています。よいドキュメントや記事がありましたらお知らせください。