Shammer's Philosophy

My private adversaria

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>