
sudo
親シェルプロセスから環境を継承してコマンドを実行できますが、sudo su
rootユーザー以降のシェルプロセスは実行できないのはなぜですか?t@ocean:/tmp$ export ME=tim t@ocean:/tmp$ sudo echo $ME tim t@ocean:/tmp$ sudo su root@ocean:/tmp# echo $ME root@ocean:/tmp# exit
環境は親プロセスから子プロセスに継承されますか?
sudo su
rootユーザーの後のシェルプロセスは、古いユーザーのシェルプロセスのサブプロセスですか?
ありがとうございます。
答え1
環境変数の拡張はシェルで行われるため、実際に実行するコマンドは「sudo echo tim」です。これらのタスクはすべてsudoが実行される前に完了します。
答え2
変数の拡張は対話式シェルによって実行されます。
sudo
引数とともにecho
コマンドを実行していますtim
。呼び出されるシェルで拡張が行われるようにするには、シェルを実行してそのシェルにsudo
文字列を渡すように指示します。echo $ME
sudo sh -c 'echo $ME'
sudo
状況によってはセキュリティリスクが発生する可能性があるため、ほとんどの変数を環境から削除してください。詳細については、マニュアルと機械の構成を参照してください。一般的な構成では、変数がME
環境から削除されるため、sudo sh -c 'echo $ME'
何も印刷されません。プロセスの環境は、親プロセスが変更することを決定しない限り、親プロセスのコピーです。 (より正確には、環境は次に渡されます。
execve
;ほとんどのプログラムは彼らが持っているすべてを経験します。 ) Sudo は環境を変えることを決めたプログラムの一つです。を実行すると、
sudo su
シェルが実行されます(コマンドをに渡さなかったためsu
)。シェルプロセスの親プロセスは、呼び出しプロセスsudo
、つまりコマンドを実行したシェルですsudo su
。