suを介してログインした後にユーザーに環境変数をエクスポートする

suを介してログインした後にユーザーに環境変数をエクスポートする

次のエイリアスが正確に何をしているのかを理解しようとしています。COUNTERユーザーが環境変数を使用できるようにするようnobodyですが、sshを使用するとCOUNTER=${COUNTER}前にSendEnv COUNTERパニックになります。マニュアルページを確認しましたが、何も知りません。

COUNTER=280
...
alias run='COUNTER=${COUNTER} ssh nobody@localhost -o "SendEnv COUNTER"'

SSHなしでこのエイリアスを書き直したいです(無効になっているため)。私が試したことは次のとおりです。しかし、もともとエイリアスの機能を正確に理解していないと、私がやっていることが正しいかどうかはわかりません。

alias run='su - nobody -c "export COUNTER=${COUNTER}"'

答え1

  1. プログラムが実行される前に、同じ行/同じステートメント内の変数に値を割り当てます。一時的に実行中のプログラムの環境に変数をエクスポートします。これは変数をエクスポートする1​​つの方法です。唯一のプログラム- プログラムが実行されると、そのプログラムはもはや環境に存在せず、後続のプログラムに影響を与えたり使用することはできません。

    COUNTER=${COUNTER} ssh ...$COUNTERを独自に設定し、一時的に環境にエクスポートした後ssh

    中かっこや引用符COUNTER=$COUNTERは100%等しいので、その目的を理解していない人が書いたCOUNTER="$COUNTER"ものかもしれません。この特別なケースでは、なぜこれを実行したくないのかわかりません。バラより$VAR対${VAR}と引用

  2. -o "SendEnv COUNTER"リモートサーバーに送信する必要があるローカル環境変数をssh知らせるオプション。sshデフォルトではTERM送信のみです(そして、リモートシェル/プログラムを入力してその出力を見ることができる対話型SSH接続など、aa ptyが要求されている場合にのみ)。からman ssh_config

    SendEnv

    environ(7)サーバーに送信するローカル変数を指定します。サーバーもこれをサポートする必要があり、サーバーはこれらの環境変数を受け入れるように構成する必要があります。TERM擬似端末が要求されるたびに、環境変数は常にプロトコルの要求に従って送信されます。サーバーの構成方法の詳細については、を参照してくださいAcceptEnvsshd_config(5)変数は、ワイルドカード文字を含めることができる名前で指定されます。複数の環境変数をスペースで区切ったり、複数のSendEnvディレクティブに分散したりできます。

    パターンの詳細については、パターンを参照してください。

    以前に設定されたSendEnv変数名は、パターンプレフィックスを追加することで消去できます-。デフォルトでは、環境変数は送信されません。

    リモートサーバーは、転送された変数を許可するように設定されていない限り、転送されたすべての変数を無視して無視できます。デフォルトではTERM.fromのみが許可されていますman sshd_config

    AcceptEnv

    クライアントが送信した環境変数をセッションにコピーすることを指定しますenviron(7)。クライアントの設定方法については、SendEnvおよびSetEnvを参照してください。クライアントが疑似端末を要求するたびに、環境変数はプロトコルで必要なため、常に許可されます。ssh_config(5)TERM

    変数は名前で指定され、ワイルドカード文字 *?。複数の環境変数をスペースで区切ったり、複数のAcceptEnvディレクティブにデプロイしたりできます。特定の環境変数は、限られたユーザー環境をバイパスするために使用できます。したがって、このディレクティブを使用するときは注意が必要です。デフォルトでは、環境変数は使用できません。

    つまり/etc/ssh/sshd_config、リモートサーバー(実際にはlocalhost意味COUNTER=${COUNTER} ssh nobody@localhost -o "SendEnv COUNTER"です)。ssh nobody@localhost

  3. su - nobody -c "export COUNTER=${COUNTER}export COUNTER=${COUNTER}ユーザーNoneとして実行してから終了します(オプションがコマンドを実行するように指示するため)-csu変えるシェルを提供するだけでは、シェルを提供するまで実行されません。)試してCOUNTER="$COUNTER" su - nobodyみてください。または、export COUNTER実行しているすべてのプログラムの環境に置いてください。

関連情報