継承環境におけるsudoとsuの違い

継承環境におけるsudoとsuの違い
  1. sudo親シェルプロセスから環境を継承してコマンドを実行できますが、sudo surootユーザー以降のシェルプロセスは実行できないのはなぜですか?

    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
    
  2. 環境は親プロセスから子プロセスに継承されますか?

  3. sudo surootユーザーの後のシェルプロセスは、古いユーザーのシェルプロセスのサブプロセスですか?

ありがとうございます。

答え1

環境変数の拡張はシェルで行われるため、実際に実行するコマンドは「sudo echo tim」です。これらのタスクはすべてsudoが実行される前に完了します。

答え2

  1. 変数の拡張は対話式シェルによって実行されます。sudo引数とともにechoコマンドを実行していますtim。呼び出されるシェルで拡張が行われるようにするには、シェルを実行してそのシェルにsudo文字列を渡すように指示します。echo $ME

    sudo sh -c 'echo $ME'
    

    sudo状況によってはセキュリティリスクが発生する可能性があるため、ほとんどの変数を環境から削除してください。詳細については、マニュアルと機械の構成を参照してください。一般的な構成では、変数がME環境から削除されるため、sudo sh -c 'echo $ME'何も印刷されません。

  2. プロセスの環境は、親プロセスが変更することを決定しない限り、親プロセスのコピーです。 (より正確には、環境は次に渡されます。execve;ほとんどのプログラムは彼らが持っているすべてを経験します。 ) Sudo は環境を変えることを決めたプログラムの一つです。

  3. を実行すると、sudo suシェルが実行されます(コマンドをに渡さなかったためsu)。シェルプロセスの親プロセスは、呼び出しプロセスsudo、つまりコマンドを実行したシェルですsudo su

関連情報