それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

scpでコピーしたらパーミッションが保持される問題

SCPで転送したファイルのパーミッション

なんか、元サーバーのパーミッション設定が維持されるらしく

takuya@rena:~/Desktop$ ls -alt config.ini
----------+ 1 takuya staff 41  7 24 02:56 config.ini

とんでもないパーミッションのファイルが出来てた。

SCPはパーミッションが保持される。。。

WindowsCygwinSSHをインストールして、SCPコマンドでコピーした

サーバー側のパーミッションを確認

ssh  my-windows:  "ls -l ~/Desktop/config.ini"

----------+ 1 takuya None      39 717 20:22 config.ini

これを転送すると、 パーミッションが維持されたファイルが出来る

元のWindowsファイルは 書き込めない?いいえ書き込めます。

書き込めないファイルなら、その時に気づくのですが、書き込めるのです。

takuyaさんは、Administrativeなので、書き込めるのです。

このファイルをSCPで転送すると。。。やばい

takuya@rena:~/Desktop$ scp mine-win:~/Desktop/config.ini .
config.ini                                                                            100%   41     0.0KB/s   00:00

takuya@rena:~/Desktop$ ls -l config.ini
----------+ 1 takuya staff 41  7 24 01:30 config.ini

パーミッションが保持される。やばい

なんか、良く分からないエラーの温床になって、3時間ほど無駄にした。

ブラウザのファイルアップロードでファイル送ってるのにファイル取得できないので、おかしいと思ったらscp したファイルのパーミッションがおかしく、読み込み不可になっていた。なのでファイルが送信できてなかったというオチ。

ファイルアップロードに失敗するので、さんざんサーバー設定を見なおした私が馬鹿だった

man 見たけど解決法は書いてない

man scp したけど、permission のperm の文字すらない。

諦めるしかない。。。。のか?

とりあえず、解決方法が見つからないので、scp したファイルは 絶対パーミッションチェック を自分に課すことにしました。

SCPをちょっとだけラッパー

#!/usr/bin/env ruby
opts = []
args = []

ARGV.each.with_index{| e,i  | 
    if e.match /^-/ then 

        opts << e 
        e_next = ARGV[i+1]
        next unless e_next
        unless e_next.match(/~-/) then
            opts << e_next
            ARGV.delete_at(i+1)
            next
        end
    else
        args << e
    end

}



cmd = "scp #{opts.join(' ')}  #{args.join(' ')} > /dev/tty"
`#{cmd}`
puts `ls -l #{args.last}`

実行後に ls を強制することにした。

なんかもっと解決策いっぱいありそうなんだけど・・・

SCPの標準出力のプログレスもruby のpopen3 じゃ取得できないし。なんか、良く分からないことばかり

参考資料

http://scoop.simplyexcited.co.uk/2012/09/07/realtime-scp-output-with-ruby/