2023-04-04 14:11:09 +08:00
|
|
|
|
package ftp
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"log"
|
2025-06-13 13:05:50 +08:00
|
|
|
|
"net"
|
|
|
|
|
"os/user"
|
2023-04-04 14:11:09 +08:00
|
|
|
|
"path/filepath"
|
2025-06-13 13:05:50 +08:00
|
|
|
|
"strings"
|
2023-04-04 14:11:09 +08:00
|
|
|
|
|
|
|
|
|
"github.com/spf13/cobra"
|
2025-06-13 13:05:50 +08:00
|
|
|
|
"goftp.io/server/v2"
|
2023-04-04 14:11:09 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var ports int
|
2025-06-13 13:05:50 +08:00
|
|
|
|
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
|
|
|
|
|
}
|
2023-04-04 14:11:09 +08:00
|
|
|
|
|
|
|
|
|
// ftpCmd represents the ftp command
|
|
|
|
|
var Cmd = &cobra.Command{
|
|
|
|
|
Use: "ftp",
|
|
|
|
|
Short: `FTP文件服务器`,
|
|
|
|
|
Long: `FTP文件服务器`,
|
|
|
|
|
Run: func(cmd *cobra.Command, args []string) {
|
2025-06-13 13:05:50 +08:00
|
|
|
|
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()
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-04-04 14:11:09 +08:00
|
|
|
|
path, _ = filepath.Abs(path)
|
2025-06-13 13:05:50 +08:00
|
|
|
|
driver, err := NewDriver(path)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal("Error starting server:", err)
|
2023-04-04 14:11:09 +08:00
|
|
|
|
}
|
2025-06-13 13:05:50 +08:00
|
|
|
|
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,
|
2023-04-04 14:11:09 +08:00
|
|
|
|
}
|
|
|
|
|
log.Printf("Starting ftp server on %v:%v", opts.Hostname, opts.Port)
|
2025-06-13 13:05:50 +08:00
|
|
|
|
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()
|
2023-04-04 14:11:09 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
log.Fatal("Error starting server:", err)
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func init() {
|
2025-06-13 13:05:50 +08:00
|
|
|
|
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")
|
2023-04-04 14:11:09 +08:00
|
|
|
|
Cmd.Flags().IntVarP(&ports, "port", "p", 21, "监听端口")
|
|
|
|
|
Cmd.Flags().StringVarP(&ip, "ip", "i", "0.0.0.0", "监听地址")
|
2025-06-13 13:05:50 +08:00
|
|
|
|
Cmd.Flags().StringVarP(&authuser, "auth-user", "u", "", "用户名,默认为任意")
|
|
|
|
|
Cmd.Flags().StringVarP(&authpwd, "auth-passwd", "k", "", "密码,默认为任意")
|
2023-04-04 14:11:09 +08:00
|
|
|
|
Cmd.Flags().StringVarP(&path, "folder", "f", "./", "本地文件地址")
|
2025-06-13 13:05:50 +08:00
|
|
|
|
Cmd.Flags().BoolVarP(&forceTls, "force-tls", "t", false, "强制使用TLS加密传输")
|
|
|
|
|
Cmd.Flags().StringVarP(&cert, "cert", "C", "", "TLS证书文件")
|
|
|
|
|
Cmd.Flags().StringVarP(&key, "key", "K", "", "TLS密钥文件")
|
2023-04-04 14:11:09 +08:00
|
|
|
|
}
|