修复文件编码导致的异常断开
This commit is contained in:
parent
cd718bde5f
commit
29d17d84fb
@ -54,7 +54,7 @@ type SshConn struct {
|
|||||||
//flushComboOutput flush ssh.session combine output into websocket response
|
//flushComboOutput flush ssh.session combine output into websocket response
|
||||||
func flushComboOutput(w *wsBufferWriter, wsConn *websocket.Conn) error {
|
func flushComboOutput(w *wsBufferWriter, wsConn *websocket.Conn) error {
|
||||||
if w.buffer.Len() != 0 {
|
if w.buffer.Len() != 0 {
|
||||||
err := wsConn.WriteMessage(websocket.TextMessage, w.buffer.Bytes())
|
err := wsConn.WriteMessage(websocket.BinaryMessage, w.buffer.Bytes())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,12 +24,12 @@ func Login(c *gin.Context) {
|
|||||||
db := database.Get()
|
db := database.Get()
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
db.DB.Where(model.User{Phone: user.Phone}).FirstOrCreate(&userinfo)
|
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 {
|
if err == nil && userinfo.ID > 0 {
|
||||||
resp.Code = errcode.C_nil_err
|
resp.Code = errcode.C_nil_err
|
||||||
resp.Msg = "登陆成功"
|
resp.Msg = "登陆成功"
|
||||||
resp.Data = userinfo
|
resp.Data = userinfo
|
||||||
resp.Token = new_token
|
resp.Token = newToken
|
||||||
} else {
|
} else {
|
||||||
resp.Code = errcode.S_auth_err
|
resp.Code = errcode.S_auth_err
|
||||||
resp.Msg = "Token创建失败"
|
resp.Msg = "Token创建失败"
|
||||||
|
|||||||
@ -13,19 +13,19 @@ import (
|
|||||||
"ssh_manage/model/Apiform"
|
"ssh_manage/model/Apiform"
|
||||||
)
|
)
|
||||||
|
|
||||||
type sftp_req struct {
|
type sftpReq struct {
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
Token string `json:"token"`
|
Token string `json:"token"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type sftp_resp struct {
|
type sftpResp struct {
|
||||||
Code int `json:"code"`
|
Code int `json:"code"`
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
Msg string `json:"msg"`
|
Msg string `json:"msg"`
|
||||||
Data string `json:"data"`
|
Data string `json:"data"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func Sftp_ssh(c *gin.Context) {
|
func SftpSsh(c *gin.Context) {
|
||||||
wsConn, err := upGrader.Upgrade(c.Writer, c.Request, nil)
|
wsConn, err := upGrader.Upgrade(c.Writer, c.Request, nil)
|
||||||
if core.HandleError(c, err) {
|
if core.HandleError(c, err) {
|
||||||
return
|
return
|
||||||
@ -35,8 +35,8 @@ func Sftp_ssh(c *gin.Context) {
|
|||||||
var auth Apiform.WsAuth
|
var auth Apiform.WsAuth
|
||||||
|
|
||||||
if c.ShouldBindUri(&auth) != nil {
|
if c.ShouldBindUri(&auth) != nil {
|
||||||
wsConn.WriteMessage(websocket.TextMessage, []byte("参数错误\r\n"))
|
_ = wsConn.WriteMessage(websocket.TextMessage, []byte("参数错误\r\n"))
|
||||||
wsConn.Close()
|
_ = wsConn.Close()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,60 +44,60 @@ func Sftp_ssh(c *gin.Context) {
|
|||||||
_, wsData, err := wsConn.ReadMessage()
|
_, wsData, err := wsConn.ReadMessage()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err.Error())
|
log.Println(err.Error())
|
||||||
wsConn.Close()
|
_ = wsConn.Close()
|
||||||
//logrus.WithError(err).Error("reading webSocket message failed")
|
//logrus.WithError(err).Error("reading webSocket message failed")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
//unmashal bytes into struct
|
//unmashal bytes into struct
|
||||||
msgObj := sftp_req{}
|
msgObj := sftpReq{}
|
||||||
if err := json.Unmarshal(wsData, &msgObj); err != nil {
|
if err := json.Unmarshal(wsData, &msgObj); err != nil {
|
||||||
log.Println("Auth : unmarshal websocket message failed:", string(wsData))
|
log.Println("Auth : unmarshal websocket message failed:", string(wsData))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
resp_msg := sftp_resp{}
|
respMsg := sftpResp{}
|
||||||
token := msgObj.Token
|
token := msgObj.Token
|
||||||
claims, err := common.ParseToken(token)
|
claims, err := common.ParseToken(token)
|
||||||
valid := claims.Valid()
|
valid := claims.Valid()
|
||||||
if valid != nil || err != nil {
|
if valid != nil || err != nil {
|
||||||
resp_msg.Code = errcode.S_auth_fmt_err
|
respMsg.Code = errcode.S_auth_fmt_err
|
||||||
resp_msg.Msg = "身份令牌校验不通过"
|
respMsg.Msg = "身份令牌校验不通过"
|
||||||
resp_msg.Data = err.Error()
|
respMsg.Data = err.Error()
|
||||||
msg, _ := json.Marshal(resp_msg)
|
msg, _ := json.Marshal(respMsg)
|
||||||
if err := wsConn.WriteMessage(websocket.TextMessage, msg); err != nil {
|
if err := wsConn.WriteMessage(websocket.TextMessage, msg); err != nil {
|
||||||
log.Println("sftp token fmt err:", err)
|
log.Println("sftp token fmt err:", err)
|
||||||
}
|
}
|
||||||
wsConn.Close()
|
_ = wsConn.Close()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if claims.Userid != sftp_clients.Client.C[auth.Sid].Uid { //身份与缓存不符合
|
if claims.Userid != sftp_clients.Client.C[auth.Sid].Uid { //身份与缓存不符合
|
||||||
resp_msg.Code = errcode.S_auth_fmt_err
|
respMsg.Code = errcode.S_auth_fmt_err
|
||||||
resp_msg.Msg = "用户权限不通过"
|
respMsg.Msg = "用户权限不通过"
|
||||||
resp_msg.Data = err.Error()
|
respMsg.Data = err.Error()
|
||||||
msg, _ := json.Marshal(resp_msg)
|
msg, _ := json.Marshal(respMsg)
|
||||||
if err := wsConn.WriteMessage(websocket.TextMessage, msg); err != nil {
|
if err := wsConn.WriteMessage(websocket.TextMessage, msg); err != nil {
|
||||||
log.Println("sftp server_user err:", err)
|
log.Println("sftp server_user err:", err)
|
||||||
}
|
}
|
||||||
wsConn.Close()
|
_ = wsConn.Close()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
path, err := sftp_clients.Client.C[auth.Sid].Sftp.Getwd()
|
path, err := sftp_clients.Client.C[auth.Sid].Sftp.Getwd()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
resp_msg.Code = errcode.S_send_err
|
respMsg.Code = errcode.S_send_err
|
||||||
resp_msg.Type = "connect"
|
respMsg.Type = "connect"
|
||||||
resp_msg.Msg = "SFTP连接失败"
|
respMsg.Msg = "SFTP连接失败"
|
||||||
msg, _ := json.Marshal(resp_msg)
|
msg, _ := json.Marshal(respMsg)
|
||||||
if err := wsConn.WriteMessage(websocket.TextMessage, msg); err != nil {
|
if err := wsConn.WriteMessage(websocket.TextMessage, msg); err != nil {
|
||||||
log.Println("sftp connect err:", err)
|
log.Println("sftp connect err:", err)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
resp_msg.Code = 200
|
respMsg.Code = 200
|
||||||
resp_msg.Type = "connect"
|
respMsg.Type = "connect"
|
||||||
resp_msg.Msg = "连接成功"
|
respMsg.Msg = "连接成功"
|
||||||
resp_msg.Data = path
|
respMsg.Data = path
|
||||||
msg, _ := json.Marshal(resp_msg)
|
msg, _ := json.Marshal(respMsg)
|
||||||
if err := wsConn.WriteMessage(websocket.TextMessage, msg); err != nil {
|
if err := wsConn.WriteMessage(websocket.TextMessage, msg); err != nil {
|
||||||
log.Println("sftp return err:", err)
|
log.Println("sftp return err:", err)
|
||||||
return
|
return
|
||||||
|
|||||||
@ -24,7 +24,7 @@ var upGrader = websocket.Upgrader{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
type Auth_msg struct {
|
type AuthMsg struct {
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
Token string `json:"token"`
|
Token string `json:"token"`
|
||||||
}
|
}
|
||||||
@ -50,12 +50,12 @@ func WsSsh(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var ser_info Apiform.SerInfo //接收反序列化数据
|
var serInfo Apiform.SerInfo //接收反序列化数据
|
||||||
var auth Apiform.WsAuth
|
var auth Apiform.WsAuth
|
||||||
|
|
||||||
if c.ShouldBindUri(&auth) != nil {
|
if c.ShouldBindUri(&auth) != nil {
|
||||||
wsConn.WriteMessage(websocket.TextMessage, []byte("参数错误\r\n"))
|
_ = wsConn.WriteMessage(websocket.BinaryMessage, []byte("参数错误\r\n"))
|
||||||
wsConn.Close()
|
_ = wsConn.Close()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,12 +63,12 @@ func WsSsh(c *gin.Context) {
|
|||||||
_, wsData, err := wsConn.ReadMessage()
|
_, wsData, err := wsConn.ReadMessage()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println(err.Error())
|
log.Println(err.Error())
|
||||||
wsConn.Close()
|
_ = wsConn.Close()
|
||||||
//logrus.WithError(err).Error("reading webSocket message failed")
|
//logrus.WithError(err).Error("reading webSocket message failed")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
//unmashal bytes into struct
|
//unmashal bytes into struct
|
||||||
msgObj := Auth_msg{}
|
msgObj := AuthMsg{}
|
||||||
if err := json.Unmarshal(wsData, &msgObj); err != nil {
|
if err := json.Unmarshal(wsData, &msgObj); err != nil {
|
||||||
log.Println("Auth : unmarshal websocket message failed:", string(wsData))
|
log.Println("Auth : unmarshal websocket message failed:", string(wsData))
|
||||||
continue
|
continue
|
||||||
@ -77,35 +77,35 @@ func WsSsh(c *gin.Context) {
|
|||||||
claims, err := common.ParseToken(token)
|
claims, err := common.ParseToken(token)
|
||||||
valid := claims.Valid()
|
valid := claims.Valid()
|
||||||
if valid != nil || err != nil {
|
if valid != nil || err != nil {
|
||||||
wsConn.WriteMessage(websocket.TextMessage, []byte("身份验证失败\r\n"))
|
_ = wsConn.WriteMessage(websocket.BinaryMessage, []byte("身份验证失败\r\n"))
|
||||||
wsConn.Close()
|
_ = wsConn.Close()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
cache := database.Cache.Get()
|
cache := database.Cache.Get()
|
||||||
defer cache.Close()
|
defer cache.Close()
|
||||||
//log.Println(auth)
|
//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))
|
//log.Println(string(s_info))
|
||||||
if err != nil || len(s_info) == 0 {
|
if err != nil || len(sInfo) == 0 {
|
||||||
wsConn.WriteMessage(websocket.TextMessage, []byte("连接超时,请重试!\r\n"))
|
_ = wsConn.WriteMessage(websocket.BinaryMessage, []byte("连接超时,请重试!\r\n"))
|
||||||
wsConn.Close()
|
_ = wsConn.Close()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if json.Unmarshal(s_info, &ser_info) != nil {
|
if json.Unmarshal(sInfo, &serInfo) != nil {
|
||||||
wsConn.WriteMessage(websocket.TextMessage, []byte("服务器信息获取失败,请重试!\r\n"))
|
_ = wsConn.WriteMessage(websocket.BinaryMessage, []byte("服务器信息获取失败,请重试!\r\n"))
|
||||||
wsConn.Close()
|
_ = wsConn.Close()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
//log.Println(ser_info)
|
//log.Println(ser_info)
|
||||||
if claims.Userid != ser_info.BindUser { //验证权限
|
if claims.Userid != serInfo.BindUser { //验证权限
|
||||||
wsConn.WriteMessage(websocket.TextMessage, []byte("权限验证失败,请重试!\r\n"))
|
_ = wsConn.WriteMessage(websocket.BinaryMessage, []byte("权限验证失败,请重试!\r\n"))
|
||||||
wsConn.Close()
|
_ = wsConn.Close()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
//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) {
|
if core.WshandleError(wsConn, err) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -116,7 +116,7 @@ func WsSsh(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
sftp_clients.Client.Lock()
|
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()
|
sftp_clients.Client.Unlock()
|
||||||
defer func() {
|
defer func() {
|
||||||
sftp_clients.Client.Lock()
|
sftp_clients.Client.Lock()
|
||||||
|
|||||||
@ -9,20 +9,20 @@ import (
|
|||||||
"ssh_manage/model"
|
"ssh_manage/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
var dbconf = config.Config.Database
|
var dbConf = config.Config.Database
|
||||||
|
|
||||||
var pool *sqlpool
|
var pool *sqlpool
|
||||||
|
|
||||||
type Mydb struct {
|
type MyDb struct {
|
||||||
DB *gorm.DB
|
DB *gorm.DB
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
pool = newpool(newDb, dbconf.Poolsize)
|
pool = newpool(newDb, dbConf.Poolsize)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newDb() *gorm.DB {
|
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 {
|
if err != nil {
|
||||||
log.Panicf("db open err :%s", err.Error())
|
log.Panicf("db open err :%s", err.Error())
|
||||||
}
|
}
|
||||||
@ -33,10 +33,10 @@ func newDb() *gorm.DB {
|
|||||||
return db
|
return db
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Mydb) Close() {
|
func (s *MyDb) Close() {
|
||||||
pool.put(s.DB)
|
pool.put(s.DB)
|
||||||
}
|
}
|
||||||
|
|
||||||
func Get() *Mydb {
|
func Get() *MyDb {
|
||||||
return &Mydb{pool.get()}
|
return &MyDb{pool.get()}
|
||||||
}
|
}
|
||||||
|
|||||||
10
go.sum
10
go.sum
@ -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/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 h1:q+nKJ4E5tIiGVcXcRqwPxjxRmGHtC+wWohKHtCHzJmE=
|
||||||
github.com/Gre-Z/common v0.0.0-20191024025434-2dbc6bd196f9/go.mod h1:b5J9o16Ec1LAwq6QVv+pNECF3sxcin2dMKprGZX43mA=
|
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/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 h1:iKyKSF67tLwsVSs6okuvVdr9C9kV7y4OGNTCx16IKfg=
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go v1.61.623/go.mod h1:pUKYbK5JQ+1Dfxk80P0qxGqe5dkxDoabbZS7zOcouyA=
|
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/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.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
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-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 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
|
||||||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
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/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 h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY=
|
||||||
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
|
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 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I=
|
||||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
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/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 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
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/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 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
|
||||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
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-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 h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
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/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 h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs=
|
||||||
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
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/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.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.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
|
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
|
||||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
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=
|
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-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-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-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 h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM=
|
||||||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
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-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-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-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/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
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 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
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-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=
|
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 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
|||||||
@ -55,7 +55,7 @@ func main() {
|
|||||||
api.POST("/login", controller.Login)
|
api.POST("/login", controller.Login)
|
||||||
api.POST("/send", controller.Send)
|
api.POST("/send", controller.Send)
|
||||||
api.GET("/term/:sid", controller.WsSsh)
|
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()).GET("/userinfo", controller.Info)
|
||||||
api.Use(middleware.Auth()).POST("/nickname", controller.UpdataNick)
|
api.Use(middleware.Auth()).POST("/nickname", controller.UpdataNick)
|
||||||
api.Use(middleware.Auth()).POST("/addser", controller.Addser)
|
api.Use(middleware.Auth()).POST("/addser", controller.Addser)
|
||||||
|
|||||||
@ -59,7 +59,7 @@ socket.onopen = function () {
|
|||||||
type: "cmd",
|
type: "cmd",
|
||||||
cmd: data,
|
cmd: data,
|
||||||
}
|
}
|
||||||
socket.send(JSON.stringify(sdata));
|
socket.send(str2utf8(JSON.stringify(sdata)));
|
||||||
});
|
});
|
||||||
|
|
||||||
term.on('resize', size => {
|
term.on('resize', size => {
|
||||||
@ -78,8 +78,17 @@ socket.onopen = function () {
|
|||||||
create_sftp()
|
create_sftp()
|
||||||
is_login = true
|
is_login = true
|
||||||
}
|
}
|
||||||
term.write(msg.data);
|
let reader = new FileReader();
|
||||||
update_path(msg.data)
|
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) {
|
socket.onerror = function (e) {
|
||||||
is_login = false
|
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功能
|
function update_path(str) { //判断是否有效路径后更新当前所在路径,用于SFTP功能
|
||||||
//console.log(str)
|
//console.log(str)
|
||||||
let splice = String.fromCharCode(7)
|
let splice = String.fromCharCode(7)
|
||||||
|
|||||||
@ -39,7 +39,7 @@
|
|||||||
<script src="/static/xterm/search.min.js"></script>
|
<script src="/static/xterm/search.min.js"></script>
|
||||||
<script src="/static/js/net.js?v=1.9"></script>
|
<script src="/static/js/net.js?v=1.9"></script>
|
||||||
<script src="/static/js/sftp.js?v=0.17"></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/polyfill.js"></script>
|
||||||
<script src="/static/js/fileupload.js?v=0.75"></script>
|
<script src="/static/js/fileupload.js?v=0.75"></script>
|
||||||
</html>
|
</html>
|
||||||
Loading…
Reference in New Issue
Block a user