最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang實現(xiàn)ftp功能簡單又實用(示例代碼)

 更新時間:2025年12月27日 09:10:50   作者:無知就要求知  
本文介紹了如何使用Go語言實現(xiàn)FTP功能,包括加載配置文件和處理FTP部分,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧

配置文件部分:

FtpServer:
  ListenAddr: ":2121"
  ListenDir: "/data/ftpwww" # ftp目錄
  PassivePortRange: # end必須大于start,否則會panic, 非被動模式不用配置
    Start: 3121
    End: 3124
  ListenUsers: # ftp賬號
    - Username: ftpadmin
      Password: "123456..."
    - Username: ftpadmin
      Password: "yueduo-654321..."

加載配置文件

package config
import (
	"fmt"
	"gopkg.in/yaml.v3"
	"os"
)
var (
	Conf Config
)
type Config struct {
...
	FtpServer  FtpServer  `yaml:"FtpServer"`
...
}
func InitConfigFromYaml(file string) error {
	if file == "" {
		file = "config.yaml"
	}
	f, err := os.Open(file)
	if err != nil {
		return fmt.Errorf("配置文件打開錯誤.%w", err)
	}
	dec := yaml.NewDecoder(f)
	err = dec.Decode(&Conf)
	if err != nil {
		return err
	}
	return nil
}

main.go引用

//初始化配置文件
	err := config.InitConfigFromYaml(f)
	if err != nil {
		logn.Errorf("配置文件初始化錯誤,file:%s 錯誤信息:%v", f, err)
		return
	}
// 加載ftp
	go ftp.FtpDirver()

ftp部分perm

package ftp
import (
	"fmt"
	"os"
)
// 加載文件權限只讀
type ReadOnlyPerm struct{}
func (p *ReadOnlyPerm) GetOwner(path string) (string, error) {
	return "ftp", nil
}
func (p *ReadOnlyPerm) GetGroup(path string) (string, error) {
	return "ftp", nil
}
func (p *ReadOnlyPerm) GetMode(path string) (os.FileMode, error) {
	// 0444: 只讀(r--r--r--)
	return 0444, nil
}
func (p *ReadOnlyPerm) ChOwner(path, owner string) error {
	return fmt.Errorf("permission denied")
}
func (p *ReadOnlyPerm) ChGroup(path, group string) error {
	return fmt.Errorf("permission denied")
}
func (p *ReadOnlyPerm) ChMode(path string, mode os.FileMode) error {
	return fmt.Errorf("permission denied")
}

dirver.go

package ftp
import (
	"fmt"
	filedriver "github.com/goftp/file-driver"
	"github.com/goftp/server"
	"io"
	"log"
	"net"
	"os"
	"safe-agent/config"
)
type MultiUserAuth struct {
	users map[string]config.FTPUser
}
type PerUserDriverFactory struct {
	users map[string]config.FTPUser
}
type PerUserFileDriver struct {
	*filedriver.FileDriver
	users map[string]config.FTPUser
}
func (d *PerUserFileDriver) Init(conn *server.Conn) {
	// ?? 每個用戶設置自己的根目錄
	d.FileDriver.RootPath = config.Conf.FtpServer.ListenDir
}
func (d *PerUserFileDriver) Delete(path string) error {
	return fmt.Errorf("550 permission denied")
}
func (d *PerUserFileDriver) DeleteFile(path string) error {
	return fmt.Errorf("550 permission denied")
}
func (d *PerUserFileDriver) Rename(from, to string) error {
	return fmt.Errorf("550 permission denied")
}
func (d *PerUserFileDriver) PutFile(destPath string, data io.Reader, appendData bool) (int64, error) {
	return 0, fmt.Errorf("550 permission denied")
}
func (d *PerUserFileDriver) Chmod(path string, mode os.FileMode) error {
	return fmt.Errorf("550 permission denied")
}
func (d *PerUserFileDriver) Remove(path string) error {
	return fmt.Errorf("550 permission denied")
}
func (d *PerUserFileDriver) RemoveDir(path string) error {
	return fmt.Errorf("550 permission denied")
}
func (d *PerUserFileDriver) MakeDir(path string) error {
	return fmt.Errorf("550 permission denied")
}
func (f *PerUserDriverFactory) NewDriver() (server.Driver, error) {
	return &PerUserFileDriver{
		FileDriver: &filedriver.FileDriver{
			Perm: &ReadOnlyPerm{},
		},
		users: f.users,
	}, nil
}
func (a *MultiUserAuth) CheckPasswd(user, pass string) (bool, error) {
	u, ok := a.users[user]
	if !ok {
		return false, nil
	}
	return u.Password == pass, nil
}
func FtpDirver() {
	userMap := make(map[string]config.FTPUser)
	for _, u := range config.Conf.FtpServer.ListenUsers {
		userMap[u.Username] = u
	}
	host, portStr, _ := net.SplitHostPort(config.Conf.FtpServer.ListenAddr)
	port := 0
	if portStr != "" {
		fmt.Sscanf(portStr, "%d", &port)
	}
	passiveRange := config.Conf.FtpServer.PassivePortRange
	passivePorts := fmt.Sprintf("%d-%d", passiveRange.Start, passiveRange.End)
	opts := &server.ServerOpts{
		Factory: &PerUserDriverFactory{
			users: userMap,
		},
		PassivePorts: passivePorts,
		Auth:         &MultiUserAuth{users: userMap},
		Port:         port,
		Hostname:     host,
	}
	//log.Printf("FTP server listening on %s", config.Conf.FtpServer.ListenAddr)
	fmt.Printf(
		"FTP listen=%s passive_ports=%s",
		config.Conf.FtpServer.ListenAddr,
		passivePorts,
	)
	s := server.NewServer(opts)
	log.Fatal(s.ListenAndServe())
}

到此這篇關于golang實現(xiàn)ftp功能簡單又實用的文章就介紹到這了,更多相關golang實現(xiàn)ftp功能內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • GO語言開發(fā)環(huán)境搭建過程圖文詳解

    GO語言開發(fā)環(huán)境搭建過程圖文詳解

    這篇文章主要介紹了GO語言開發(fā)環(huán)境搭建過程圖文詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • 使用Go構建一款靜態(tài)分析工具Owl詳解

    使用Go構建一款靜態(tài)分析工具Owl詳解

    Owl是一款開源項目依賴分析工具,可以快速在指定的項目目錄下查找符合某些特征的源代碼文件或者依賴文件,這篇文章主要介紹了使用Go構建一款靜態(tài)分析工具,需要的朋友可以參考下
    2022-06-06
  • 一文掌握Golang模糊測試

    一文掌握Golang模糊測試

    本文主要介紹了一文掌握Golang模糊測試,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • Golang中錯誤處理機制詳解

    Golang中錯誤處理機制詳解

    平時在項目開發(fā)過程中少不了對錯誤的處理,一個好用的系統(tǒng)首先要確保其健壯性,不能經(jīng)常發(fā)生錯誤就卡死之類的情況,為了讓我們的程序更加健壯,我們就需要知道golang里的錯誤處理機制是怎么樣的,這篇文章帶大家一起學習,需要的朋友跟著小編一起來看看吧
    2024-05-05
  • 以Golang為例詳解AST抽象語法樹的原理與實現(xiàn)

    以Golang為例詳解AST抽象語法樹的原理與實現(xiàn)

    AST?使用樹狀結構來表達編程語言的結構,樹中的每一個節(jié)點都表示源碼中的一個結構,本文將以GO語言為例,為大家介紹一下AST抽象語法樹的原理與實現(xiàn),希望對大家有所幫助
    2024-01-01
  • Golang切片刪除指定元素的三種方法對比

    Golang切片刪除指定元素的三種方法對比

    Go語言并沒有提供用于刪除元素的語法或接口,而是通過利用切片本身的特性來刪除元素—追加元素,這篇文章主要給大家介紹了關于Golang切片刪除指定元素的三種方法,需要的朋友可以參考下
    2022-06-06
  • Golang使用Swag搭建api文檔的全過程

    Golang使用Swag搭建api文檔的全過程

    Gin是Golang目前最為常用的Web框架之一,公司項目驗收需要API接口設計說明書(Golang后端服務基于Gin框架編寫),所以本文給大家介紹了Golang使用Swag搭建api文檔的全過程,需要的朋友可以參考下
    2024-02-02
  • Go項目中使用Casbin實現(xiàn)RBAC權限管理教程

    Go項目中使用Casbin實現(xiàn)RBAC權限管理教程

    本文主要介紹了Go項目中使用Casbin實現(xiàn)RBAC權限管理教程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-01-01
  • go語言同步教程之條件變量

    go語言同步教程之條件變量

    這篇文章主要給大家介紹了關于go語言同步教程之條件變量的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-07-07
  • go語言優(yōu)雅地處理error工具及技巧詳解

    go語言優(yōu)雅地處理error工具及技巧詳解

    這篇文章主要為大家介紹了go語言優(yōu)雅地處理error工具及技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11

最新評論

台南县| 墨竹工卡县| 甘泉县| 江源县| 略阳县| 东乡县| 布尔津县| 尤溪县| 奇台县| 新疆| 彭山县| 临汾市| 淮南市| 夏邑县| 崇州市| 贵德县| 库尔勒市| 历史| 石家庄市| 土默特左旗| 苏尼特右旗| 图们市| 响水县| 乾安县| 桃园县| 怀柔区| 攀枝花市| 蓬溪县| 电白县| 东乡县| 沧州市| 韶关市| 宿州市| 久治县| 宁津县| 冀州市| 邛崃市| 景宁| 遵义县| 化德县| 神农架林区|