RubyとSCP / SSHを使用して、コピーをアップロードする前にファイルが存在するかどうかを確認する方法
-
06-07-2019 - |
質問
SCPを使用してファイルをリモートサーバーにアップロードしていますが、その前にそのファイルが存在するかどうかを確認する適切な方法は何ですか?
解決
check-then-uploadに注意してください:これはアトミックではなく、競合状態(またはTOCTOUの脆弱性)につながる可能性があります。
前に進むより良い方法は、アップロードされたファイルにファイル許可を設定して、書き込み不可(UNIXのようなシステムでは400または444または同様)にすると、その後の同じファイル名へのアップロードは単に失敗します。 (「許可が拒否されました」というメッセージが返されますが、これは少し解釈される場合があります(たとえば、アップロードディレクトリのアクセス許可が変更されましたか?)。これはこの方法の欠点です)。
リモートファイルに権限を設定するにはどうすればよいですか?これを行う最も簡単な方法は、ローカルファイルにそれらを設定し、アップロードするときにそれらを保持することです。 RubyのNet :: SCP README は、確かに「転送間でファイル属性を保持する」。
他のヒント
scpではこれを実行できません。ただし、 sftpを使用して実行できます。 次のようになります:
require 'net/sftp'
remote_path = "/path/to/remote/file"
Net::SFTP.start('host', 'username', :password => 'password') do |sftp|
sftp.stat!(remote_path) do |response|
unless response.ok?
sftp.upload!("/path/to/local/file", remote_path)
end
end
これは間違いなくあなたの質問を解決し、追加情報も提供します。 http://ruby.about.com/od/ssh/ss/netscp.htm
所属していません StackOverflow