用腳本實現FTP的上傳和下載

1.linux

FTP的安裝nginx

 

檢查vim

rpm -q vsftpd
vsftpd -v

安裝bash

yum -y install vsftpd ft

查看安裝位置服務器

[root@ftp ~]# whereis vsftpd
vsftpd: /usr/sbin/vsftpd /etc/vsftpd /usr/share/man/man8/vsftpd.8.gz
[root@ftp ~]# vsftpd -v
vsftpd: version 3.0.

關閉防火牆session

systemctl disable firewalld.service
systemctl stop firewalld.service
#若是不關閉防火牆則添加FTP服務:
firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd --reload

關閉selinuxide

setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#' /etc/selinux/config
#若是不關閉selinux則設置FTP服務:
getsebool -a | grep ftp
setsebool -P ftpd_full_access on

啓動vsftp服務網站

[root@ftp ~]# systemctl start vsftpd
[root@ftp ~]# systemctl enable vsftpd

匿名用戶登陸ui

#安裝完默認開啓匿名登陸,對應的是 /var/ftp ,默認用戶名是ftp,密碼爲空。
[root@ftp ~]# ftp localhost
Trying ::1...
Connected to localhost (::1).
220 (vsFTPd 3.0.2)
Name (localhost:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
#退出
ftp> bye
421 Timeout.

配置文件解析rest

1# 不容許匿名訪問,禁用匿名登陸
 2anonymous_enable=NO
 3
 4# 啓用限定用戶在其主目錄下 
 5chroot_local_user=YES
 6
 7# 使用本地時(自行添加)
 8use_localtime=YES
 9
10# 容許使用本地賬戶進行FTP用戶登陸驗證
11local_enable=YES
12
13# 若是啓用了限定用戶在其主目錄下須要添加這個配置,解決報錯 500 OOPS: vsftpd: refusing to run with writable root inside chroot()     
14allow_writeable_chroot=YES
15
16# 啓用上傳和下載的日誌功能,默認開啓
17xferlog_enable=YES
18
19# 設置本地用戶默認文件掩碼022    
20local_umask=022      

配置多用戶

cat >>/etc/vsftpd/vsftpd.conf <<EOF
# 使用本地時(自行添加)
use_localtime=YES

#監聽端口
listen_port=21

# 啓用限定用戶在其主目錄下
chroot_local_user=YES

# 數據鏈接超時時間
idle_session_timeout=300

# 設定啓用虛擬用戶功能
guest_enable=YES

# 指定虛擬用戶的宿主用戶 ftpuser
guest_username=ftpuser
# guest_username=www
# 若是ftp目錄是指向網站根目錄,能夠指定虛擬用戶的宿主用戶爲nginx運行帳戶www,能夠避免不少權限設置問題 。

# 虛擬用戶配置文件目錄
user_config_dir=/etc/vsftpd/vuser_conf

# 虛擬用戶配置文件目錄
user_config_dir=/etc/vsftpd/vuser_conf  

# 爲NO時,虛擬用戶和匿名用戶有相同的權限,默認是NO
virtual_use_local_privs=NO

#數據鏈接超時時間
data_connection_timeout=1

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

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

#訪問超時時間
accept_timeout=5

#鏈接超時時間
connect_timeout=1
EOF  

建立宿主用戶

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

# 方法一
建立用戶 ftpuser並指定用戶目錄爲 /home/vsftpd/
mkdir -p /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,須要這樣設置
chown www:www /home/www -R

創建虛擬用戶文件

#第一行帳號,第二行密碼,注意:不能使用root作用戶名,系統保留)
vim /etc/vsftpd/vuser_passwd 
test
123456
#保存退出

生成虛擬用戶數據文件

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

建立用戶配置

# 創建虛擬用戶我的vsftp的配置文件
mkdir /etc/vsftpd/vuser_conf 
# 進入目錄
cd /etc/vsftpd/vuser_conf 
# 建立虛擬用戶配置文件 
vim test      
local_root=/home/vsftpd/test  # 用戶 hss 配置目錄
write_enable=YES       # 容許本地用戶對FTP服務器文件具備寫權限
anon_world_readable_only=NO
anon_upload_enable=YES    # 容許匿名用戶上傳文件(默認YES)
anon_mkdir_write_enable=YES  # 容許匿名用戶建立目錄
anon_other_write_enable=YES  # 容許匿名用戶刪除和重命名權限
#保存退出

建立用戶目錄

 
mkdir -p /home/vsftpd/test/upload
chmod -R 777 /home/vsftpd/test/upload
# 在/var/ftp下新建一個目錄來實現匿名用戶上傳
mkdir /var/ftp/upload

重啓vsftpd服務器

systemctl restart vsftpd.servic

vsftpd中幾種用戶的區分

本地用戶:

用戶在FTP服務器擁有帳號,且該帳號爲本地用戶的帳號,能夠經過本身的帳號和口令進行受權登陸,登陸目錄爲本身的home目錄。 

虛擬用戶:

用戶在FTP服務器上擁有帳號,但該帳號只能用於文件傳輸服務,登陸目錄爲某一特定的目錄,一般能夠上傳和下載 。

匿名用戶:

用戶在FTP服務器上沒有帳號,登陸目錄爲/var/ftp。

FTP狀態碼

230 # 登陸成功
200 # 命令執行成功
150 # 文件狀態正常,開啓數據鏈接端口
250 # 目錄切換操做完成
226 # 關閉數據鏈接端口,請求的文件操做成功

FTP命令

# 設定以ASCII方式傳送文件(缺省值)
ftp> ascii

# 每完成一次文件傳送,報警提示.   
ftp> bell

# 設定以二進制方式傳送文件.  
ftp> binary

# 終止主機FTP進程,並退出FTP管理方式.   
ftp>bye

# 當爲ON時,用MGET命令拷貝的文件名到本地機器中,所有轉換爲小寫字母.  
ftp>case

# 同UNIX的CD命令.   
ftp>cd

# 返回上一級目錄.    
ftp> cdup

# 改變遠端主機的文件權限.   
ftp> chmod

# 終止遠端的FTP進程,返回到FTP命令狀態, 全部的宏定義都被刪除.  
ftp> close

# 刪除遠端主機中的文件.  
ftp> delete

# 列出當前遠端主機目錄中的文件.若是有本地文件,就將結果寫至本地文件.  
ftp> dir [remote-directory] [local-file]

# 從遠端主機中傳送至本地主機中.  
ftp> get [remote-file] [local-file] 

# 輸出命令的解釋.
ftp> help [command]

# 改變當前本地主機的工做目錄,若是缺省,就轉到當前用戶的HOME目錄.   
ftp> lcd

# 同DIR. 
ftp> ls [remote-directory] [local-file]

# 定義宏命令.   
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

# 同BYE. 
ftp> quit

# 同GET. 
ftp> recv remote-file [local-file] 

# 改變遠端主機中的文件名. 
ftp> rename [from] [to]   

# 刪除遠端主機中的目錄. 
ftp> rmdir directory-name 

# 同PUT.  
ftp> send local-file [remote-file]

# 顯示當前FTP的狀態.  
ftp> status

# 顯示遠端主機系統類型.   
ftp> system 

# 從新以別的用戶名登陸遠端主機.  
ftp> user user-name [password] [account]

# 同HELP. [command]指定須要幫助的命令名稱。若是沒有指定 command,ftp 將顯示所有命令的列表。 
ftp> ? [command] 

# 從 ftp 子系統退出到外殼。 
ftp> ! 

#關閉FTP鏈接
ftp>bye
ftp>exit
ftp> quit 

 

2

FTP上傳腳本

 

#!/bin/bash        
#FileName:ftp_upload.sh    
#Function:從本地客戶端向ftp服務器上傳一個文件 

# $#表示傳遞給此Shell腳本的參數個數。  
# -ne表示不等於。 
if [ $# -ne 2  ]  
then  
    echo "Usage $0  <local_dir/filename> <remote_dir>"  #若是傳遞的參數個數不等於2個,即提示傳參報錯信息。
    exit 1  
fi    


# ftp的服務器ip地址。  
IP=127.0.0.1     

# FULLNAME獲取本地文件全路徑名。  
FULLNAME=$1  

# DESTDIR獲取須要上傳的ftp遠程目錄路徑。  
DESTDIR=$2 

# basename返回一個路徑中的文件名部分。 
# 如FULLNAME="/home/Sunrier/Proj/log/test.log";  
# 當local_filename=`basename $FULLNAME`  
# 最終local_filename="test.log"  
local_filename=`basename $FULLNAME`  

# DESTFILE表示ftp服務器的路徑,以及保存後的文件名。
DESTFILE=$DESTDIR/$local_filename  

# 自動上傳文件到ftp服務器,免交互方式
ftp -i -n <<FTPIT  
open $IP  
user Sunrier redhat  
bin  
passive  
cd /home/remote/log/ftpfile  
put $FULLNAME $DESTFILE  
quit  
FTPIT  
exit 0

 

3

FTP下載腳本

 

#!/bin/bash        
#FileName:ftp_download.sh    
#Function:從ftp服務器下載一個文件到本地客戶端


# $#表示傳遞給此Shell腳本的參數個數。  
# -ne表示不等於。  
if [ $# -ne 2  ]  
 then  
    echo "Usage $0  <remote_dir/filename> <local_dir>"  
    exit 1  
fi 

# IP表示ftp的服務器ip地址。  
IP=127.0.0.1    

# FULLNAME獲取從ftp服務器上下載的文件全路徑名。  
FULLNAME=$1 

# DESTDIR獲取從ftp服務器上下載的文件所存放的本地計算機的目錄路徑。  
DESTDIR=$2  

# remote_filename獲取從ftp服務器上下載的文件名。  
remote_filename=`basename $FULLNAME`  

# DESTFILE表示下載文件所存放的本地路徑,以及本地保存後的文件名。  
DESTFILE=$DESTDIR/$remote_filename

# 自動下載文件到本地,免交互方式。
ftp -i -n <<FTPIT  
open $IP  
user Sunrier redhat  
bin  
cd /home/remote/log/ftpfile  
get $FULLNAME $DESTFILE  
quit  
FTPIT       
exit 0
相關文章
相關標籤/搜索