修复文件编码导致的异常断开

This commit is contained in:
xinyi 2021-04-22 09:52:22 +08:00
parent cd718bde5f
commit 29d17d84fb
10 changed files with 89 additions and 71 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

View File

@ -54,7 +54,7 @@ type SshConn struct {
//flushComboOutput flush ssh.session combine output into websocket response
func flushComboOutput(w *wsBufferWriter, wsConn *websocket.Conn) error {
if w.buffer.Len() != 0 {
err := wsConn.WriteMessage(websocket.TextMessage, w.buffer.Bytes())
err := wsConn.WriteMessage(websocket.BinaryMessage, w.buffer.Bytes())
if err != nil {
return err
}

View File

@ -24,12 +24,12 @@ func Login(c *gin.Context) {
db := database.Get()
defer db.Close()
db.DB.Where(model.User{Phone: user.Phone}).FirstOrCreate(&userinfo)
new_token, err := common.ReleaseToken(userinfo.ID)
newToken, err := common.ReleaseToken(userinfo.ID)
if err == nil && userinfo.ID > 0 {
resp.Code = errcode.C_nil_err
resp.Msg = "登陆成功"
resp.Data = userinfo
resp.Token = new_token
resp.Token = newToken
} else {
resp.Code = errcode.S_auth_err
resp.Msg = "Token创建失败"

View File

@ -13,19 +13,19 @@ import (
"ssh_manage/model/Apiform"
)
type sftp_req struct {
type sftpReq struct {
Type string `json:"type"`
Token string `json:"token"`
}
type sftp_resp struct {
type sftpResp struct {
Code int `json:"code"`
Type string `json:"type"`
Msg string `json:"msg"`
Data string `json:"data"`
}
func Sftp_ssh(c *gin.Context) {
func SftpSsh(c *gin.Context) {
wsConn, err := upGrader.Upgrade(c.Writer, c.Request, nil)
if core.HandleError(c, err) {
return
@ -35,8 +35,8 @@ func Sftp_ssh(c *gin.Context) {
var auth Apiform.WsAuth
if c.ShouldBindUri(&auth) != nil {
wsConn.WriteMessage(websocket.TextMessage, []byte("参数错误\r\n"))
wsConn.Close()
_ = wsConn.WriteMessage(websocket.TextMessage, []byte("参数错误\r\n"))
_ = wsConn.Close()
return
}
@ -44,60 +44,60 @@ func Sftp_ssh(c *gin.Context) {
_, wsData, err := wsConn.ReadMessage()
if err != nil {
log.Println(err.Error())
wsConn.Close()
_ = wsConn.Close()
//logrus.WithError(err).Error("reading webSocket message failed")
return
}
//unmashal bytes into struct
msgObj := sftp_req{}
msgObj := sftpReq{}
if err := json.Unmarshal(wsData, &msgObj); err != nil {
log.Println("Auth : unmarshal websocket message failed:", string(wsData))
continue
}
resp_msg := sftp_resp{}
respMsg := sftpResp{}
token := msgObj.Token
claims, err := common.ParseToken(token)
valid := claims.Valid()
if valid != nil || err != nil {
resp_msg.Code = errcode.S_auth_fmt_err
resp_msg.Msg = "身份令牌校验不通过"
resp_msg.Data = err.Error()
msg, _ := json.Marshal(resp_msg)
respMsg.Code = errcode.S_auth_fmt_err
respMsg.Msg = "身份令牌校验不通过"
respMsg.Data = err.Error()
msg, _ := json.Marshal(respMsg)
if err := wsConn.WriteMessage(websocket.TextMessage, msg); err != nil {
log.Println("sftp token fmt err:", err)
}
wsConn.Close()
_ = wsConn.Close()
return
}
if claims.Userid != sftp_clients.Client.C[auth.Sid].Uid { //身份与缓存不符合
resp_msg.Code = errcode.S_auth_fmt_err
resp_msg.Msg = "用户权限不通过"
resp_msg.Data = err.Error()
msg, _ := json.Marshal(resp_msg)
respMsg.Code = errcode.S_auth_fmt_err
respMsg.Msg = "用户权限不通过"
respMsg.Data = err.Error()
msg, _ := json.Marshal(respMsg)
if err := wsConn.WriteMessage(websocket.TextMessage, msg); err != nil {
log.Println("sftp server_user err:", err)
}
wsConn.Close()
_ = wsConn.Close()
return
}
path, err := sftp_clients.Client.C[auth.Sid].Sftp.Getwd()
if err != nil {
resp_msg.Code = errcode.S_send_err
resp_msg.Type = "connect"
resp_msg.Msg = "SFTP连接失败"
msg, _ := json.Marshal(resp_msg)
respMsg.Code = errcode.S_send_err
respMsg.Type = "connect"
respMsg.Msg = "SFTP连接失败"
msg, _ := json.Marshal(respMsg)
if err := wsConn.WriteMessage(websocket.TextMessage, msg); err != nil {
log.Println("sftp connect err:", err)
}
return
}
resp_msg.Code = 200
resp_msg.Type = "connect"
resp_msg.Msg = "连接成功"
resp_msg.Data = path
msg, _ := json.Marshal(resp_msg)
respMsg.Code = 200
respMsg.Type = "connect"
respMsg.Msg = "连接成功"
respMsg.Data = path
msg, _ := json.Marshal(respMsg)
if err := wsConn.WriteMessage(websocket.TextMessage, msg); err != nil {
log.Println("sftp return err:", err)
return

View File

@ -24,7 +24,7 @@ var upGrader = websocket.Upgrader{
},
}
type Auth_msg struct {
type AuthMsg struct {
Type string `json:"type"`
Token string `json:"token"`
}
@ -50,12 +50,12 @@ func WsSsh(c *gin.Context) {
return
}
var ser_info Apiform.SerInfo //接收反序列化数据
var serInfo Apiform.SerInfo //接收反序列化数据
var auth Apiform.WsAuth
if c.ShouldBindUri(&auth) != nil {
wsConn.WriteMessage(websocket.TextMessage, []byte("参数错误\r\n"))
wsConn.Close()
_ = wsConn.WriteMessage(websocket.BinaryMessage, []byte("参数错误\r\n"))
_ = wsConn.Close()
return
}
@ -63,12 +63,12 @@ func WsSsh(c *gin.Context) {
_, wsData, err := wsConn.ReadMessage()
if err != nil {
log.Println(err.Error())
wsConn.Close()
_ = wsConn.Close()
//logrus.WithError(err).Error("reading webSocket message failed")
return
}
//unmashal bytes into struct
msgObj := Auth_msg{}
msgObj := AuthMsg{}
if err := json.Unmarshal(wsData, &msgObj); err != nil {
log.Println("Auth : unmarshal websocket message failed:", string(wsData))
continue
@ -77,35 +77,35 @@ func WsSsh(c *gin.Context) {
claims, err := common.ParseToken(token)
valid := claims.Valid()
if valid != nil || err != nil {
wsConn.WriteMessage(websocket.TextMessage, []byte("身份验证失败\r\n"))
wsConn.Close()
_ = wsConn.WriteMessage(websocket.BinaryMessage, []byte("身份验证失败\r\n"))
_ = wsConn.Close()
return
}
cache := database.Cache.Get()
defer cache.Close()
//log.Println(auth)
s_info, err := redis.Bytes(cache.Do("GET", auth.Sid))
sInfo, err := redis.Bytes(cache.Do("GET", auth.Sid))
//log.Println(string(s_info))
if err != nil || len(s_info) == 0 {
wsConn.WriteMessage(websocket.TextMessage, []byte("连接超时,请重试!\r\n"))
wsConn.Close()
if err != nil || len(sInfo) == 0 {
_ = wsConn.WriteMessage(websocket.BinaryMessage, []byte("连接超时,请重试!\r\n"))
_ = wsConn.Close()
return
}
if json.Unmarshal(s_info, &ser_info) != nil {
wsConn.WriteMessage(websocket.TextMessage, []byte("服务器信息获取失败,请重试!\r\n"))
wsConn.Close()
if json.Unmarshal(sInfo, &serInfo) != nil {
_ = wsConn.WriteMessage(websocket.BinaryMessage, []byte("服务器信息获取失败,请重试!\r\n"))
_ = wsConn.Close()
return
}
//log.Println(ser_info)
if claims.Userid != ser_info.BindUser { //验证权限
wsConn.WriteMessage(websocket.TextMessage, []byte("权限验证失败,请重试!\r\n"))
wsConn.Close()
if claims.Userid != serInfo.BindUser { //验证权限
_ = wsConn.WriteMessage(websocket.BinaryMessage, []byte("权限验证失败,请重试!\r\n"))
_ = wsConn.Close()
return
}
break
//break
}
client, err := core.NewSshClient(core.Server{ser_info.Ip, ser_info.Port, ser_info.Username, ser_info.Password})
client, err := core.NewSshClient(core.Server{serInfo.Ip, serInfo.Port, serInfo.Username, serInfo.Password})
if core.WshandleError(wsConn, err) {
return
}
@ -116,7 +116,7 @@ func WsSsh(c *gin.Context) {
return
}
sftp_clients.Client.Lock()
sftp_clients.Client.C[auth.Sid] = &sftp_clients.MyClient{ser_info.BindUser, ssConn.SftpClient}
sftp_clients.Client.C[auth.Sid] = &sftp_clients.MyClient{serInfo.BindUser, ssConn.SftpClient}
sftp_clients.Client.Unlock()
defer func() {
sftp_clients.Client.Lock()

View File

@ -9,20 +9,20 @@ import (
"ssh_manage/model"
)
var dbconf = config.Config.Database
var dbConf = config.Config.Database
var pool *sqlpool
type Mydb struct {
type MyDb struct {
DB *gorm.DB
}
func init() {
pool = newpool(newDb, dbconf.Poolsize)
pool = newpool(newDb, dbConf.Poolsize)
}
func newDb() *gorm.DB {
db, err := gorm.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local",dbconf.Username,dbconf.Password,dbconf.Host,dbconf.Port,dbconf.Dbname))
db, err := gorm.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", dbConf.Username, dbConf.Password, dbConf.Host, dbConf.Port, dbConf.Dbname))
if err != nil {
log.Panicf("db open err :%s", err.Error())
}
@ -33,10 +33,10 @@ func newDb() *gorm.DB {
return db
}
func (s *Mydb) Close() {
func (s *MyDb) Close() {
pool.put(s.DB)
}
func Get() *Mydb {
return &Mydb{pool.get()}
func Get() *MyDb {
return &MyDb{pool.get()}
}

10
go.sum
View File

@ -2,9 +2,11 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/Gre-Z/common v0.0.0-20191024025434-2dbc6bd196f9 h1:q+nKJ4E5tIiGVcXcRqwPxjxRmGHtC+wWohKHtCHzJmE=
github.com/Gre-Z/common v0.0.0-20191024025434-2dbc6bd196f9/go.mod h1:b5J9o16Ec1LAwq6QVv+pNECF3sxcin2dMKprGZX43mA=
github.com/PuerkitoBio/goquery v1.5.1 h1:PSPBGne8NIUWw+/7vFBV+kG2J/5MOjbzc7154OaKCSE=
github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
github.com/aliyun/alibaba-cloud-sdk-go v1.61.623 h1:iKyKSF67tLwsVSs6okuvVdr9C9kV7y4OGNTCx16IKfg=
github.com/aliyun/alibaba-cloud-sdk-go v1.61.623/go.mod h1:pUKYbK5JQ+1Dfxk80P0qxGqe5dkxDoabbZS7zOcouyA=
github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5zzsLTo=
github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@ -31,11 +33,13 @@ github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d h1:lBXNCxVENCipq4D1Is42JVOP4eQjlB8TQ6H69Yx5J9Q=
github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
@ -66,7 +70,6 @@ github.com/mattn/go-sqlite3 v1.14.0 h1:mLyGNKR8+Vv9CAU7PphKa2hkEqxxhn8i32J6FPj1/
github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@ -84,9 +87,9 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykE
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs=
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
@ -96,7 +99,6 @@ github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd h1:GGJVjV8waZKRHrgwvtH66z9ZGVurTD1MT0n1Bb+q4aM=
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM=
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@ -104,6 +106,7 @@ golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73r
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@ -114,6 +117,7 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384 h1:TFlARGu6Czu1z7q93HTxcP1P+/ZFC/IKythI5RzrnRg=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

View File

@ -55,7 +55,7 @@ func main() {
api.POST("/login", controller.Login)
api.POST("/send", controller.Send)
api.GET("/term/:sid", controller.WsSsh)
api.GET("/sftp/:sid", controller.Sftp_ssh)
api.GET("/sftp/:sid", controller.SftpSsh)
api.Use(middleware.Auth()).GET("/userinfo", controller.Info)
api.Use(middleware.Auth()).POST("/nickname", controller.UpdataNick)
api.Use(middleware.Auth()).POST("/addser", controller.Addser)

View File

@ -59,7 +59,7 @@ socket.onopen = function () {
type: "cmd",
cmd: data,
}
socket.send(JSON.stringify(sdata));
socket.send(str2utf8(JSON.stringify(sdata)));
});
term.on('resize', size => {
@ -78,8 +78,17 @@ socket.onopen = function () {
create_sftp()
is_login = true
}
term.write(msg.data);
update_path(msg.data)
let reader = new FileReader();
reader.onload = function (event) {
let content = reader.result;//内容就在这里
//delete reader
//console.log(content)
term.write(content);
update_path(content);
};
reader.readAsText(msg.data);
//term.write(msg.data);
};
socket.onerror = function (e) {
is_login = false
@ -95,6 +104,11 @@ socket.onopen = function () {
};
};
function str2utf8(str) {
let encoder = new TextEncoder('utf8');
return encoder.encode(str);
}
function update_path(str) { //判断是否有效路径后更新当前所在路径用于SFTP功能
//console.log(str)
let splice = String.fromCharCode(7)
@ -103,14 +117,14 @@ function update_path(str) { //判断是否有效路径后更新当前所在
if (start >= 0 && end >= 0) {
let path = trimStr(str.substring(start + 1, end))
let verify = path.indexOf(" ")
if(verify == -1){
if (verify == -1) {
//console.log(path)
if(path.substr(0,1) == "~" || path.substr(0,1) == "/"){
if(path.substr(0,1) == "~"){ //替换~为用户目录
if (path.substr(0, 1) == "~" || path.substr(0, 1) == "/") {
if (path.substr(0, 1) == "~") { //替换~为用户目录
path = server_pwd + path.substr(1)
}
//console.log(path)
if(session_path != path){
if (session_path != path) {
session_path = path
}
}
@ -118,6 +132,6 @@ function update_path(str) { //判断是否有效路径后更新当前所在
}
}
function trimStr(str){
return str.replace(/(^\s*)|(\s*$)/g,"");
function trimStr(str) {
return str.replace(/(^\s*)|(\s*$)/g, "");
}

View File

@ -39,7 +39,7 @@
<script src="/static/xterm/search.min.js"></script>
<script src="/static/js/net.js?v=1.9"></script>
<script src="/static/js/sftp.js?v=0.17"></script>
<script src="/static/xterm/main.js?v=0.87"></script>
<script src="/static/xterm/main.js?v=0.88"></script>
<script src="/static/js/polyfill.js"></script>
<script src="/static/js/fileupload.js?v=0.75"></script>
</html>