29 lines
886 B
Go
29 lines
886 B
Go
package frp
|
||||
|
|
|
|||
|
|
import (
|
|||
|
|
"context"
|
|||
|
|
"fmt"
|
|||
|
|
|
|||
|
|
"github.com/havline/havline/internal/terminal"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// OpenSSHTerminal 用该服务端已保存的 SSH 凭据建立一个交互式 PTY 会话。
|
|||
|
|
// 凭据解密与主机密钥校验(known_hosts TOFU)都复用「安装 Agent」那套 sshInstaller,
|
|||
|
|
// 不再实现一份认证逻辑,也不允许终端页面输入密码。
|
|||
|
|
func (s *Service) OpenSSHTerminal(ctx context.Context, serverID int64, cols, rows int) (terminal.Terminal, string, error) {
|
|||
|
|
server, installer, err := s.sshInstaller(ctx, serverID)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, "", err
|
|||
|
|
}
|
|||
|
|
client, err := installer.client(ctx)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, "", err
|
|||
|
|
}
|
|||
|
|
term, err := terminal.NewSSHTerminal(client, cols, rows)
|
|||
|
|
if err != nil {
|
|||
|
|
_ = client.Close()
|
|||
|
|
return nil, "", err
|
|||
|
|
}
|
|||
|
|
return term, fmt.Sprintf("%s · %s@%s", server.Name, server.SSHUser, server.SSHHost), nil
|
|||
|
|
}
|