SSHコマンドをローカルで実行するときにリモートコンピュータの環境変数を参照する方法は?

SSHコマンドをローカルで実行するときにリモートコンピュータの環境変数を参照する方法は?

リモートサーバー(Cent OS 7)でコマンドを実行し、そのサーバーで定義されている環境変数を使用したいと思います。ただし、このコマンドを実行すると

ssh [email protected] "PGPASSWORD=$DB_PASS psql -U $DB_USER -d $DB_NAME -c 'COPY myapp_currencyprice to STDOUT WITH (DELIMITER \",\", FORMAT CSV, HEADER)' > /tmp/prices.csv"

コマンドが「remotehost.com」ではなく、localhostの「$ DB_PASS」やその他の環境変数を使用したいようです。リモートサーバーで環境変数を参照する正しい方法は何ですか?

答え1

ローカルシェルが文字列を取得しないようにするには、単一引用符を使用する必要があります。

ssh [email protected] 'stuff here...'

その後、内部引用符を置き換える必要があります。

ssh [email protected] 'PGPASSWORD=$DB_PASS psql -U $DB_USER -d $DB_NAME -c "COPY myapp_currencyprice to STDOUT WITH (DELIMITER \",\", FORMAT CSV, HEADER)" > /tmp/prices.csv'

.bash_profileただし、対話型シェルを使用していないため含まれていないため、まだ機能しません。この時点で最も明白な解決策は、これを明示的に含めることです。

ssh [email protected] '. .bash_profile; PGPASSWORD=$DB_PASS psql -U $DB_USER -d $DB_NAME -c "COPY myapp_currencyprice to STDOUT WITH (DELIMITER \",\", FORMAT CSV, HEADER)" > /tmp/prices.csv'

さまざまな種類の引用符の違いを理解するには、これら2つの参考文献を見つけてください。

答え2

(コメントはterdonによって提案された答えに変換されました...)

ローカル拡張を防ぐには、$記号をエスケープしてみてください。良い

"PGPASSWORD=\$DB_PASS psql -U \$DB_USER -d $DB_NAME ..."

あなたのコメントで述べたように、正確に機能しないものは何ですか?また、コマンドを一重引用符で囲みましたか?どちらかを選択してください。

関連情報