かべぎわブログ

技術的なことについてかけたらいいな…

sshコマンドでシェル変数を扱うときはエスケープすること【シェルスクリプト】

シェルスクリプトを書いていてひさしぶりにハマってしまったのでメモ。

つまったこと

sshコマンドをつかってリモート先のシェル変数を実行したい。

たとえばホスト名が「LOCALSVR」というサーバから「REMOTESVR」というサーバへsshで以下のようなコマンドを実施したとする。

[root@LOCALSVR]# ssh REMOTESVR echo ${HOSTNAME}

当然「REMOTESVR」とかえってくると思ったのだが、こたえはそうではなくて「REMOTESVR」となる。

[root@LOCALSVR]# ssh REMOTESVR echo ${HOSTNAME}
LOCALSVR

なぜか?

なぜこんなことになるかというとどうやらシェル変数がssh先に渡されるより前に展開されてしまっているっぽい。

解決策

これを解決するためにはssh先にわたしたいコマンドをシングルクォートでくくるか、変数を示す$マークをエスケープしてあげれば大丈夫みたい。
具体的には以下のような感じ。

  • シングルクォートでコマンドをくくる場合
[root@LOCALSVR]# ssh REMOTESVR 'echo ${HOSTNAME}'
REMOTESVR
  • $をエスケープする場合
[root@LOCALSVR]# ssh REMOTESVR echo \${HOSTNAME}
REMOTESVR