(只需挨個復制粘貼命令即可部署)在Centos7下搭建文件服務器(VSFTPD)

觀看北京尚學堂-百戰程序員筆記

一、VSFTPD簡介

Linux的組件(一款軟件),安裝到Linux后可以通過java代碼(FtpClient)實現文件的上傳。基于FTP協議。
由于VSFTPD是基于FTP協議,客戶端瀏覽器是需要通過http協議訪問圖片;如果希望客戶端直接訪問圖片服務器中的圖片,需要使用Nginx進行反向代理。
在這里插入圖片描述

二、提煉核心命令

①,下載安裝vsftpd,完全在線安裝版

yum -y install vsftpd

yum install ftp -y

yum:代表從centos中心庫去自動安裝對應的組件
yum install代表安裝的意思
vsftpd代表組件名
-y表示需要確認的地方全部yes

安裝完后,vsftp 的配置文件在/etc/vsftpd/vsftpd.conf
②,添加ftp用戶,ftpuser為用戶名,可自定義

useradd ftpuser

登錄后默認的路徑為 /home/ftpuser
③,添加ftpuser這個用戶的密碼

passwd ftpuser

命名輸入之后需要輸入兩次密碼,太簡單了會有提示

④,ftp 默認的端口為 21,此時需要讓防火墻放開21端口

vim /etc/sysconfig/iptables

在行上面有 22 -j ACCEPT 下面另起一行輸入跟那行差不多的,只是把 22 換成 21,然后: wq 保存。
如圖所示:在這里插入圖片描述
⑤,重啟一下iptables

service iptables restart

⑥,修改selinux
此時已經外網已經可以訪問了,但是沒有返回路徑,此時需要修改一下selinux。
先查看一下狀態

getsebool -a | grep ftp

若報錯

setenforce: SELinux is disabled

如果需要重新開啟selinux,請按下面步驟:

vi /etc/selinux/config

更改為:SELINUX=1
必須重啟linux,從云服務器管理控制臺重啟,快速連接Ctrl+Shift+R,不重啟是沒辦法立刻開啟selinux的

若不報錯,執行下面兩行命令,開啟外網訪問

setsebool -P ftpd_full_access on

setsebool -P tftp_home_dir on

即將allow_ftpd_full_access和ftp_home_dir的狀態改成on。
在這里插入圖片描述
連接服務器的時候要是出錯,最直接的方法就是把防火墻給關了。
訪問服務器的軟件傳輸模式改成主動

⑦,關閉匿名訪問
修改/etc/vsftpd/vsftpd.conf 文件:將anonymous_enable=NO原來是YES,需要改成NO。最后:wq保存并退出即可
步驟如下:
先切換到vsftpd的配置文件默認安裝位置

cd /etc/vsftpd/

ls一下,找到vsftpd.conf配置文件
然后,編輯一下該配置文件

vim vsftpd.conf

找到配置文件里面的這行命令,改成這個狀態anonymous_enable=NO,把YES改為NO

保存并退出

Esc

:wq

最后,重啟一下stp服務即可

systemctl start vsftpd.service

查看一下服務狀態,若為綠色表示成功

systemctl status vsftpd.service

⑧,開啟被動模式,默認是開啟的,但是要指定一個端口范圍30000~30999,這個端口范圍可以隨意更改。
首先,編輯配置文件

vim /etc/vsftpd/vsftpd.conf

需要插入一些配置,insert插入一下
在配置文件vsftpd.conf最后加入下面兩行指定端口范圍

pasv_min_port=30000
pasv_max_port=30999

同樣iptables 也要相應的開啟這個范圍,參考步驟④,只不過開發的不是21這個端口了,重新復制一行,將端口號改成3000:30999范圍 ,之后記得重啟一下iptables ,參考步驟⑤。

⑨,設置開機自啟動vsftpd ftp服務

systemctl enable vsftpd.service

三、測試一下

連接服務器,在/etc/home/ftpuser上傳一張隨便的圖片,例如為a.png。

ftp://116.62.111.4:21(自己的服務器ip)

訪問成功之后需要進行輸入自己設置的用戶名和密碼(步驟二的②,③)。
也可以這樣訪問:

ftp://用戶名:密碼@自己服務器的ip

例如:ftp://ftpuser:密碼@116.62.111.4

四、通過java代碼FtpClient上傳圖片到ftpuser

①,創建一個maven項目
②,在pom.xml配置文件中添加約束

 <dependencies><dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.3</version></dependency></dependencies>

③,編寫測試類Text

將E盤下的sq.jpg上傳到服務器上為abc.jpg
package com.pdsu.bjsxt;import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;import org.apache.commons.net.ftp.FTPClient;public class Test {public static void main(String[] args) throws IOException {FTPClient ftp = new FTPClient();ftp.connect("服務器ip", 21);//設置ip和端口ftp.login("用戶名", "密碼");//設置用戶名和密碼//設置文件類型ftp.setFileType(FTPClient.BINARY_FILE_TYPE);//圖片設置為上傳成二進制類型,否則會出現亂碼//選擇一個文件上傳,將E盤下的sq.jpg上傳到服務器上為abc.jpgInputStream is = new FileInputStream("E:/sq.jpg");ftp.storeFile("abc.jpg", is);ftp.logout();//關閉流System.out.println("上傳成功");}
}
將E盤下的sq.jpg上傳到wsq文件夾下成為yy.jpg。
其中wsq文件夾不可以自動創建需要自己手動創建才行
package com.pdsu.bjsxt;import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;import org.apache.commons.net.ftp.FTPClient;public class Test {public static void main(String[] args) throws IOException {FTPClient ftp = new FTPClient();ftp.connect("服務器ip", 21);//設置ip和端口ftp.login("用戶名", "密碼");//設置用戶名和密碼	//設置文件類型ftp.setFileType(FTPClient.BINARY_FILE_TYPE);//圖片設置為上傳成二進制類型,否則會出現亂碼//選擇一個文件上傳,將E盤下的sq.jpg上傳到服務器上為abc.jpgInputStream is = new FileInputStream("E:/sq.jpg");ftp.changeWorkingDirectory("/home/ftpuser/wsq");//將文件上傳到wsq文件夾下的yy.jps,其中wsq文件夾不可以自動創建需要自己手動創建ftp.storeFile("yy.jpg", is);ftp.logout();//關閉流System.out.println("上傳成功");}
}

模板工具類(直接復制修改main函數即可)

package com.pdsu.utils;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;/*** ftp上傳下載工具類*/
public class FtpUtil {/*** Description: 向FTP服務器上傳文件* * @param host*            FTP服務器hostname* @param port*            FTP服務器端口* @param username*            FTP登錄賬號* @param password*            FTP登錄密碼* @param basePath*            FTP服務器基礎目錄* @param filePath*            FTP服務器文件存放路徑。例如分日期存放:/2015/01/01。文件的路徑為basePath+filePath* @param filename*            上傳到FTP服務器上的文件名* @param input*            輸入流* @return 成功返回true,否則返回false*/public static boolean uploadFile(String host, int port, String username, String password, String basePath,String filePath, String filename, InputStream input) {boolean result = false;FTPClient ftp = new FTPClient();try {int reply;ftp.connect(host, port);// 連接FTP服務器// 如果采用默認端口,可以使用ftp.connect(host)的方式直接連接FTP服務器ftp.login(username, password);// 登錄reply = ftp.getReplyCode();if (!FTPReply.isPositiveCompletion(reply)) {ftp.disconnect();return result;}// 切換到上傳目錄if (!ftp.changeWorkingDirectory(basePath + filePath)) {// 如果目錄不存在創建目錄String[] dirs = filePath.split("/");String tempPath = basePath;for (String dir : dirs) {if (null == dir || "".equals(dir))continue;tempPath += "/" + dir;if (!ftp.changeWorkingDirectory(tempPath)) {if (!ftp.makeDirectory(tempPath)) {return result;} else {ftp.changeWorkingDirectory(tempPath);}}}}// 設置上傳文件的類型為二進制類型ftp.setFileType(FTP.BINARY_FILE_TYPE);// 上傳文件if (!ftp.storeFile(filename, input)) {return result;}input.close();ftp.logout();result = true;} catch (IOException e) {e.printStackTrace();} finally {if (ftp.isConnected()) {try {ftp.disconnect();} catch (IOException ioe) {}}}return result;}/*** Description: 從FTP服務器下載文件* * @param host*            FTP服務器hostname* @param port*            FTP服務器端口* @param username*            FTP登錄賬號* @param password*            FTP登錄密碼* @param remotePath*            FTP服務器上的相對路徑* @param fileName*            要下載的文件名* @param localPath*            下載后保存到本地的路徑* @return*/public static boolean downloadFile(String host, int port, String username, String password, String remotePath,String fileName, String localPath) {boolean result = false;FTPClient ftp = new FTPClient();try {int reply;ftp.connect(host, port);// 如果采用默認端口,可以使用ftp.connect(host)的方式直接連接FTP服務器ftp.login(username, password);// 登錄reply = ftp.getReplyCode();if (!FTPReply.isPositiveCompletion(reply)) {ftp.disconnect();return result;}ftp.changeWorkingDirectory(remotePath);// 轉移到FTP服務器目錄FTPFile[] fs = ftp.listFiles();for (FTPFile ff : fs) {if (ff.getName().equals(fileName)) {File localFile = new File(localPath + "/" + ff.getName());OutputStream is = new FileOutputStream(localFile);ftp.retrieveFile(ff.getName(), is);is.close();}}ftp.logout();result = true;} catch (IOException e) {e.printStackTrace();} finally {if (ftp.isConnected()) {try {ftp.disconnect();} catch (IOException ioe) {}}}return result;}public static void main(String[] args) throws FileNotFoundException {//將E盤下的sq.jpg圖片上傳到服務器的/home/ftpuser為下,上傳成為qqq.jpg這個圖片InputStream is = new FileInputStream("E:/sq.jpg");boolean result = FtpUtil.uploadFile("192.168.139.131", 21, "用戶名", "密碼", "/home/ftpuser", "/","qqq.jpg", is);if (result)System.out.println("上傳成功");elseSystem.out.println("上傳失敗");}
}

五、反向代理安裝Nginx

Nginx是C語言開發,需要有C語言的環境,需要安裝一些組件
①,將壓縮包上傳到/usr/local/tmp
切換一下目錄

cd /etc/vsftpd

安裝組件gcc

yum install gcc-c++ -y

安裝組件pcre

yum install -y pcre pcre-devel

安裝組件zlib

yum install -y zlib zlib-devel

安裝組件openssl

yum install -y openssl openssl-devel

②、準備創建一些文件夾,這幾個文件夾需要手動創建
進去var文件夾下面

cd /var

查看一下目錄結構

ls

里面沒有temp文件夾,此時需要創建一個temp文件夾

mkdir temp

進去文件夾里面

cd temp

在temp文件夾下創建一個nginx文件夾

mkdir nginx

③、進入到壓縮包所在的目錄

cd /usr/local/tmp

ls

解壓壓縮包

tar zxvf nginx-1.8.0.tar.gz

ls

進入到解壓后的目錄

cd nginx-1.8.0

ls

目錄里面會有個configure文件
其中\代表換行操作

./configure \> --prefix=/usr/local/nginx \
> --pid-path=/var/run/nginx/nginx.pid \
> --lock-path=/var/lock/nginx.lock \
> --error-log-path=/var/log/nginx/error.log \
> --http-log-path=/var/log/nginx/access.log \
> --with-http_gzip_static_module \
> --http-client-body-temp-path=/var/temp/nginx/client \
> --http-proxy-temp-path=/var/temp/nginx/proxy \
> --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
> --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \

復制粘貼(此時的目錄必須在nginx-1.8.0目錄下)!!!!

進行編譯

make

安裝

make install

返回到安裝nginx的目錄下

cd /usr/local/nginx

ls

會發現有三個文件夾conf html sbin
conf :里面有所有nginx配置文件都在這個文件夾里面,其中nginx.conf是主配置文件
html:里面有兩個頁面,50x.html訪問出錯的頁面,和一個index.html訪問服務器默認的歡迎頁
sbin:啟動文件目錄,進去sbin目錄里面,cd sbinls,里面有個啟動文件nginx,然后啟動一下nginx,./nginx默認的是80端口
需要使防火墻放行8端口,參考二、④

然后,瀏覽器輸入http:你的ip回來到nginx自帶的index.html歡迎頁面

④、停止nginx服務
首先需要進入到sbin目錄下

cd /usr/local/nginx/sbin

啟動:

./nginx

快速停止:相當與eclipse從控制臺點紅方塊

./nginx -s stop

完整停止(推薦使用):相當與eclipse將服務stop

./nginx -s quit

⑤、設置nginx開機自啟動–使用編寫shell腳本

cd /etc/init.d

創建nginx文件編輯

vim nginx

#!/bin/sh
# nginx - this script starts and stops the nginx daemin
#
# chkconfig:   - 85 15# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server# processname: nginx
# config:      /usr/local/nginx/conf/nginx.conf
# pidfile:     /usr/local/nginx/logs/nginx.pid# Source function library.. /etc/rc.d/init.d/functions# Source networking configuration.. /etc/sysconfig/network# Check that networking is up.[ "$NETWORKING" = "no" ] && exit 0nginx="/usr/local/nginx/sbin/nginx"prog=$(basename $nginx)NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"lockfile=/var/lock/subsys/nginxstart() {[ -x $nginx ] || exit 5[ -f $NGINX_CONF_FILE ] || exit 6echo -n $"Starting $prog: "daemon $nginx -c $NGINX_CONF_FILEretval=$?echo[ $retval -eq 0 ] && touch $lockfilereturn $retval}stop() {echo -n $"Stopping $prog: "killproc $prog -QUITretval=$?echo[ $retval -eq 0 ] && rm -f $lockfilereturn $retval}restart() {configtest || return $?stopstart}reload() {configtest || return $?echo -n $"Reloading $prog: "killproc $nginx -HUPRETVAL=$?echo}force_reload() {restart}configtest() {$nginx -t -c $NGINX_CONF_FILE}rh_status() {status $prog}rh_status_q() {rh_status >/dev/null 2>&1}case "$1" instart)rh_status_q && exit 0$1;;stop)rh_status_q || exit 0$1;;restart|configtest)$1;;reload)rh_status_q || exit 7$1;;force-reload)force_reload;;status)rh_status;;condrestart|try-restart)rh_status_q || exit 0;;*)echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"exit 2esac

⑥、設置文件的訪問權限

cd /etc/init.d

chmod 755 /etc/init.d/nginx

chkconfig --add nginx

(a+x ==> all user can execute 所有用戶可執行)
此時ls 會發現nginx變成了綠色的可執行文件了
⑦、在rc.local文件中加入一行配置

vi /etc/rc.local

加入這一行代碼,表示開機自啟動

/etc/init.d/nginx start

Esc

:wq

測試一下

cd /etc/init.d

service nginx start

/etc/init.d/nginx status

全報綠即安裝成功

⑧,加權限
進入到nginx的目錄下

cd /usr/local/nginx

ls

cd conf

ps aux|grep nginx

可以看見這里是nobody用戶權限

vim nginx.conf

在第一行中將user用戶打開并且改成你的用戶名

用戶權限必須給,這一步很重要

user ftpuser

若報錯

cd /usr/local/nginx/sbin

查看進程

ps aux|grep nginx

殺死進程(若刪不掉,是因為有守護進程,將root也給刪掉)

kill -7 -進程ID

然后在重啟nginx

./ nginx

此時要是在報錯需要添加歡迎頁面

加載歡迎頁面

cd /usr/local/nginx/conf

vim nginx.conf
在這里插入圖片描述

VSFTPD卸載
rpm -qa | grep vsftpdrpm -e vsftpd 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379428.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379428.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379428.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

POJ 2421 Constructing Roads MST kruskal

最近剛學的并查集所以用kruskal來試試最小生成樹~ kruskal其實用幾句話就能說完~ 1.貪心所有邊的權值,從小到大取值 2.取值時~將邊權非0的兩個頂點~進行并查操作~如果兩個點的祖先不同...邊權加入最小生成樹...并且將兩個點納入同一個集合中 3.判斷是否所有點都在同一個集合中…

c# 聲明類的時候初始化類_使用C#初始化的列表聲明

c# 聲明類的時候初始化類The task is to create/declare a list with an initializer list in C#. 任務是在C&#xff03;中使用初始化列表創建/聲明一個列表 。 C&#xff03;清單 (C# List) A list is used to represent the list of the objects, it is represented as Lis…

編寫程序計算所輸日期是當年的第幾天

/* 1.輸入年月日&#xff0c;編寫程序計算所輸日期是當年的第幾天 *//* 2.已知列車隔日發車&#xff0c;且1/1/2006不發車(無ticket),如果所輸入數據在此日期之后&#xff0c;則輸出有沒有車票&#xff0c;否則僅輸出上一步結果。*/ /* month/date/year is which day of the ye…

匯編語言-005(XCHG、標志位操作、算術操作、比例因子的變址尋址、多個常用運算符運用、大端轉小端、數組操作)

1: 用不超過3條XCHG指令對4個8位寄存器的值重新排序&#xff0c;A,B,C,D調整為D,C,B,A .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data.code main PROCmov al,Amov bl,Bmov cl,Cmov dl,Dxchg al,dlxchg bl,clINVOKE ExitProcess,0 main ENDP E…

bcd碼二進制轉十進制_二進制編碼的十進制(BCD碼)及其加法

bcd碼二進制轉十進制Prerequisite: Number systems 先決條件&#xff1a; 數字系統 BCD Code (8421 Code): In BCD 8421 code, each decimal digit is represented using a 4-bit binary number. The 4-bit binary numbers have their weights attached as 8, 4, 2, 1 from MS…

SVN服務器部署

一、SVN版本控制器 Subversion就是一款實現版本控制的工具軟件&#xff0c;通常也成為版本控制器&#xff0c;簡稱SVN。 Subversion是Apache軟件基金會組織下的一個項目 SVN基本操作&#xff1a; checkout&#xff08;檢出&#xff09;&#xff1a;將一個服務端創建好的項目…

rtmp流\http流測試地址

測試方式&#xff1a;ffplay rtmp://58.200.131.2:1935/livetv/cctv1 rtmp&#xff1a; CCTV-1綜合:rtmp://58.200.131.2:1935/livetv/cctv1 CCTV-2財經:rtmp://58.200.131.2:1935/livetv/cctv2 CCTV-3綜藝:rtmp://58.200.131.2:1935/livetv/cctv3 CCTV-4中文國際:rtmp://58.2…

LINQ to XML:如何讀寫XCData

using System;using System.Xml.Linq;namespace ConsoleApplication1 {class Program{static void Main(string[] args){//寫入CDATA元素塊var doc new XElement("Test",new XElement("User",new XAttribute("name", "chenxizhang"),…

C#中的結構和類之間的區別

C&#xff03;類和結構 (C# class and structure) In C# and other programming languages, structure and classes are used to define a custom data type, that we can organize according to our need with different types of variables, methods etc. 在C&#xff03;和其…

[轉載]SQL?Plus?一些使用技巧

原文地址&#xff1a;SQL Plus 一些使用技巧作者&#xff1a;☆水『若寒Sql*plus的使用 Sql*plus介紹 Sql*plus是oracle提供的一個工具程序&#xff0c;既可以在oracle服務器使用&#xff0c;也可以在oracle客戶端使用。在windows下分兩種&#xff0c;sqlplus.exe是命令行程序&…

云服務器(Centos)部署SVN

1&#xff0c;安裝svn yum install subversion 2&#xff0c;查看版本號 svnserve --version 3&#xff0c;創建SVN版本庫&#xff08;在var/svn 文件夾下&#xff09; 新建文件夾 mkdir -p /var/svn/svnrepos 創建版本庫 svnadmin create /var/svn/svnrepos 4&#xff0c;修改…

ffmpeg命令提取像素格式

1&#xff1a; 提取yuv格式&#xff1a;不修改寬高 取3秒 ffmpeg -i test_1920x1080.mp4 -t 3 yuv420p_orig.yuv ffmpeg -i test_1920x1080.mp4 -t 3 -pix_fmt yuv420p yuv420p_orig.yuv 可以使用ffplay播放&#xff1a;ffplay -video_size 1920x1080 yuv420p_orig.yuv 提取y…

Javascript(js)使用function定義構造函數

Javascript并不像Java、C#等語言那樣支持真正的類。但是在js中可以定義偽類。做到這一點的工具就是構造函數和原型對象。首先介紹js中的構造函數。 Javascript中創建對象的語法是在new運算符的后面跟著一個函數的調用。如 1 varobj newObject();2 vardate newDate();運算符new首…

錯誤:將字符串分配給C中的char變量| 常見的C程序錯誤

If you assign a string to the character variable, it may cause a warning or error (in some of the compilers) or segmentation fault error occurs. 如果將字符串分配給字符變量&#xff0c;則可能會導致警告或錯誤(在某些編譯器中)或發生分段錯誤。 Consider the code…

【轉】用BibTeX 寫 Reference

BibTeX 是一種格式和一個程序&#xff0c; 用于協調LaTeX的參考文獻處理&#xff0c;BibTeX 使用數據庫的的方式來管理參考文獻.&#xff0c;BibTeX 文件的后綴名為 .bib。 例子&#xff1a; article{name1, author {作者, 多個作者用 and 連接}, title {標題}, journal {期…

計算機二級C語言易混淆的區別

1&#xff0c;if(a1)與if(a1)的區別 首先&#xff0c;if(a1) 等價于 a1;if(a); 而a 1&#xff0c;是判斷a是不是為1&#xff1b; if(sq)里面的分為兩種情況&#xff0c;一種是sq為0&#xff0c;不執行if里面的代碼內容&#xff1b;另一種是sq不為0&#xff0c;執行里面的代碼內…

ffmpeg命令mp3中提取pcm格式

原mp3文件: ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f s16le 48000_2_s16le.pcm &#xff08;這可能是pcm原格式查不到什么信息但是可以播放的&#xff1a;ffplay -ar 48000 -ac 2 -f s16le 48000_2_s16le.pcm&#xff09; ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -samp…

C++ STL map的使用

1、map簡介 map是一類關聯式容器。它的特點是增加和刪除節點對迭代器的影響很小&#xff0c;除了那個操作節點&#xff0c;對其他的節點都沒有什么影響。對于迭代器來說&#xff0c;可以修改實值&#xff0c;而不能修改key。 2、map的功能 自動建立Key &#xff0d; value的…

bfs廣度優先搜索算法_圖的廣度優先搜索(BFS)

bfs廣度優先搜索算法What you will learn? 您將學到什么&#xff1f; How to implement Breath first search of a graph? 如何實現圖的呼吸優先搜索&#xff1f; Breadth First Search is a level-wise vertex traversal process. Like a tree all the graphs have verte…

考研C++必刷題(一)

【程序1】 題目&#xff1a;有1、2、3、4個數字&#xff0c;能組成多少個互不相同且無重復數字的三位數&#xff1f;都是多少&#xff1f; 解題思路&#xff1a; 利用三層循環&#xff0c;分別控制百位十位個位&#xff0c;若百位十位個位有重復的&#xff0c;則不輸出即可。 代…