Innitial Commit
+added Base Project Version 0.0.1
This commit is contained in:
20
internal/config/config.go
Normal file
20
internal/config/config.go
Normal file
@@ -0,0 +1,20 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"os"
|
||||
|
||||
"pdev-ssh/internal/models"
|
||||
"gopkg.in/yaml.v3"
|
||||
)
|
||||
|
||||
func LoadConfig(path string) (models.AppConfig, error) {
|
||||
var cfg models.AppConfig
|
||||
|
||||
data, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
return cfg, err
|
||||
}
|
||||
|
||||
err = yaml.Unmarshal(data, &cfg)
|
||||
return cfg, err
|
||||
}
|
||||
28
internal/models/server.go
Normal file
28
internal/models/server.go
Normal file
@@ -0,0 +1,28 @@
|
||||
package models
|
||||
|
||||
type TerminalSettings struct {
|
||||
Term string `yaml:"term"`
|
||||
EnableKittyFix bool `yaml:"enable_kitty_fix"`
|
||||
}
|
||||
|
||||
type Settings struct {
|
||||
Theme string `yaml:"theme"`
|
||||
Terminal TerminalSettings `yaml:"terminal"`
|
||||
}
|
||||
|
||||
type Server struct {
|
||||
Name string `yaml:"name"`
|
||||
Host string `yaml:"host"`
|
||||
User string `yaml:"user"`
|
||||
Port int `yaml:"port"`
|
||||
Group string `yaml:"group"`
|
||||
Auth string `yaml:"auth"`
|
||||
Key string `yaml:"key"`
|
||||
PasswordID string `yaml:"password_id"`
|
||||
KittyFix bool `yaml:"kitty_fix"`
|
||||
}
|
||||
|
||||
type AppConfig struct {
|
||||
Settings Settings `yaml:"settings"`
|
||||
Servers []Server `yaml:"servers"`
|
||||
}
|
||||
45
internal/secret/keyring.go
Normal file
45
internal/secret/keyring.go
Normal file
@@ -0,0 +1,45 @@
|
||||
package secret
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/99designs/keyring"
|
||||
)
|
||||
|
||||
const serviceName = "pdev-ssh"
|
||||
|
||||
func OpenKeyring() (keyring.Keyring, error) {
|
||||
return keyring.Open(keyring.Config{
|
||||
ServiceName: serviceName,
|
||||
})
|
||||
}
|
||||
|
||||
func GetPassword(id string) (string, error) {
|
||||
kr, err := OpenKeyring()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
item, err := kr.Get(id)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return string(item.Data), nil
|
||||
}
|
||||
|
||||
func SavePassword(id string, password string) error {
|
||||
if id == "" {
|
||||
return fmt.Errorf("password_id fehlt")
|
||||
}
|
||||
|
||||
kr, err := OpenKeyring()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return kr.Set(keyring.Item{
|
||||
Key: id,
|
||||
Data: []byte(password),
|
||||
})
|
||||
}
|
||||
54
internal/sshclient/ssh.go
Normal file
54
internal/sshclient/ssh.go
Normal file
@@ -0,0 +1,54 @@
|
||||
package sshclient
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"pdev-ssh/internal/models"
|
||||
|
||||
"golang.org/x/crypto/ssh"
|
||||
)
|
||||
|
||||
func ConnectWithPassword(server models.Server, password string) error {
|
||||
config := &ssh.ClientConfig{
|
||||
User: server.User,
|
||||
Auth: []ssh.AuthMethod{
|
||||
ssh.Password(password),
|
||||
},
|
||||
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
|
||||
}
|
||||
|
||||
addr := fmt.Sprintf("%s:%d", server.Host, server.Port)
|
||||
|
||||
client, err := ssh.Dial("tcp", addr, config)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer client.Close()
|
||||
|
||||
session, err := client.NewSession()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer session.Close()
|
||||
|
||||
session.Stdout = os.Stdout
|
||||
session.Stderr = os.Stderr
|
||||
session.Stdin = os.Stdin
|
||||
|
||||
modes := ssh.TerminalModes{
|
||||
ssh.ECHO: 1,
|
||||
ssh.TTY_OP_ISPEED: 14400,
|
||||
ssh.TTY_OP_OSPEED: 14400,
|
||||
}
|
||||
|
||||
if err := session.RequestPty("xterm-256color", 40, 120, modes); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := session.Shell(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return session.Wait()
|
||||
}
|
||||
Reference in New Issue
Block a user