环境

Linux 发行版: Centos 7.7.1908
ftp 版本:vsftpd-3.0.2

前提

今天,在学习「鸟哥的 Linux 私房菜」中,发现自己在登录 FTP 时,根本登录不上去,疯狂的显示 530 错误,特此记录一下 。

提出问题

下面是这段代码

  1. $ curl ftp://username:password@localhost/~/
  2. # 这段代码的意思是使用 FTP 协议进入 username 的家目录,并将目录下的文件打印出来

正常是可以打印出对应用户家目录下的文件的,但是,在我的我的服务器显示结果如下

  1. $ curl ftp://ftptest:12345@localhost/~/
  2. curl: (67) Access denied: 530

一开始是重启虚拟机,确定密码正确。但还是连接不上。在 google 的过程中发现了连接 FTP 的另一种方法。
另一种连接方式:使用 ftp 直接连接对应网站。

  1. $ ftp localhost
  2. Trying ::1...
  3. Connected to localhost (::1).
  4. 220 (vsFTPd 3.0.2)
  5. Name (localhost:root): ftptest
  6. 331 Please specify the password.
  7. Password:
  8. 530 Login incorrect.
  9. Login failed.

虽然失败了,可以从上面看到错误还是 530 但是这次提示信息从 「 Access denied 」变成了「 Login incorrect 」。因为在搜索 Access denied 并没有找到合适的答案,于是换成了 Login incorrect 。结果第一条就解决了问题,不得不说搜索关键词的重要性。

解决问题

导致我登录不上的原因是 /etc/pam.d/vsftpd 这个文件,这个文件里下面这行的意思是,只有用户使用的 shell是 /etc/shells 里的 shell 才能登录到 FTP ,而创建 FTP 用户,只想让他上传或下载文件,最安全的方法是将 shell 设置成 /sbin/nologin ,这样才能有效的防止 FTP 登录到服务器,但是也可以正常使用 FTP。

  1. auth required pam_shells.so

将上面这行改成下面对应的即可。但是对应的只有 shell 为 nologin 的才能登录。

  1. auth required pam_nologin.so

还有一种方法可以不用动 FTP 的配置文件,就是将 /etc/shells 文件中加入 /sbin/nologin 。
我使用的是第二种方法,因为在学习私房菜前面的时候,我还清楚的记得鸟哥的 /etc/shells 里是有 /sbin/nologin 的,但是我还纳闷为什么我输出的信息和他的不一样,现在我知道了因为 Centos 版本不一样,7.7 与 7.1 的区别,这下破案了。为了接下来和鸟哥保持一致,于是将 /sbin/nologin 加入 /etc/shells 中。

参考资料

https://www.jianshu.com/p/91c7d4a115e0