CentOS7安裝配置vsftp搭建FTP

安裝配置vsftpd作FTP服務,咱們的Web應用使用git管理進行迭代,公共文件軟件存儲使用開源網盤Seafile來管理,基本夠用。想不到FTP的使用的場景,感受它好像老去了,雖然如今基本沒有用到這個工具,但恰好公司公司刷一個硬件須要使用FTP來下載配置文件,因而研究使用了一下,記錄了一下使用過程。?html

原文存儲在這裏,這裏持續更新修正,我會在我使用過程當中把一些問題記錄下來linux

安裝

在安裝前查看是否已安裝vsftpdnginx

# 查看是否已安裝 方法一
[root@localhost ~]# rpm -q vsftpd
vsftpd-3.0.2-21.el7.x86_64

# 查看是否已安裝 方法二
[root@localhost ~]# vsftpd -v
vsftpd: version 3.0.2

# 安裝 vsftpd
[root@localhost ~]# yum -y install vsftpd

查看位置

[root@localhost ~]# whereis vsftpd
vsftpd: /usr/sbin/vsftpd /etc/vsftpd /usr/share/man/man8/vsftpd.8.gz

啓動vsftpd服務

systemctl start vsftpd.service

關閉firewall和SELinux

setenforce 0   # 設置SELinux 成爲permissive模式  (關閉SELinux)
setenforce 1   # 設置SELinux 成爲enforcing模式   (開啓SELinux)

# 或者修改配置
vi /etc/selinux/config
# SELINUX=enforcing
# 註釋掉
# SELINUXTYPE=targeted
# 註釋掉
SELINUX=disabled
# 增長
:wq! #保存退出
setenforce 0

或者設置SELinuxgit

getsebool -a | grep ftp
setsebool -P ftpd_full_access on
systemctl stop firewalld.service
#中止firewall
systemctl disable firewalld.service
#禁止firewall開機啓動

若是你不肯意關閉防火牆,須要防火牆添加FTP服務。github

firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd --reload

修改配置文件

配置文件/etc/vsftpd/vsftpd.confshell

anonymous_enable=NO        # 不容許匿名訪問,禁用匿名登陸
chroot_local_user=YES      # 啓用限定用戶在其主目錄下
use_localtime=YES          # 使用本地時(自行添加)
chroot_list_enable=YES
local_enable=YES           # 容許使用本地賬戶進行FTP用戶登陸驗證
allow_writeable_chroot=YES # 若是啓用了限定用戶在其主目錄下須要添加這個配置,解決報錯 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
xferlog_enable=YES         # 啓用上傳和下載的日誌功能,默認開啓。
local_umask=022            # 設置本地用戶默認文件掩碼022
# FTP上本地的文件權限,默認是077,不過vsftpd安裝後的配置文件裏默認是022

虛擬用戶高級參數安全

當virtual_use_local_privs=YES 時,虛擬用戶和本地用戶有相同的權限;
當virtual_use_local_privs=NO  時,虛擬用戶和匿名用戶有相同的權限,默認是NO。
當virtual_use_local_privs=YES,write_enable=YES時,虛擬用戶具備寫權限(上傳、下載、刪除、重命名)。
當virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=YES,
anon_upload_enable=YES時,虛擬用戶不能瀏覽目錄,只能上傳文件,無其餘權限。
當virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,
anon_upload_enable=NO時,虛擬用戶只能下載文件,無其餘權限。
當virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,
anon_upload_enable=YES時,虛擬用戶只能上傳和下載文件,無其餘權限。
當virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,
anon_mkdir_write_enable=YES時,虛擬用戶只能下載文件和建立文件夾,無其餘權限。
當virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,
anon_other_write_enable=YES時,虛擬用戶只能下載、刪除和重命名文件,無其餘權限。

匿名登陸

安裝完默認狀況下是開啓匿名登陸的,對應的是 /var/ftp 目錄,這時只要服務啓動了,就能夠直接連上FTP了。默認用戶名是ftp,密碼是空的。若是你在配置裏面配置了anonymous_enable=NO,匿名就沒法登陸。服務器

$ ftp 192.168.188.114

Connected to 192.168.188.114.
220 (vsFTPd 3.0.2)
Name (192.168.188.114:kennywang): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
229 Entering Extended Passive Mode (|||47867|).
150 Here comes the directory listing.
-rw-r--r--    1 0        0              12 Jan 18 06:31 README.md
drwxr-xr-x    2 0        0               6 Nov 05 19:43 pub
226 Directory send OK.

多用戶配置

多用戶配置須要本身手工添加配置,下面內容到vsftpd.conf末尾session

# 
# 

use_localtime=YES          # 使用本地時(自行添加)
listen_port=21
chroot_local_user=YES      # 啓用限定用戶在其主目錄下
idle_session_timeout=300

data_connection_timeout=120  # 數據鏈接超時時間
guest_enable=YES             # 設定啓用虛擬用戶功能
guest_username=ftpuser       # 指定虛擬用戶的宿主用戶 ftpuser(就是咱們後面會新建這個用戶)
# guest_username=www
# 若是ftp目錄是指向網站根目錄,用來上傳網站程序,
# 能夠指定虛擬用戶的宿主用戶爲nginx運行帳戶www,能夠避免不少權限設置問題 


user_config_dir=/etc/vsftpd/vuser_conf   # 虛擬用戶配置文件目錄
virtual_use_local_privs=YES # NO時,虛擬用戶和匿名用戶有相同的權限,默認是NO

pasv_min_port=10060         # 被動模式最小端口號10060
pasv_max_port=10090         # 被動模式最大端口號10090

accept_timeout=5
connect_timeout=1

建立宿主用戶

新建系統用戶ftpuser,用戶目錄爲/home/vsftpd, 用戶登陸終端設爲/bin/false(即便之不能登陸系統)運維

# 方法一
# 建立用戶 ftpuser 指定 `/home/vsftpd` 目錄
useradd -g root -M -d /home/vsftpd -s /sbin/nologin ftpuser

# 設置用戶 ftpuser 的密碼
passwd ftpuser
# 把 /home/vsftpd 的全部權給ftpuser.root
chown -R ftpuser.root /home/vsftpd

# 方法二
useradd ftpuser -d /home/vsftpd -s /bin/false
chown ftpuser:ftpuser /home/vsftpd -R 

# 若是虛擬用戶的宿主用戶爲www,須要這樣設置
# www目錄是你應用的目錄
chown www:www /home/www -R

刪除用戶 userdel ftpuser

創建虛擬用戶文件

touch /etc/vsftpd/vuser_passwd
# 編輯虛擬用戶名單文件:(
# 第一行帳號,第二行密碼,注意:不能使用root作用戶名,系統保留)
vi /etc/vsftpd/vuser_passwd 
# 編輯內容,下面是 vuser_passwd 內容
wcj
123456
hss
123456
#保存退出

生成虛擬用戶數據文件

db_load -T -t hash -f /etc/vsftpd/vuser_passwd /etc/vsftpd/vuser_passwd.db
chmod 600 /etc/vsftpd/vuser_passwd.db

建立用戶配置

mkdir /etc/vsftpd/vuser_conf  # 創建虛擬用戶我的vsftp的配置文件
cd /etc/vsftpd/vuser_conf     # 進入目錄
touch hss wcj                 # 這裏建立兩個虛擬用戶配置文件

每個文件配置文件都差很少,只是參數local_root不同。

local_root=/home/vsftpd/hss   # 用戶 hss 配置目錄,這個地方不同
write_enable=YES              # 容許本地用戶對FTP服務器文件具備寫權限
anon_world_readable_only=NO
anon_upload_enable=YES        # 容許匿名用戶上傳文件(須將全局的write_enable=YES,默認YES)
anon_mkdir_write_enable=YES   # 容許匿名用戶建立目錄
anon_other_write_enable=YES   # 容許匿名用戶刪除和重命名權限(自行添加)

建立用戶目錄

每一個用戶目錄文件夾是有root用戶建立的,也就是上面local_root配置目錄,其權限應設置爲755。由於權限的問題在該文件夾內沒法直接上傳文件。而若是設置爲777則沒法訪問,這是因爲vsftpd的安全性設置。解決上傳問題的方法是在local_root文件夾內新建一個upload的文件夾,權限設置爲777,可將文件上傳到該文件夾。

mkdir -p /home/vsftpd/hss     # 每一個用戶對於一個目錄,建立兩個目錄「hss」、「wcj」

# 下面是目錄結構
/home/vsftpd
      ├── hss
      │   ├── filename.md
      │   └── upload
      └── wcj
          └── filename.md


# 賦予其權限
chmod -R 777 /var/vsftpd/hss/upload/

# 在/var/ftp下新建一個目錄來實現匿名用戶上傳
mkdir /var/ftp/upload

vsftpd中幾種用戶的區分:

本地用戶:用戶在FTP服務器擁有帳號,且該帳號爲本地用戶的帳號,能夠經過本身的帳號和口令進行受權登陸,登陸目錄爲本身的home目錄$HOME
虛擬用戶:用戶在FTP服務器上擁有帳號,但該帳號只能用於文件傳輸服務。登陸目錄爲某一特定的目錄,一般能夠上傳和下載
匿名用戶:用戶在FTP服務器上沒有帳號,登陸目錄爲/var/ftp

最後重啓vsftpd服務器

systemctl restart vsftpd.service

服務運維

systemctl restart vsftpd.service  # 重啓服務
systemctl start vsftpd.service    # 啓動服務
systemctl status vsftpd.service   # 服務狀態查看

FTP命令

ftp> ascii  # 設定以ASCII方式傳送文件(缺省值) 
ftp> bell   # 每完成一次文件傳送,報警提示. 
ftp> binary # 設定以二進制方式傳送文件. 
ftp> bye    # 終止主機FTP進程,並退出FTP管理方式. 
ftp> case # 當爲ON時,用MGET命令拷貝的文件名到本地機器中,所有轉換爲小寫字母. 
ftp> cd     # 同UNIX的CD命令. 
ftp> cdup   # 返回上一級目錄. 
ftp> chmod  # 改變遠端主機的文件權限. 
ftp> close  # 終止遠端的FTP進程,返回到FTP命令狀態, 全部的宏定義都被刪除. 
ftp> delete # 刪除遠端主機中的文件. 
ftp> dir [remote-directory] [local-file] # 列出當前遠端主機目錄中的文件.若是有本地文件,就將結果寫至本地文件. 
ftp> get [remote-file] [local-file] # 從遠端主機中傳送至本地主機中. 
ftp> help [command] # 輸出命令的解釋. 
ftp> lcd # 改變當前本地主機的工做目錄,若是缺省,就轉到當前用戶的HOME目錄. 
ftp> ls [remote-directory] [local-file] # 同DIR. 
ftp> macdef                 # 定義宏命令. 
ftp> mdelete [remote-files] # 刪除一批文件. 
ftp> mget [remote-files]    # 從遠端主機接收一批文件至本地主機. 
ftp> mkdir directory-name   # 在遠端主機中創建目錄. 
ftp> mput local-files # 將本地主機中一批文件傳送至遠端主機. 
ftp> open host [port] # 從新創建一個新的鏈接. 
ftp> prompt           # 交互提示模式. 
ftp> put local-file [remote-file] # 將本地一個文件傳送至遠端主機中. 
ftp> pwd  # 列出當前遠端主機目錄. 
ftp> quit # 同BYE. 
ftp> recv remote-file [local-file] # 同GET. 
ftp> rename [from] [to]     # 改變遠端主機中的文件名. 
ftp> rmdir directory-name   # 刪除遠端主機中的目錄. 
ftp> send local-file [remote-file] # 同PUT. 
ftp> status   # 顯示當前FTP的狀態. 
ftp> system   # 顯示遠端主機系統類型. 
ftp> user user-name [password] [account] # 從新以別的用戶名登陸遠端主機. 
ftp> ? [command] # 同HELP. [command]指定須要幫助的命令名稱。若是沒有指定 command,ftp 將顯示所有命令的列表。
ftp> ! # 從 ftp 子系統退出到外殼。

關閉FTP鏈接

bye
exit
quit

下載文件

ftp> get readme.txt # 下載 readme.txt 文件
ftp> mget *.txt     # 下載

上傳文件

ftp> put /path/readme.txt # 上傳 readme.txt 文件
ftp> mput *.txt           # 能夠上傳多個文件

狀態碼

  • 230 - 登陸成功

  • 200 - 命令執行成功

  • 150 - 文件狀態正常,開啓數據鏈接端口

  • 250 - 目錄切換操做完成

  • 226 - 關閉數據鏈接端口,請求的文件操做成功

參考資料

相關文章
相關標籤/搜索