[小ネタ][シェル芸]sshでリモートホストのファイルとローカルホストのファイルをdiffする方法


みなさんこんにちは。(っ´∀`)っ ゃーこと濱田です。久々の小ネタです。リモートホストとローカルホストの同じファイルどうしでdiffを取る方法をメモしておきます。まずはコマンドと出力結果から見てみましょう。

[ (っ´∀`)っ@友の会 ~]$  ssh <相手先ホスト> cat /etc/httpd/conf.d/virtualhost.conf | diff -y - /etc/httpd/conf.d/virtualhost.conf
Listen 80							Listen 80
					
    ServerName 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版"]