vsftpd で 553 Could not create file が出るが・・・
あちこちに散乱しているような情報だが。自分の環境で ftp でデータコピーをしようと思ったが、553 Could not create file で失敗する。とりあえず、疑わしい以下の点を確認。
- ログイン時のユーザーの権限に問題はないか
- SELinux のせいじゃないか
ログイン時には、root を使用せず local_enable=YES をしていて、root じゃない別のユーザーでログインしている。当然、権限は問題ない。また、
# dpkg -l selinux-basics dpkg-query: no packages found matching selinux-basics
であり、SE Linux のせいでもない。vsftpd で、ascii_upload_enable=YES と write_enable=YES になっていることも確認。それでもうまくいかず。。。
でも、うまくいかない場合はうまくいかない原因があるもの。盲点だったのは、アップロード先はログインしたユーザーのホームディレクトリになる、と勝手に思い込みをしていたこと。CLI で操作しているのだが、以下のように remote の PATH を省略するとローカルと同じ場所にアップロードするようだ。
ftp> put Downloads/test.tar.gz local: Downloads/test.tar.gz remote: Downloads/test.tar.gz ...
ローカル側は root で、実際には /root/Downloads/test.tar.gz を upload しようとしていた。接続先もログイン時には root じゃないユーザーを使用し、pwd でその root じゃないユーザーのホームディレクトリが表示されているので、てっきりそのユーザーのホームディレクトリがアップロード先と思っていたが、アップロード先を省略した場合はローカルの絶対 Path と同じディレクトリにアップロードするようだ。アップロード先もしっかり指定しないといけない。以下のようにすることでアップロードできた。エラー時のものも掲載。
ftp> put Downloads/test.tar.gz local: Downloads/test.tar.gz remote: Downloads/test.tar.gz 227 Entering Passive Mode (10,1,1,101,154,242). 553 Could not create file. ftp> put Downloads/test.tar.gz /home/ftpuser1/test.tar.gz local: Downloads/test.tar.gz remote: /home/ftpuser1/test.tar.gz 227 Entering Passive Mode (10,1,1,101,156,77). 150 Ok to send data. 226 Transfer complete. 59020082 bytes sent in 0.52 secs (109808.4 kB/s) ftp>