Edited at

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

More than 1 year has passed since last update.

複数のサーバを保守運用していると、

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
$