-tフラグを使用してリモートシステムでコマンドを実行しています(コマンドがプロンプトを「ブロック」するのを防ぐために)(とにかくこのように動作します)。だから私は使用していますが、これを行うと、ssh -nq -t root@ip
スクリプトは私が使用している環境変数を見つけることができません。
なぜこれが起こり、それを防ぐ方法は何ですか?
答え1
編集する
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
リモートコンピュータに入ると実行中です。ログインシェルso~/.bash_profile
または(順番に)を読みます~/.bash_login
。リモートサーバーにログインして実行して確認できます。これにより、環境変数を読み取って設定する対話型シェルが起動します。~/.profile
bash
~/.bashrc
この問題を解決するには、代わりにこれを追加して~/.bash_profile
ください~/.bashrc
。
.bashrc
変数をローカルではなくリモートに設定したとします。輸出したい場合地元の変数の終わりssh
、参照協会出版社:Frederik Deweerdt。最も簡単な方法は、呼び出しに変数を含めることですssh
。
ssh -nq -t root@ip "FOO=foo BAR=bar"