複数のサーバを保守運用していると、
Permissionの問題やら、差分のあるなしの確認やらでいろいろ面倒なことがある。
都度、解決した方法について自分でノートに書き留めていたが、
そろそろちゃんとした形にしないとノートが見辛い。ということでここに残すことにした。
scpでPermission deniedになるファイルを転送する
リモートのファイルをlocalに転送しようとすると、
Permissionの問題でエラーになることがある。
残念ながらscpコマンドは標準でsudoを使うことができない。
$ scp TargetServer:/tmp/sample /tmp/sample
scp: /tmp/sample: Permission denied
$
しかし、1ファイルだけだったらsshでsudoでcatする、標準出力を使って事実上の転送すればいいじゃないか。scpだけが転送ツールじゃない。
普通にsshでつなぎsudoでcatする。当然sudoersへの登録は必要。
$ ssh TargetServer "sudo cat /tmp/sample" > /tmp/sample
$
また、ddコマンドを使っても代用できる。
$ ssh TargetServer "sudo dd if=/tmp/sample" | dd of=/tmp/sample
0+0 レコード入力
0+0 レコード出力
0 バイト (0 B) コピーされました、 3.3649e-05 秒、 0.0 kB/秒
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.212011 s, 0.0 kB/s
$
リモートのファイルとdiffで差分を取る
localのファイルがリモートと正しいか、確認したいが、
デフォルトでdiffコマンドではリモートと差分をとるオプションがない。
しかし、どうしても差分を取りたいことはよくある。
ssh TargetServer "cat $remoteFilename" | sudo diff - $filename
diff - オプションを使えば、
標準出力と差分を取ることができる。
リモートのファイルを標準出力させ、localのファイルと差分を取る。
という仕組み。
$ ssh TargetServer "cat /etc/logrotate.d/test" | diff - /tmp/test
6,8d5
< #added
$