web-dev-qa-db-ja.com

ssh -nq -tが環境変数を認識できないのはなぜですか?

-tフラグ(コマンドが「ブロック」するのを防ぐため)を使用してリモートマシンでコマンドを実行しています。プロンプト(どういうわけかそのように機能します)。したがって、私はssh -nq -t root@ipを使用していますが、これを使用すると、スクリプトは使用している環境変数を見つけることができません。

なぜこれが起こっているのですか、どうすればこれを回避できますか?

1
Patryk

編集

以下の情報は、マシンにsshしてから、ログインシェルを開始するコマンドを実行した場合に有効です。

_ssh root@ip
echo $XXXX_LICENSE_FILE
_

sshコマンド(_ssh root@ip echo $XXXX_LICENSE_FILE_)から直接変数にアクセスしようとしている場合は、非ログイン、非対話型シェル。この場合、_~/.bash_profile_も_~/.bashrc_も読み取られません。 bashのマニュアルページから:

_   When bash is started non-interactively, to run a Shell script,
   for  example,  it looks for the variable BASH_ENV in the envi‐
   ronment, expands its value if it appears there, and  uses  the
   expanded  value  as  the  name  of a file to read and execute.
   Bash behaves as if the following command were executed:
          if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
   but the value of the PATH variable is not used to  search  for
   the file name.
_

最も簡単な回避策は、sshコマンドとともに変数を宣言することです。これを機能させるには、次の行をリモートの_/etc/ssh/sshd_config_ファイルに追加する必要があります。

_PermitUserEnvironment yes
_

次に、ローカルマシンからこれを実行します。

_XXXX_LICENSE_FILE=/etc/xxxx.lic && ssh -nq -t -t -t root@$ip /etc/init.d/xxxx.rc start
_

ここでの問題は、ログインシェルとインタラクティブシェルの違いです。素敵な要約については ここ を参照してください。

_~/.bashrc_は、インタラクティブ(非ログイン)シェルを開始するときにのみ読み取られます。リモートマシンにsshintoすると、loginシェルが実行されるため、_~/.bash_profile_または_~/.bash_login_または_~/.profile_(この順序で)が代わりに読み取られます。これを確認するには、リモートサーバーにログオンした後にbashを実行すると、インタラクティブシェルが起動し、_~/.bashrc_が読み取られ、環境変数が設定されます。

これを修正するには、_~/.bash_profile_ではなく_~/.bashrc_で変数を定義します。


ローカル変数ではなく、リモート_.bashrc_で変数を設定していると想定しています。 local変数をsshにエクスポートする場合は、Frederik Deweerdtによって投稿された link を参照してください。最も簡単な方法は、sshの呼び出しに変数を含めることです。

_ssh -nq -t root@ip "FOO=foo BAR=bar"
_
1
terdon