LoginSignup
9
12

More than 1 year has passed since last update.

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

Last updated at Posted at 2018-01-26

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
12