発生事象
WinSCPのSFTPモードでファイルを転送すると以下のようなエラーメッセージが表示されることがある。
ファイル 'sample.txt' のアップロードは成功しましたが、パーミッション/タイムスタンプの設定中にエラーが発生しました.
問題が解決しない場合は、パーミッションの設定・タイムスタンプの設定を無効にするか、パーミッション設定時のエラーを無視するように設定してください。 ("権限がありません エラー コード: 3からのエラー メッセージ: Permission denied")"
解決策としてはこのキーワードで調べてみると分かるが、環境設定から「タイムスタンプの更新」を無効にする、というのがある。
デフォルトではパーミッションの書き換えはOFF / タイムスタンプの更新はONになっているが、何故タイムスタンプの更新でエラーが起こるのかが分からなかったのでちょっと調べてみた。
なお、対象はLinux (今回はCentOS7) で検証した。
発生原因
- ファイルの属するグループに対する書き込み権限はある
- ファイルのOwnerではない
例えば、以下のようなファイルがある場合、
- hoge ユーザーでアップロードした場合は問題が起きない
- apache グループに属している hoge 以外のユーザーでアップロードした場合は問題が起きる(ファイルは更新されるが、掲題のエラーが表示される)
- apacheグループに属していないユーザーはそもそもアップロードに失敗する
-rw-rw---- 1 hoge apache 10 4月 21 18:25 sample.txt
ちなみに同様のエラーについては
On some systems (e.g. Linux), you need to be an owner of the file (write permissions are not enough) to modify its permissions or timestamp (you will see an error like “Permissions denied” in error details).
https://winscp.net/eng/docs/message_preserve_time_perm
ファイルオーナーでないと失敗する、とWinSCPのドキュメントに記載されている。
なお、タイムスタンプとパーミッションの変更を無効にすればよい、と公式がこの方法で回避してくれとなっている。
Whatever the reason is, you need to turn off Set permissions and Preserve timestamp options or turn on Ignore permission errors.
ファイルオーナーでないと、何故タイムスタンプの書き換え だけ でもエラーが起こるのか、原因が知りたかったのだが……(それこそ、touchすれば更新できるぐらいのはずなのに)。
さすがにファイルのパーミッション書き換えはオーナーしかできてはまずいから、こっちを書き換えてるのであればエラーの説明はつくが……
結論
完全に推測になる点に注意。 正確なところを知ってる人がいれば教えて欲しい。
SFTPでタイムスタンプなどを変更するには preserve というコマンド(?のようなもの?)でタイムスタンプだけではなく、ファイルのパーミッションもまとめて更新するのではないかと思える。
これは sftp コマンドの man を見る限り、
-p Preserves modification times, access times, and modes from the
original files transferred.
となっているため。
で、ファイルのオーナー以外にはその権限がないためタイムスタンプ・ファイルそのもののパーミッションを変えようとしてエラーとなっているように見える。