Ubuntu 20.04 on EC2 で runuser や sudo -i 実行時に .bashrc が読み込まれないんだけど
Ubuntu 20.04 on EC2 で runuser や sudo -i 実行時に .bashrc が読み込まれない
Lambda 関数より AWS Systems Manager の SendCommand を使用して、Ubuntu 20.04 on EC2 で任意のコマンドを実行させようとしてました。
因みに、AWS Systems Manager の SendCommand についてドキュメントでは以下のように記載しています。
AWS Systems Manager - SSM エージェント を介してルートレベルコマンドへのアクセスを制限する
SSM エージェント は、root アクセス権 (Linux) または SYSTEM アクセス権 (Windows Server) を使用して Amazon Elastic Compute Cloud (Amazon EC2) インスタンスで実行します。最高レベルのシステムアクセス権限が存在するため、SSM エージェント にコマンドを送信する権限が付与されている信頼されたエンティティには root または SYSTEM アクセス権限があります。(AWS では、AWS のアクションを実行してリソースにアクセスできる信頼されたエンティティは、プリンシパルと呼ばれます。AWS アカウントのルートユーザー、IAM ユーザー、またはロールをプリンシパルにすることができます。
上記の記述のように、AWS Systems Manager の SendCommand は root
アカウントで実行されます。
一方で、AWS の Ubuntu 20.04 の AMI のデフォルトユーザーは ubuntu
です。
各種モジュールのインストールやパスが通っているのも ubuntu
ユーザー なので、ubuntu
ユーザーに切り替えてコマンドを実行するため、以下のようなコマンドを SendCommand で実行しようとしました。
runuser -l ubuntu -c "python ~/analyze.py"
しかし、実行結果はコマンドが存在しないといったエラーでした。
sudo -i
コマンドも使ってみましたが、結果は同じでした。
どうやら path など環境変数を設定したりしている .bashrc
が読み込まれていないのが原因のようでした。( .profile
は読み込まれていました)
Ubuntu 20.04 on EC2 で runuser や sudo -i 実行時に .bashrc が読み込まれない原因
どうやらデフォルトで .bashrc
ファイルの先頭にシェルの実行オプションに対話型シェルを示す i オプションが含まれていない場合、.bashrc
の読み込みをキャンセルする処理がありました。
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
runuser
も sudo -i
も対話型シェルとなるため、.bashrc
が読み込まれていませんでした。
Ubuntu 20.04 on EC2 で runuser や sudo -i 実行時に .bashrc が読み込まれない回避策
試しに、該当の処理を消すとコマンドは実行できました。
しかし、元々あった該当の処置を削除していいのか判断がつかなかったため、自分は .profile
に実行に必要な諸々の定義を移して対応しました。
個人開発したサービス