ルートの場合は、他のユーザーの ~/.bashrc をインポートし、すべての環境変数を取得します。

ルートの場合は、他のユーザーの ~/.bashrc をインポートし、すべての環境変数を取得します。

ルートとして実行される小さなシステムアプリケーションを開発しようとしています。このアプリケーションでは、デフォルトユーザー($USERアプリケーションをrootとして実行しているユーザーではない)のすべての環境変数を一覧表示します$SUDO_USER。アプリケーションは端末で実行されず、Qt環境からCで開かれたプロセスに依存するため、まず環境を準備してから、その子プロセスから環境変数を取得したいと思います。

私が達成しようとしているものは次のとおりです。

  • ルートからユーザーに変更
  • ソース ~/.bashrc または ~/.profile など
  • printenv [そしてスクリプトの後にインポートされます]
  • 再びルートに変更

私はオンラインでいくつかの回避策を見つけて読んでいましたが、これらの回避策(他のユーザーでコマンドを実行している場合)が私が望む結果に役立たないことに気づきました。

上記の作業を行うにはラインが必要です。私が今持っているものは次のとおりです(rootとして実行しています)。

sudo -i -u user sh -c '. /home/user/.bashrc && printenv > /tmp/user.env'

一部の環境変数は表示されますが、/home/user/.bashrcからエクスポートされたカスタム変数は表示されません。

どんな案内にも感謝します。

情報が欠落している場合はお知らせください。

ありがとう、

ベストアンサー1

あなたのコマンドを試してみましたが、検索するだけです。

sudo -i -u user1 sh -c 'source ~/.bashrc && printenv > /tmp/user.env'

使った源泉代わりにコマンド.

含む~/.bashrc:

[ws] root ~ >cat /home/user1/.bashrc 
# .bashrc
...
export TESTENV="test"
...

コマンドを実行し、以下を表示します/tmp/user.env

[ws] root ~ >sudo -i -u user1 sh -c 'source ~/.bashrc && printenv > /tmp/user.env'

[ws] root ~ >cat /tmp/user.env 
...
SHELL=/bin/bash
USER=user1
SUDO_COMMAND=/bin/bash -c sh -c source\ ~/.bashrc\ &&\ printenv\ >\ 
...
TESTENV=test
...
[ws] root ~ >

おすすめ記事