-tフラグ(コマンドが「ブロック」するのを防ぐため)を使用してリモートマシンでコマンドを実行しています。プロンプト(どういうわけかそのように機能します)。したがって、私はssh -nq -t root@ip
を使用していますが、これを使用すると、スクリプトは使用している環境変数を見つけることができません。
なぜこれが起こっているのですか、どうすればこれを回避できますか?
編集
以下の情報は、マシンに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
_は、インタラクティブ(非ログイン)シェルを開始するときにのみ読み取られます。リモートマシンにssh
intoすると、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"
_