110 lines
3.2 KiB
Go
110 lines
3.2 KiB
Go
package ftp
|
||
|
||
import (
|
||
"log"
|
||
"net"
|
||
"os/user"
|
||
"path/filepath"
|
||
"strings"
|
||
|
||
"github.com/spf13/cobra"
|
||
"goftp.io/server/v2"
|
||
)
|
||
|
||
var ports int
|
||
var authuser, authpwd string
|
||
var path, ip, publicIp string
|
||
var username, groupname, passiveports string
|
||
var cert, key string
|
||
var forceTls bool
|
||
|
||
type Auth struct {
|
||
}
|
||
|
||
func (a Auth) CheckPasswd(ctx *server.Context, user string, name string) (bool, error) {
|
||
if authuser == "" && authpwd == "" {
|
||
return true, nil
|
||
}
|
||
if authuser == user && authpwd == name {
|
||
return true, nil
|
||
}
|
||
return false, nil
|
||
}
|
||
|
||
// ftpCmd represents the ftp command
|
||
var Cmd = &cobra.Command{
|
||
Use: "ftp",
|
||
Short: `FTP文件服务器`,
|
||
Long: `FTP文件服务器`,
|
||
Run: func(cmd *cobra.Command, args []string) {
|
||
if username == "" || groupname == "" {
|
||
u, err := user.Current()
|
||
if err == nil {
|
||
username = u.Username
|
||
groupname = u.Username
|
||
} else {
|
||
username = "root"
|
||
groupname = "root"
|
||
}
|
||
}
|
||
if publicIp == "" {
|
||
if tmp, err := net.Dial("udp", "139.199.163.65:443"); err == nil {
|
||
publicIp = strings.Split(tmp.LocalAddr().String(), ":")[0]
|
||
tmp.Close()
|
||
}
|
||
}
|
||
path, _ = filepath.Abs(path)
|
||
driver, err := NewDriver(path)
|
||
if err != nil {
|
||
log.Fatal("Error starting server:", err)
|
||
}
|
||
opts := &server.Options{
|
||
Auth: Auth{},
|
||
Driver: driver,
|
||
Perm: server.NewSimplePerm(username, groupname),
|
||
Name: "B612 FTP Server",
|
||
Hostname: ip,
|
||
PublicIP: publicIp,
|
||
PassivePorts: passiveports,
|
||
Port: ports,
|
||
WelcomeMessage: "B612 FTP Server",
|
||
Logger: nil,
|
||
RateLimit: 0,
|
||
TLS: key != "" && cert != "",
|
||
ForceTLS: forceTls,
|
||
CertFile: cert,
|
||
KeyFile: key,
|
||
}
|
||
log.Printf("Starting ftp server on %v:%v", opts.Hostname, opts.Port)
|
||
log.Printf("AuthUser %v, Password %v", authuser, authpwd)
|
||
log.Printf("Public IP %v", publicIp)
|
||
log.Printf("Path %v", path)
|
||
log.Printf("Passive Ports %v", passiveports)
|
||
log.Printf("TLS %v", opts.TLS)
|
||
log.Printf("Username %v, Groupname %v", username, groupname)
|
||
server, err := server.NewServer(opts)
|
||
if err != nil {
|
||
log.Fatal("Error starting server:", err)
|
||
}
|
||
err = server.ListenAndServe()
|
||
if err != nil {
|
||
log.Fatal("Error starting server:", err)
|
||
}
|
||
},
|
||
}
|
||
|
||
func init() {
|
||
Cmd.Flags().StringVarP(&publicIp, "public-ip", "I", "", "公网IP")
|
||
Cmd.Flags().StringVarP(&username, "username", "U", "", "FTP用户名")
|
||
Cmd.Flags().StringVarP(&groupname, "groupname", "G", "", "FTP组名")
|
||
Cmd.Flags().StringVarP(&passiveports, "passiveports", "P", "50000-60000", "被动模式端口范围,格式:50000-60000")
|
||
Cmd.Flags().IntVarP(&ports, "port", "p", 21, "监听端口")
|
||
Cmd.Flags().StringVarP(&ip, "ip", "i", "0.0.0.0", "监听地址")
|
||
Cmd.Flags().StringVarP(&authuser, "auth-user", "u", "", "用户名,默认为任意")
|
||
Cmd.Flags().StringVarP(&authpwd, "auth-passwd", "k", "", "密码,默认为任意")
|
||
Cmd.Flags().StringVarP(&path, "folder", "f", "./", "本地文件地址")
|
||
Cmd.Flags().BoolVarP(&forceTls, "force-tls", "t", false, "强制使用TLS加密传输")
|
||
Cmd.Flags().StringVarP(&cert, "cert", "C", "", "TLS证书文件")
|
||
Cmd.Flags().StringVarP(&key, "key", "K", "", "TLS密钥文件")
|
||
}
|