Bash
SSH

多段sshで環境変数を利用する方法

目的

  • 踏み台サーバー(要塞サーバー)からしかアクセスできないサーバーにローカル環境から簡単に確認をしたい
  • いわゆる多段sshでのダブルクォーテーション・シングルクォーテーションの使い方

結論

ローカル環境の環境変数は""で囲まれた中なら使える
クォーテーションが必要な部分がローカル環境でも取得できるならこの方法で実現

target_date=`date -v-2d +%Y%m%d` # 一昨日の日付
ssh bastion "ssh goal_server \"ls -ltr /var/log/goal_server/*${target_date}*.log\""

経緯

ローカル環境はmacOS、ssh先はすべてCentOS(Linux)を前提としています。

クォーテーションを使用しない場合、参考urlに載せたようにヒアドキュメントを利用すると簡潔にコマンドを書くことができます。

cat <<EOS | \ssh bastion 'ssh goal_server sh'
hostname # goal_serverと表示
EOS

環境変数として日付を利用したく、dateコマンドで「昨日」や一「昨日」が欲しい場合にはクォーテーションで囲む必要があり、
最初は環境変数をgoal_serverで得てから実行すればできると思ったが、target_dateには何もセットされない。

# ダメ  # 一昨日の日付
cat <<EOS | ssh bastion 'ssh goal_server sh'
'target_date=`date -d "2 days ago " +%Y%m%d`; ls -lr /var/log/goal_server/*${target_date}*.log'
EOS

ローカル環境の環境変数は""で囲まれた中なら使えることを利用し、
クォーテーションが必要な部分がローカル環境でも取得できるならこの方法で実現

target_date=`date -v-2d +%Y%m%d` # 一昨日の日付
ssh bastion "ssh goal_server \"ls -ltr /var/log/goal_server/*${target_date}*.log\""

参考url

SSHでリモートにコマンド実行する方法とその際にクォーテーションのエスケープを気にしないようにする方法