Bashスクリプトでリモートコンピュータの環境変数を使用してリモートコンピュータのコマンドを作成するにはどうすればよいですか?

Bashスクリプトでリモートコンピュータの環境変数を使用してリモートコンピュータのコマンドを作成するにはどうすればよいですか?

Ubuntu 18でbashスクリプトを作成しようとしています。次のスクリプトがあります...

#!/bin/bash -l
  
ssh myuser@remote-machine 'mysql -u $DB_USER --password=$DB_PASS $DB_NAME < /tmp/dump.sql'

私の主な問題は、bashスクリプトを実行している環境ではなく、リモートシステムの環境に基づいて環境変数を解釈したいということです。今はmysqlコマンドが現在の環境を使用していると思います。リモートシステムの環境で環境変数を使用するにはどうすればよいですか?

答え1

ご質問のご意見で述べたように(テデンパク・シミ)、一重引用符を使用すると、コマンドはローカルに拡張されません。

しかし、引用符はリモート環境を埋めることができないかもしれませんman 1 ssh(太字のテキストは私のものです)。

もし注文する指定すると、リモートホストで実行されます。代わりにログインシェル。

ただし、リモートログインシェルは明示的に呼び出すことができます。

ssh myuser@remote-machine bash -lc \
  "'"'mysql -u "$DB_USER" --password="$DB_PASS" "$DB_NAME" </tmp/dump.sql'"'"

二重引用符に注意してください。コマンド全体が内部一重引用符でローカルに拡張されないようにし、リモートホストは一重引用符(外部二重引用符)で囲まれたコマンドを受け取り、次のようにBashに渡される前に拡張しないようにします。コマンド文字列の拡張と分割。

または、追加の引用なしsshで標準入力を介してコマンドを提供し、次のように呼び出してリモートログインシェルを取得することもできます。ssh いいえコマンドパラメータ:

echo 'mysql -u "$DB_USER" --password="$DB_PASS" "$DB_NAME" </tmp/dump.sql' |
  ssh -T myuser@remote-machine

-T標準入力が端末でない場合、割り当てられていない疑似端末に対する警告を防ぐために使用されます。

あなたの質問はBashに関するものなので、追加の便宜のためにここで文字列を使用することもできます。

ssh -T myuser@remote-machine <<<'mysql ...'

必要な実際のシェルの種類は、リモート環境設定方法によって異なります。として非対話型ログインシェル、Bashは複数のスクリプトをソースとして提供します(/etc/profile存在する場合)。最初~/.bash_profile、と~/.bash_loginの間に1つが見つかり、読むことが~/.profileできます~/.bashrc。 ;必要な環境変数を設定するファイルに基づいて実際のコマンドを調整する必要があるかもしれません。

関連情報