Linux
scp
diff

scpでPermission deniedになるファイルを無理やり転送する

複数のサーバを保守運用していると、
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
$