親シェルに戻ることなく、他のユーザーとしてコマンドを使用してbashサブシェルを実行します。

親シェルに戻ることなく、他のユーザーとしてコマンドを使用してbashサブシェルを実行します。

私の追求の一環としてroot以外のユーザーに切り替えるときにbashrcとvimrcを維持する、私は他のユーザーに切り替えるために非常に醜いエイリアスを作成し、すぐにいくつかのコマンドを実行し、プロンプトから私を削除する予定です。

("super") シェルにすぐに戻らず、初期コマンドを使用して対話型 bash サブシェルを実行します。私の質問に答えないようです。bash --init-file <(echo "ls; pwd; a=7")期待どおりに動作しますが、sudo bash --init-file <(echo "ls; pwd; a=7")何も返しません。echo $aOR から端末には何も印刷されません。lspwd

最初のコマンドは機能しますが、2番目のコマンドは機能しないのはなぜですか?環境変数を継続的に変更し、そのシェルにアクセスする他のユーザーのシェルでコマンドを実行するbashコマンドをどのように作成できますか?これは、すでにroot以外のユーザーに切り替えるのに適しています。ルートに対するさまざまなソリューション

答え1

% echo <(echo "ls; pwd; a=7")
/proc/self/fd/11
% bash
$ echo <(echo "ls; pwd; a=7")
/dev/fd/63

したがって、<(...)フォームは実際には他のプロセスでは使用できないシェル固有のファイル記述子へのパスです。特に一つはbash実際にパイプです。

$ function hmm() { ls -al $1; }
$ hmm <(echo pwd)
lr-x------ 1 jhqdoe jhqdoe 64 Aug 21 14:58 /dev/fd/63 -> pipe:[910134]

sudoセキュリティ上の理由から、基本的にこれらのファイル記述子をすべて閉じようとしています(--close-fromオプションのマニュアルを参照sudo(8))。その時点で、これらのファイル記述子の1つを変更できます(セキュリティポリシーで許可されリスクがある場合closefrom_override--close-from

別の方法は、いくつかのコマンドを実行した後にそれを使用expectしてユーザーに渡すことです。

#!/usr/bin/env expect
spawn -noecho bash
expect -ex {$}
send "pwd\r"
expect -ex {$}
interact

関連情報