Documentation
¶
Overview ¶
* Reference https://github.com/bramvdbogaerde/go-scp/blob/master/protocol.go
Index ¶
- Constants
- Variables
- func AbsPath(input string) string
- func AgentPostInitClientConfig(ctx *EventContext, clientConfig *ssh.ClientConfig)
- func AgentPostNewSession(ctx *EventContext, session *ssh.Session) error
- func AgentPostSSHDial(ctx *EventContext, client *ssh.Client) error
- func AuthPemPostInitClientConfig(ctx *EventContext, clientConfig *ssh.ClientConfig)
- func AuthPwdPostInitClientConfig(ctx *EventContext, clientConfig *ssh.ClientConfig)
- func AutoSSHAgent() error
- func CallbackOnStdout(ctx *EventContext, line []byte) error
- func CallbackPostShell(ctx *EventContext, stdin io.WriteCloser) error
- func ExtractBinary(name string, needClose bool) (*os.File, error)
- func FieldEmpty(t reflect.Type, v reflect.Value) bool
- func FieldsNotEmpty(v interface{}, ignoreKeys []string) ([]string, error)
- func IOOnStderr(ctx *EventContext, bytes []byte) error
- func IOOnStdout(ctx *EventContext, bytes []byte) error
- func IsBookmark(n *Node) bool
- func IsEAGAIN(err error) bool
- func MergeNodes(dstPtr *[]*Node, src []*Node)
- func PrepareConfig(config interface{}) error
- func ReadConfigBytes(filename string) (string, []byte, error)
- func ReadDefaultConfigBytes(names ...string) (string, []byte, error)
- func Shell() string
- func UserIdRsaIsNotExist() bool
- func WalkInterface(v reflect.Value, walked bool, solver ValueSolver) error
- type CallbackInfo
- type Client
- type CustomTemplate
- type EventContext
- type GithubRepository
- type KeyboardInteractive
- type Node
- type NodeCallbackShell
- type NodeCp
- type NodeExec
- type NonblockReader
- type ReaderFunc
- type Repository
- type Response
- type ResponseType
- type RuntimeSystem
- type TemplateNode
- type ValueSolver
- type VersionMeta
- type WriteCounter
- type WriterFunc
Constants ¶
const ( PostInitClientConfig = "PostInitClientConfig" PostSSHDial = "PostSSHDial" PostNewSession = "PostNewSession" OnStdout = "OnStdout" OnStderr = "OnStderr" PostShell = "PostShell" )
const ( WalkIndexFlag = "$index" WalkOtherFlag = "$other" )
const ( TypeStr = "str" TypeParam = "param" )
const (
ApplicationName = "sshw"
)
const (
KeyAgent = "agent"
)
const (
KeyCallback = "callback"
)
Variables ¶
var (
DefaultCiphers = []string{
"aes128-ctr",
"aes192-ctr",
"aes256-ctr",
"aes128-gcm@openssh.com",
"chacha20-poly1305@openssh.com",
"arcfour256",
"arcfour128",
"arcfour",
"aes128-cbc",
"3des-cbc",
"blowfish-cbc",
"cast128-cbc",
"aes192-cbc",
"aes256-cbc",
}
)
Functions ¶
func AbsPath ¶
AbsPath returns absolute path and match wild path if match multiple path, return first
func AgentPostInitClientConfig ¶ added in v1.8.2
func AgentPostInitClientConfig(ctx *EventContext, clientConfig *ssh.ClientConfig)
func AgentPostNewSession ¶ added in v1.8.2
func AgentPostNewSession(ctx *EventContext, session *ssh.Session) error
func AgentPostSSHDial ¶ added in v1.8.2
func AgentPostSSHDial(ctx *EventContext, client *ssh.Client) error
func AuthPemPostInitClientConfig ¶ added in v1.8.2
func AuthPemPostInitClientConfig(ctx *EventContext, clientConfig *ssh.ClientConfig)
func AuthPwdPostInitClientConfig ¶ added in v1.8.2
func AuthPwdPostInitClientConfig(ctx *EventContext, clientConfig *ssh.ClientConfig)
if set password, auto auth password if set KeyboardInteractions, match question and then auto auth interaction
func CallbackOnStdout ¶ added in v1.8.2
func CallbackOnStdout(ctx *EventContext, line []byte) error
func CallbackPostShell ¶ added in v1.8.2
func CallbackPostShell(ctx *EventContext, stdin io.WriteCloser) error
func FieldsNotEmpty ¶
search not empty field in v if key in ignoreKeys, skip validation
func IOOnStderr ¶ added in v1.8.2
func IOOnStderr(ctx *EventContext, bytes []byte) error
func IOOnStdout ¶ added in v1.8.2
func IOOnStdout(ctx *EventContext, bytes []byte) error
func MergeNodes ¶
merge srcNode to dstNode only compare name and override, otherwise it is complex.
func ReadConfigBytes ¶ added in v1.9.1
func ReadDefaultConfigBytes ¶ added in v1.9.1
func UserIdRsaIsNotExist ¶ added in v1.8.1
func UserIdRsaIsNotExist() bool
func WalkInterface ¶
func WalkInterface(v reflect.Value, walked bool, solver ValueSolver) error
Types ¶
type CallbackInfo ¶ added in v1.8.2
func NewCallbackInfo ¶ added in v1.8.2
func NewCallbackInfo() *CallbackInfo
type Client ¶
type Client interface { // -----local // run pre commands ExecsPre() error CanConnect() bool // terminal makeRaw and store width height InitTerminal() error RecoverTerminal() // run post commands ExecsPost() error WatchWindowChange(windowChange func(ch, cw int) error) // -----local or remote Connect() error Scp() error Shell() error Close() error // -----remote GetClient() *ssh.Client SetClient(client *ssh.Client) // send keepalive to ssh server Ping() error }
type CustomTemplate ¶
type CustomTemplate struct {
Templates []*TemplateNode
}
func ParseSshwTemplate ¶
func ParseSshwTemplate(src string) *CustomTemplate
Read string to Template For example: INPUT: ParseSshwTemplate("Foo${foo:a}bar") OUTPUT: []{{Type: TypeStr, Value: "Foo"}, {Type: TypeParam}, Value: "${foo:a}"}, {Type: TypeStr, Value: "bar"}}
func (*CustomTemplate) Execute ¶
func (c *CustomTemplate) Execute() string
type EventContext ¶ added in v1.8.2
func NewEventContext ¶ added in v1.8.2
func NewEventContext(node *Node) *EventContext
func (*EventContext) Get ¶ added in v1.8.2
func (e *EventContext) Get(key string) (interface{}, bool)
func (*EventContext) Put ¶ added in v1.8.2
func (e *EventContext) Put(key string, value interface{})
type GithubRepository ¶
func (*GithubRepository) Download ¶
func (g *GithubRepository) Download(versionMeta *VersionMeta) (*os.File, error)
Using version and filename to generate a remote url that is used to download file. Download it to file tmp. Then backup original file and replace it with Downloaded file.
func (*GithubRepository) LatestVersion ¶
func (g *GithubRepository) LatestVersion() (*VersionMeta, error)
type KeyboardInteractive ¶
type KeyboardInteractive struct { Question string Answer string GoogleAuth bool `yaml:"google-auth"` }
when it have KeyboardInteractive sshw will answer question if question contains content that we set. if AnswerAll is true, it will don't match question
type Node ¶
type Node struct { Name string `yaml:"name"` Alias string `yaml:"alias,omitempty"` ExecsPre []*NodeExec `yaml:"execs-pre,omitempty"` ExecsStop []*NodeExec `yaml:"execs-stop,omitempty"` Host string `yaml:"host,omitempty"` User string `yaml:"user,omitempty"` Port int `yaml:"port,omitempty"` KeyPath string `yaml:"keypath,omitempty"` Passphrase string `yaml:"passphrase,omitempty"` Password string `yaml:"password,omitempty"` CallbackShells []*NodeCallbackShell `yaml:"callback-shells,omitempty"` Scps []*NodeCp `yaml:"scps"` Children []*Node `yaml:"children,omitempty"` Jump []*Node `yaml:"jump,omitempty"` MergeIgnore bool `yaml:"merge-ignore,omitempty"` KeyboardInteractions []KeyboardInteractive `yaml:"keyboard-interactions"` ControlMaster *bool `yaml:"control-master"` Stdin io.ReadCloser `yaml:"-"` Stdout io.Writer `yaml:"-"` Stderr io.Writer `yaml:"-"` Width int `yaml:"-"` Height int `yaml:"-"` State *terminal.State `yaml:"-"` Session *ssh.Session `yaml:"-"` }
func LoadConfig ¶ added in v1.8.2
func LoadSshConfig ¶
type NodeCallbackShell ¶
type NonblockReader ¶ added in v1.9.3
func NewNonblockReader ¶ added in v1.9.3
func NewNonblockReader(r *os.File) (*NonblockReader, error)
func (*NonblockReader) Close ¶ added in v1.9.3
func (n2 *NonblockReader) Close() error
type ReaderFunc ¶ added in v1.9.3
type Repository ¶
type Repository interface { // get remote version LatestVersion() (*VersionMeta, error) // download remote file to specified path Download(versionMeta *VersionMeta) (*os.File, error) }
type Response ¶
type Response struct { Type ResponseType Message string }
There are tree types of responses that the remote can send back: ok, warning and error
The difference between warning and error is that the connection is not closed by the remote, however, a warning can indicate a file transfer failure (such as invalid destination directory) and such be handled as such.
All responses except for the `Ok` type always have a message (although these can be empty)
The remote sends a confirmation after every SCP command, because a failure can occur after every command, the response should be read and checked after sending them.
func ParseResponse ¶
Reads from the given reader (assuming it is the output of the remote) and parses it into a Response structure
func (*Response) GetMessage ¶
Returns the message the remote sent back
type ResponseType ¶
type ResponseType = uint8
const ( Ok ResponseType = 0 Warning ResponseType = 1 Error ResponseType = 2 )
type RuntimeSystem ¶
type TemplateNode ¶
func NewParamNode ¶
func NewParamNode(v string) *TemplateNode
func NewStrNode ¶
func NewStrNode(v string) *TemplateNode
type ValueSolver ¶
type ValueSolver func(k string, t reflect.Type, v reflect.Value, structField *reflect.StructField) (skipSearch bool)
if t.kind() in array or slice, name is $index return true, if would skip deepSearching type like slice or array or map
type VersionMeta ¶
type WriteCounter ¶
WriteCounter counts the number of bytes written to it. It implements to the io.Writer interface and we can pass this into io.TeeReader() which will report progress on each write cycle.
func NewWriteCounter ¶
func NewWriteCounter() *WriteCounter
func (WriteCounter) PrintProgress ¶
func (wc WriteCounter) PrintProgress()