1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

シェルスクリプトのヒアドキュメント利用における注意点(別ユーザとしてコマンド実行するときなど)

Last updated at Posted at 2022-05-19

※ 件名がくどいんですが、自分がこういう観点で調べてしまって原因にたどりつくのに回り道をしてしまったので、同じように困っている方が見つけやすいようにこうしています。

まとめ

  • シェルスクリプト内で別ユーザとしてコマンド実行したいときがある
  • このとき、複数行をまとめて別ユーザとして実行しようとするときにヒアドキュメントを使うとクォートの仕方によって結果が変わるので注意が必要
  • ヒアドキュメントは標準入力ではないことに注意

環境

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サーバでのデプロイスクリプトを考えていたときです。
安全にデプロイするためにアプリケーションファイルやデプロイスクリプトなどどういう所有者・権限でやるべきか悩んでいます。

いろんな会社がやっているはずですが、あまりプラクティスが共有されていないように思っています。よいドキュメントや記事がありましたらお知らせください。

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?