私の追求の一環としてroot以外のユーザーに切り替えるときにbashrcとvimrcを維持する、私は他のユーザーに切り替えるために非常に醜いエイリアスを作成し、すぐにいくつかのコマンドを実行し、プロンプトから私を削除する予定です。
("super") シェルにすぐに戻らず、初期コマンドを使用して対話型 bash サブシェルを実行します。私の質問に答えないようです。bash --init-file <(echo "ls; pwd; a=7")
期待どおりに動作しますが、sudo bash --init-file <(echo "ls; pwd; a=7")
何も返しません。echo $a
OR から端末には何も印刷されません。ls
pwd
最初のコマンドは機能しますが、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