[小ネタ][シェル芸]sshでリモートホストのファイルとローカルホストのファイルをdiffする方法
みなさんこんにちは。(っ´∀`)っ ゃーこと濱田です。久々の小ネタです。リモートホストとローカルホストの同じファイルどうしでdiffを取る方法をメモしておきます。まずはコマンドと出力結果から見てみましょう。
[ (っ´∀`)っ@友の会 ~]$ ssh <相手先ホスト> cat /etc/httpd/conf.d/virtualhost.conf | diff -y - /etc/httpd/conf.d/virtualhost.conf Listen 80 Listen 80ServerName nullpopopo.blogcube.info ServerName nullpopopo.blogcube.info DocumentRoot /opt/hoge/nullpopopo.blogcube.info/public DocumentRoot /opt/hoge/nullpopopo.blogcube.info/public CustomLog /opt/hoge/nullpopopo.blogcube.info/logs/acce CustomLog /opt/hoge/nullpopopo.blogcube.info/logs/acce ErrorLog /opt/hoge/nullpopopo.blogcube.info/logs/error ErrorLog /opt/hoge/nullpopopo.blogcube.info/logs/error RPAFenable on RPAFenable on RPAFproxy_ips 127.0.0.1 xx.xxx.xxx.xxx yy.yyy.yyy.yy RPAFproxy_ips 127.0.0.1 xx.xxx.xxx.xxx yy.yyy.yyy.yy #RPAFsethostname on #RPAFsethostname on
こんな感じで差分確認することができます。
このコマンドの仕組みですが、パイプの左側で、リモートホストにssh接続してcatコマンドでファイルを開きます。まずはcatで開きます。大事なことなので2度言いました。「ssh <相手先ホスト> <コマンド>」で、相手先ホストで実行したコマンドをローカルホストの出力に返すことができます。
パイプの右側が、diffコマンドとなります。diffコマンドの引数「-y」はside-by-side 出力形式で出力しますよーって意味です。これは見栄えの好きずきなのであってもなくても構いません。その次に「-」と「ローカルホストのファイル名」でdiff比較しています。ここがミソです。
つまり、一度リモートホストでファイルを開いてローカルホストの標準出力に返し、標準出力とローカルホストのファイルを比較するというやり方です。
ここでもう1つ、/etc/nginx/conf.d 以下のファイルをリモートホストとローカルホストでmd5比較し、md5sumの値が違っていたらdiffを取るワンライナーをご紹介します。このブログを書いてるサーバはさくらのVPS2台で冗長構成を取っていますので、このワンライナーで差分比較をとっています。
[ (っ´∀`)っ@友の会 ~]$ REMOTEHOST=server1 ; LOCALHOST=server2 ; DIR=/etc/nginx/conf.d ; for CONFIG in $(ls ${DIR} | grep [0-9][1-9]_) do echo "--------------------------------------------------------------------------------------------------------------------------------" echo ${CONFIG} echo echo "${REMOTEHOST} ${LOCALHOST}" echo md5sum ${DIR}/${CONFIG} | awk '{print $1}' > aho ssh ${REMOTEHOST} md5sum ${DIR}/${CONFIG} | awk '{print $1}' | diff - aho > /dev/null || ssh ${REMOTEHOST} cat ${DIR}/${CONFIG} | diff -y - ${DIR}/${CONFIG} rm -f aho echo "--------------------------------------------------------------------------------------------------------------------------------" echo echo echo done
こんな風に、リモートホストのmd5sumコマンドで差分があったら(異常終了したら)diffの結果を出すという仕組みです。こういうワンライナーで仕事がかなり楽になるはずです。
【予告】2月16日 第3回シェル芸爆破デスマッチ勉強会&第21回餃子爆破定例会
USP友の会 上田怪鳥と将軍様の誕生日記念にシェル芸勉強会やります。講師は毎度おなじみUSP友の会上田会長、勉強会の後は餃子の王将で懇親会もやります。どんな勉強会なのかは、こちらをご覧ください。こくちーずで受講者絶賛募集中ですので、こちらからお申し込みください。
でわ~♪
[amazonjs asin=”4873112540″ locale=”JP” title=”入門bash 第3版”]