vendor
github.com
Microsoft
ProtonMail
go-crypto
openpgp
packet
aead_config.go aead_crypter.go aead_encrypted.go compressed.go config.go config_v5.go encrypted_key.go literal.go marker.go notation.go ocfb.go one_pass_signature.go opaque.go packet.go packet_sequence.go packet_unsupported.go padding.go private_key.go private_key_test_data.go public_key.go public_key_test_data.go reader.go recipient.go signature.go symmetric_key_encrypted.go symmetrically_encrypted.go symmetrically_encrypted_aead.go symmetrically_encrypted_mdc.go userattribute.go userid.goalecthomas
chroma
v2
lexers
embedded
abap.xml abnf.xml actionscript.xml actionscript_3.xml ada.xml agda.xml al.xml alloy.xml ampl.xml angular2.xml antlr.xml apacheconf.xml apl.xml applescript.xml arangodb_aql.xml arduino.xml armasm.xml atl.xml autohotkey.xml autoit.xml awk.xml ballerina.xml bash.xml bash_session.xml batchfile.xml beef.xml bibtex.xml bicep.xml blitzbasic.xml bnf.xml bqn.xml brainfuck.xml c#.xml c++.xml c.xml c3.xml cap_n_proto.xml cassandra_cql.xml ceylon.xml cfengine3.xml cfstatement.xml chaiscript.xml chapel.xml cheetah.xml clojure.xml cmake.xml cobol.xml coffeescript.xml common_lisp.xml coq.xml core.xml crystal.xml css.xml csv.xml cue.xml cython.xml d.xml dart.xml dax.xml desktop_entry.xml devicetree.xml diff.xml django_jinja.xml dns.xml docker.xml dtd.xml dylan.xml ebnf.xml elixir.xml elm.xml emacslisp.xml erb.xml erlang.xml factor.xml fennel.xml fish.xml forth.xml fortran.xml fortranfixed.xml fsharp.xml gas.xml gdscript.xml gdscript3.xml gettext.xml gherkin.xml gleam.xml glsl.xml gnuplot.xml go_template.xml graphql.xml groff.xml groovy.xml handlebars.xml hare.xml haskell.xml hcl.xml hexdump.xml hlb.xml hlsl.xml holyc.xml html.xml hy.xml idris.xml igor.xml ini.xml io.xml iscdhcpd.xml j.xml janet.xml java.xml javascript.xml json.xml jsonata.xml jsonnet.xml julia.xml jungle.xml kakoune.xml kdl.xml kotlin.xml lateralus.xml lean.xml lighttpd_configuration_file.xml llvm.xml lox.xml lua.xml luau.xml makefile.xml mako.xml mason.xml materialize_sql_dialect.xml mathematica.xml matlab.xml mcfunction.xml meson.xml metal.xml microcad.xml minizinc.xml mlir.xml modelica.xml modula-2.xml mojo.xml monkeyc.xml moonbit.xml moonscript.xml morrowindscript.xml myghty.xml mysql.xml nasm.xml natural.xml ndisasm.xml newspeak.xml nginx_configuration_file.xml nim.xml nix.xml nsis.xml nu.xml objective-c.xml objectpascal.xml ocaml.xml octave.xml odin.xml onesenterprise.xml openedge_abl.xml openscad.xml org_mode.xml pacmanconf.xml perl.xml php.xml pig.xml pkgconfig.xml pl_pgsql.xml plaintext.xml plutus_core.xml pony.xml postgresql_sql_dialect.xml postscript.xml povray.xml powerquery.xml powershell.xml prolog.xml promela.xml promql.xml properties.xml protocol_buffer.xml prql.xml psl.xml puppet.xml python.xml python_2.xml qbasic.xml qml.xml r.xml racket.xml ragel.xml react.xml reasonml.xml reg.xml rego.xml rexx.xml rgbasm.xml ring.xml rpgle.xml rpm_spec.xml ruby.xml rust.xml sas.xml sass.xml scala.xml scdoc.xml scheme.xml scilab.xml scss.xml sed.xml sieve.xml smali.xml smalltalk.xml smarty.xml snbt.xml snobol.xml solidity.xml sourcepawn.xml spade.xml sparql.xml sql.xml squidconf.xml standard_ml.xml stas.xml stylus.xml swift.xml systemd.xml systemverilog.xml tablegen.xml tal.xml tasm.xml tcl.xml tcsh.xml termcap.xml terminfo.xml terraform.xml tex.xml thrift.xml toml.xml tradingview.xml transact-sql.xml turing.xml turtle.xml twig.xml txtpb.xml typescript.xml typoscript.xml typoscriptcssdata.xml typoscripthtmldata.xml typst.xml ucode.xml v.xml v_shell.xml vala.xml vb_net.xml verilog.xml vhdl.xml vhs.xml viml.xml vue.xml wat.xml wdte.xml webgpu_shading_language.xml webvtt.xml whiley.xml xml.xml xorg.xml yaml.xml yang.xml z80_assembly.xml zed.xml zig.xmlstyles
abap.xml algol.xml algol_nu.xml api.go arduino.xml ashen.xml aura-theme-dark-soft.xml aura-theme-dark.xml autumn.xml average.xml base16-snazzy.xml borland.xml bw.xml catppuccin-frappe.xml catppuccin-latte.xml catppuccin-macchiato.xml catppuccin-mocha.xml colorful.xml compat.go darcula.xml doom-one.xml doom-one2.xml dracula.xml emacs.xml evergarden.xml friendly.xml fruity.xml github-dark.xml github.xml gruvbox-light.xml gruvbox.xml hr_high_contrast.xml hrdark.xml igor.xml kanagawa-dragon.xml kanagawa-lotus.xml kanagawa-wave.xml lovelace.xml manni.xml modus-operandi.xml modus-vivendi.xml monokai.xml monokailight.xml murphy.xml native.xml nord.xml nordic.xml onedark.xml onesenterprise.xml paraiso-dark.xml paraiso-light.xml pastie.xml perldoc.xml pygments.xml rainbow_dash.xml rose-pine-dawn.xml rose-pine-moon.xml rose-pine.xml rpgle.xml rrt.xml solarized-dark.xml solarized-dark256.xml solarized-light.xml swapoff.xml tango.xml tokyonight-day.xml tokyonight-moon.xml tokyonight-night.xml tokyonight-storm.xml trac.xml vim.xml vs.xml vulcan.xml witchhazel.xml xcode-dark.xml xcode.xmlcloudflare
go-enry
go-enry
v2
data
alias.go colors.go commit.go content.go doc.go documentation.go extension.go filename.go frequencies.go generated.go groups.go heuristics.go id.go interpreter.go languageInfo.go mimeType.go test.go type.go vendor.gogo-git
go-git
v5
plumbing
format
object
blob.go change.go change_adaptor.go commit.go commit_scanner.go commit_walker.go commit_walker_bfs.go commit_walker_bfs_filtered.go commit_walker_ctime.go commit_walker_limit.go commit_walker_path.go difftree.go file.go merge_base.go object.go patch.go rename.go signature.go tag.go tag_scanner.go tree.go treenoder.goprotocol
storage
filesystem
dotgit
dotgit.go dotgit_rewrite_packed_refs.go dotgit_setref.go reader.go repository_filesystem.go writers.go writers_unix.go writers_windows.goklauspost
cpuid
v2
.gitignore .goreleaser.yml CONTRIBUTING.txt LICENSE README.md cpuid.go cpuid_386.s cpuid_amd64.s cpuid_arm64.s detect_arm64.go detect_ref.go detect_x86.go featureid_string.go os_darwin_arm64.go os_linux_arm64.go os_other_arm64.go os_safe_linux_arm64.go os_unsafe_linux_arm64.go test-architectures.shyuin
goldmark
extension
cjk.go definition_list.go footnote.go gfm.go linkify.go package.go strikethrough.go table.go tasklist.go typographer.goparser
attribute.go atx_heading.go auto_link.go blockquote.go code_block.go code_span.go delimiter.go emphasis.go fcode_block.go html_block.go link.go link_ref.go list.go list_item.go paragraph.go parser.go raw_html.go setext_headings.go thematic_break.goutil
html5entities.gen.go html5entities.go unicode_case_folding.gen.go unicode_case_folding.go util.go util_cjk.go util_safe.go util_unsafe_go120.go util_unsafe_go121.gogolang.org
x
crypto
blake2b
blake2b.go blake2bAVX2_amd64.go blake2bAVX2_amd64.s blake2b_amd64.s blake2b_generic.go blake2b_ref.go blake2x.go go125.go register.gochacha20
chacha_arm64.go chacha_arm64.s chacha_generic.go chacha_noasm.go chacha_ppc64x.go chacha_ppc64x.s chacha_s390x.go chacha_s390x.s xor.gossh
buffer.go certs.go channel.go cipher.go client.go client_auth.go common.go connection.go doc.go handshake.go kex.go keys.go mac.go messages.go mlkem.go mux.go server.go session.go ssh_gss.go streamlocal.go tcpip.go transport.gosys
cpu
asm_aix_ppc64.s asm_darwin_arm64_gc.s asm_darwin_x86_gc.s byteorder.go cpu.go cpu_aix.go cpu_arm.go cpu_arm64.go cpu_arm64.s cpu_darwin_arm64.go cpu_darwin_arm64_other.go cpu_darwin_x86.go cpu_gc_arm64.go cpu_gc_s390x.go cpu_gc_x86.go cpu_gc_x86.s cpu_gccgo_arm64.go cpu_gccgo_s390x.go cpu_gccgo_x86.c cpu_gccgo_x86.go cpu_linux.go cpu_linux_arm.go cpu_linux_arm64.go cpu_linux_loong64.go cpu_linux_mips64x.go cpu_linux_noinit.go cpu_linux_ppc64x.go cpu_linux_riscv64.go cpu_linux_s390x.go cpu_loong64.go cpu_loong64.s cpu_mips64x.go cpu_mipsx.go cpu_netbsd_arm64.go cpu_openbsd_arm64.go cpu_openbsd_arm64.s cpu_other_arm.go cpu_other_arm64.go cpu_other_mips64x.go cpu_other_ppc64x.go cpu_other_riscv64.go cpu_other_x86.go cpu_ppc64x.go cpu_riscv64.go cpu_s390x.go cpu_s390x.s cpu_wasm.go cpu_x86.go cpu_zos.go cpu_zos_s390x.go endian_big.go endian_little.go hwcap_linux.go parse.go proc_cpuinfo_linux.go runtime_auxv.go runtime_auxv_go121.go syscall_aix_gccgo.go syscall_aix_ppc64_gc.go syscall_darwin_arm64_gc.go syscall_darwin_x86_gc.gounix
.gitignore README.md affinity_linux.go aliases.go asm_aix_ppc64.s asm_bsd_386.s asm_bsd_amd64.s asm_bsd_arm.s asm_bsd_arm64.s asm_bsd_ppc64.s asm_bsd_riscv64.s asm_linux_386.s asm_linux_amd64.s asm_linux_arm.s asm_linux_arm64.s asm_linux_loong64.s asm_linux_mips64x.s asm_linux_mipsx.s asm_linux_ppc64x.s asm_linux_riscv64.s asm_linux_s390x.s asm_openbsd_mips64.s asm_solaris_amd64.s asm_zos_s390x.s auxv.go auxv_unsupported.go bluetooth_linux.go bpxsvc_zos.go bpxsvc_zos.s cap_freebsd.go constants.go dev_aix_ppc.go dev_aix_ppc64.go dev_darwin.go dev_dragonfly.go dev_freebsd.go dev_linux.go dev_netbsd.go dev_openbsd.go dev_zos.go dirent.go endian_big.go endian_little.go env_unix.go fcntl.go fcntl_darwin.go fcntl_linux_32bit.go fdset.go gccgo.go gccgo_c.c gccgo_linux_amd64.go ifreq_linux.go ioctl_linux.go ioctl_signed.go ioctl_unsigned.go ioctl_zos.go mkall.sh mkerrors.sh mmap_nomremap.go mremap.go pagesize_unix.go pledge_openbsd.go ptrace_darwin.go ptrace_ios.go race.go race0.go readdirent_getdents.go readdirent_getdirentries.go sockcmsg_dragonfly.go sockcmsg_linux.go sockcmsg_unix.go sockcmsg_unix_other.go sockcmsg_zos.go symaddr_zos_s390x.s syscall.go syscall_aix.go syscall_aix_ppc.go syscall_aix_ppc64.go syscall_bsd.go syscall_darwin.go syscall_darwin_amd64.go syscall_darwin_arm64.go syscall_darwin_libSystem.go syscall_dragonfly.go syscall_dragonfly_amd64.go syscall_freebsd.go syscall_freebsd_386.go syscall_freebsd_amd64.go syscall_freebsd_arm.go syscall_freebsd_arm64.go syscall_freebsd_riscv64.go syscall_hurd.go syscall_hurd_386.go syscall_illumos.go syscall_linux.go syscall_linux_386.go syscall_linux_alarm.go syscall_linux_amd64.go syscall_linux_amd64_gc.go syscall_linux_arm.go syscall_linux_arm64.go syscall_linux_gc.go syscall_linux_gc_386.go syscall_linux_gc_arm.go syscall_linux_gccgo_386.go syscall_linux_gccgo_arm.go syscall_linux_loong64.go syscall_linux_mips64x.go syscall_linux_mipsx.go syscall_linux_ppc.go syscall_linux_ppc64x.go syscall_linux_riscv64.go syscall_linux_s390x.go syscall_linux_sparc64.go syscall_netbsd.go syscall_netbsd_386.go syscall_netbsd_amd64.go syscall_netbsd_arm.go syscall_netbsd_arm64.go syscall_openbsd.go syscall_openbsd_386.go syscall_openbsd_amd64.go syscall_openbsd_arm.go syscall_openbsd_arm64.go syscall_openbsd_libc.go syscall_openbsd_mips64.go syscall_openbsd_ppc64.go syscall_openbsd_riscv64.go syscall_solaris.go syscall_solaris_amd64.go syscall_unix.go syscall_unix_gc.go syscall_unix_gc_ppc64x.go syscall_zos_s390x.go sysvshm_linux.go sysvshm_unix.go sysvshm_unix_other.go timestruct.go unveil_openbsd.go vgetrandom_linux.go vgetrandom_unsupported.go xattr_bsd.go zerrors_aix_ppc.go zerrors_aix_ppc64.go zerrors_darwin_amd64.go zerrors_darwin_arm64.go zerrors_dragonfly_amd64.go zerrors_freebsd_386.go zerrors_freebsd_amd64.go zerrors_freebsd_arm.go zerrors_freebsd_arm64.go zerrors_freebsd_riscv64.go zerrors_linux.go zerrors_linux_386.go zerrors_linux_amd64.go zerrors_linux_arm.go zerrors_linux_arm64.go zerrors_linux_loong64.go zerrors_linux_mips.go zerrors_linux_mips64.go zerrors_linux_mips64le.go zerrors_linux_mipsle.go zerrors_linux_ppc.go zerrors_linux_ppc64.go zerrors_linux_ppc64le.go zerrors_linux_riscv64.go zerrors_linux_s390x.go zerrors_linux_sparc64.go zerrors_netbsd_386.go zerrors_netbsd_amd64.go zerrors_netbsd_arm.go zerrors_netbsd_arm64.go zerrors_openbsd_386.go zerrors_openbsd_amd64.go zerrors_openbsd_arm.go zerrors_openbsd_arm64.go zerrors_openbsd_mips64.go zerrors_openbsd_ppc64.go zerrors_openbsd_riscv64.go zerrors_solaris_amd64.go zerrors_zos_s390x.go zptrace_armnn_linux.go zptrace_linux_arm64.go zptrace_mipsnn_linux.go zptrace_mipsnnle_linux.go zptrace_x86_linux.go zsymaddr_zos_s390x.s zsyscall_aix_ppc.go zsyscall_aix_ppc64.go zsyscall_aix_ppc64_gc.go zsyscall_aix_ppc64_gccgo.go zsyscall_darwin_amd64.go zsyscall_darwin_amd64.s zsyscall_darwin_arm64.go zsyscall_darwin_arm64.s zsyscall_dragonfly_amd64.go zsyscall_freebsd_386.go zsyscall_freebsd_amd64.go zsyscall_freebsd_arm.go zsyscall_freebsd_arm64.go zsyscall_freebsd_riscv64.go zsyscall_illumos_amd64.go zsyscall_linux.go zsyscall_linux_386.go zsyscall_linux_amd64.go zsyscall_linux_arm.go zsyscall_linux_arm64.go zsyscall_linux_loong64.go zsyscall_linux_mips.go zsyscall_linux_mips64.go zsyscall_linux_mips64le.go zsyscall_linux_mipsle.go zsyscall_linux_ppc.go zsyscall_linux_ppc64.go zsyscall_linux_ppc64le.go zsyscall_linux_riscv64.go zsyscall_linux_s390x.go zsyscall_linux_sparc64.go zsyscall_netbsd_386.go zsyscall_netbsd_amd64.go zsyscall_netbsd_arm.go zsyscall_netbsd_arm64.go zsyscall_openbsd_386.go zsyscall_openbsd_386.s zsyscall_openbsd_amd64.go zsyscall_openbsd_amd64.s zsyscall_openbsd_arm.go zsyscall_openbsd_arm.s zsyscall_openbsd_arm64.go zsyscall_openbsd_arm64.s zsyscall_openbsd_mips64.go zsyscall_openbsd_mips64.s zsyscall_openbsd_ppc64.go zsyscall_openbsd_ppc64.s zsyscall_openbsd_riscv64.go zsyscall_openbsd_riscv64.s zsyscall_solaris_amd64.go zsyscall_zos_s390x.go zsysctl_openbsd_386.go zsysctl_openbsd_amd64.go zsysctl_openbsd_arm.go zsysctl_openbsd_arm64.go zsysctl_openbsd_mips64.go zsysctl_openbsd_ppc64.go zsysctl_openbsd_riscv64.go zsysnum_darwin_amd64.go zsysnum_darwin_arm64.go zsysnum_dragonfly_amd64.go zsysnum_freebsd_386.go zsysnum_freebsd_amd64.go zsysnum_freebsd_arm.go zsysnum_freebsd_arm64.go zsysnum_freebsd_riscv64.go zsysnum_linux_386.go zsysnum_linux_amd64.go zsysnum_linux_arm.go zsysnum_linux_arm64.go zsysnum_linux_loong64.go zsysnum_linux_mips.go zsysnum_linux_mips64.go zsysnum_linux_mips64le.go zsysnum_linux_mipsle.go zsysnum_linux_ppc.go zsysnum_linux_ppc64.go zsysnum_linux_ppc64le.go zsysnum_linux_riscv64.go zsysnum_linux_s390x.go zsysnum_linux_sparc64.go zsysnum_netbsd_386.go zsysnum_netbsd_amd64.go zsysnum_netbsd_arm.go zsysnum_netbsd_arm64.go zsysnum_openbsd_386.go zsysnum_openbsd_amd64.go zsysnum_openbsd_arm.go zsysnum_openbsd_arm64.go zsysnum_openbsd_mips64.go zsysnum_openbsd_ppc64.go zsysnum_openbsd_riscv64.go zsysnum_zos_s390x.go ztypes_aix_ppc.go ztypes_aix_ppc64.go ztypes_darwin_amd64.go ztypes_darwin_arm64.go ztypes_dragonfly_amd64.go ztypes_freebsd_386.go ztypes_freebsd_amd64.go ztypes_freebsd_arm.go ztypes_freebsd_arm64.go ztypes_freebsd_riscv64.go ztypes_linux.go ztypes_linux_386.go ztypes_linux_amd64.go ztypes_linux_arm.go ztypes_linux_arm64.go ztypes_linux_loong64.go ztypes_linux_mips.go ztypes_linux_mips64.go ztypes_linux_mips64le.go ztypes_linux_mipsle.go ztypes_linux_ppc.go ztypes_linux_ppc64.go ztypes_linux_ppc64le.go ztypes_linux_riscv64.go ztypes_linux_s390x.go ztypes_linux_sparc64.go ztypes_netbsd_386.go ztypes_netbsd_amd64.go ztypes_netbsd_arm.go ztypes_netbsd_arm64.go ztypes_openbsd_386.go ztypes_openbsd_amd64.go ztypes_openbsd_arm.go ztypes_openbsd_arm64.go ztypes_openbsd_mips64.go ztypes_openbsd_ppc64.go ztypes_openbsd_riscv64.go ztypes_solaris_amd64.go ztypes_zos_s390x.gowindows
aliases.go dll_windows.go env_windows.go eventlog.go exec_windows.go memory_windows.go mkerrors.bash mkknownfolderids.bash mksyscall.go race.go race0.go security_windows.go service.go setupapi_windows.go str.go syscall.go syscall_windows.go types_windows.go types_windows_386.go types_windows_amd64.go types_windows_arm.go types_windows_arm64.go zerrors_windows.go zknownfolderids_windows.go zsyscall_windows.goviews
blob.html commit.html files.html footer.html license.html markers.html nav-main.html nav-repository.html readme.html repositories.html repository.html tree.html
vendor/github.com/go-git/go-git/v5/plumbing/transport/ssh/common.go
raw
1// Package ssh implements the SSH transport protocol.
2package ssh
3
4import (
5 "context"
6 "fmt"
7 "net"
8 "reflect"
9 "strconv"
10 "strings"
11
12 "github.com/go-git/go-git/v5/plumbing/transport"
13 "github.com/go-git/go-git/v5/plumbing/transport/internal/common"
14
15 "github.com/kevinburke/ssh_config"
16 "golang.org/x/crypto/ssh"
17 "golang.org/x/net/proxy"
18)
19
20// DefaultClient is the default SSH client.
21var DefaultClient = NewClient(nil)
22
23// DefaultSSHConfig is the reader used to access parameters stored in the
24// system's ssh_config files. If nil all the ssh_config are ignored.
25var DefaultSSHConfig sshConfig = ssh_config.DefaultUserSettings
26
27type sshConfig interface {
28 Get(alias, key string) string
29}
30
31// NewClient creates a new SSH client with an optional *ssh.ClientConfig.
32func NewClient(config *ssh.ClientConfig) transport.Transport {
33 return common.NewClient(&runner{config: config})
34}
35
36// DefaultAuthBuilder is the function used to create a default AuthMethod, when
37// the user doesn't provide any.
38var DefaultAuthBuilder = func(user string) (AuthMethod, error) {
39 return NewSSHAgentAuth(user)
40}
41
42const DefaultPort = 22
43
44type runner struct {
45 config *ssh.ClientConfig
46}
47
48func (r *runner) Command(cmd string, ep *transport.Endpoint, auth transport.AuthMethod) (common.Command, error) {
49 c := &command{command: cmd, endpoint: ep, config: r.config}
50 if auth != nil {
51 if err := c.setAuth(auth); err != nil {
52 return nil, err
53 }
54 }
55
56 if err := c.connect(); err != nil {
57 return nil, err
58 }
59 return c, nil
60}
61
62type command struct {
63 *ssh.Session
64 connected bool
65 command string
66 endpoint *transport.Endpoint
67 client *ssh.Client
68 auth AuthMethod
69 config *ssh.ClientConfig
70}
71
72func (c *command) setAuth(auth transport.AuthMethod) error {
73 a, ok := auth.(AuthMethod)
74 if !ok {
75 return transport.ErrInvalidAuthMethod
76 }
77
78 c.auth = a
79 return nil
80}
81
82func (c *command) Start() error {
83 return c.Session.Start(endpointToCommand(c.command, c.endpoint))
84}
85
86// Close closes the SSH session and connection.
87func (c *command) Close() error {
88 if !c.connected {
89 return nil
90 }
91
92 c.connected = false
93
94 //XXX: If did read the full packfile, then the session might be already
95 // closed.
96 _ = c.Session.Close()
97 err := c.client.Close()
98
99 //XXX: in go1.16+ we can use errors.Is(err, net.ErrClosed)
100 if err != nil && strings.HasSuffix(err.Error(), "use of closed network connection") {
101 return nil
102 }
103
104 return err
105}
106
107// connect connects to the SSH server, unless a AuthMethod was set with
108// SetAuth method, by default uses an auth method based on PublicKeysCallback,
109// it connects to a SSH agent, using the address stored in the SSH_AUTH_SOCK
110// environment var.
111func (c *command) connect() error {
112 if c.connected {
113 return transport.ErrAlreadyConnected
114 }
115
116 if c.auth == nil {
117 if err := c.setAuthFromEndpoint(); err != nil {
118 return err
119 }
120 }
121
122 var err error
123 config, err := c.auth.ClientConfig()
124 if err != nil {
125 return err
126 }
127 hostWithPort := c.getHostWithPort()
128 if config.HostKeyCallback == nil {
129 db, err := NewKnownHostsDb()
130 if err != nil {
131 return err
132 }
133 config.HostKeyCallback = db.HostKeyCallback()
134 config.HostKeyAlgorithms = db.HostKeyAlgorithms(hostWithPort)
135 } else {
136 // If the user gave a custom HostKeyCallback, we do not try to detect host key algorithms
137 // based on knownhosts functionality, as the user may be requesting a FixedKey or using a
138 // different key approval strategy. In that case, the user is responsible for populating
139 // HostKeyAlgorithms appropriately
140 }
141
142 overrideConfig(c.config, config)
143
144 c.client, err = dial("tcp", hostWithPort, c.endpoint.Proxy, config)
145 if err != nil {
146 return err
147 }
148
149 c.Session, err = c.client.NewSession()
150 if err != nil {
151 _ = c.client.Close()
152 return err
153 }
154
155 c.connected = true
156 return nil
157}
158
159func dial(network, addr string, proxyOpts transport.ProxyOptions, config *ssh.ClientConfig) (*ssh.Client, error) {
160 var (
161 ctx = context.Background()
162 cancel context.CancelFunc
163 )
164 if config.Timeout > 0 {
165 ctx, cancel = context.WithTimeout(ctx, config.Timeout)
166 } else {
167 ctx, cancel = context.WithCancel(ctx)
168 }
169 defer cancel()
170
171 var conn net.Conn
172 var dialErr error
173
174 if proxyOpts.URL != "" {
175 proxyUrl, err := proxyOpts.FullURL()
176 if err != nil {
177 return nil, err
178 }
179 dialer, err := proxy.FromURL(proxyUrl, proxy.Direct)
180 if err != nil {
181 return nil, err
182 }
183
184 // Try to use a ContextDialer, but fall back to a Dialer if that goes south.
185 ctxDialer, ok := dialer.(proxy.ContextDialer)
186 if !ok {
187 return nil, fmt.Errorf("expected ssh proxy dialer to be of type %s; got %s",
188 reflect.TypeOf(ctxDialer), reflect.TypeOf(dialer))
189 }
190 conn, dialErr = ctxDialer.DialContext(ctx, "tcp", addr)
191 } else {
192 conn, dialErr = proxy.Dial(ctx, network, addr)
193 }
194 if dialErr != nil {
195 return nil, dialErr
196 }
197
198 c, chans, reqs, err := ssh.NewClientConn(conn, addr, config)
199 if err != nil {
200 return nil, err
201 }
202 return ssh.NewClient(c, chans, reqs), nil
203}
204
205func (c *command) getHostWithPort() string {
206 if addr, found := c.doGetHostWithPortFromSSHConfig(); found {
207 return addr
208 }
209
210 host := c.endpoint.Host
211 port := c.endpoint.Port
212 if port <= 0 {
213 port = DefaultPort
214 }
215
216 return net.JoinHostPort(host, strconv.Itoa(port))
217}
218
219func (c *command) doGetHostWithPortFromSSHConfig() (addr string, found bool) {
220 if DefaultSSHConfig == nil {
221 return
222 }
223
224 host := c.endpoint.Host
225 port := c.endpoint.Port
226
227 configHost := DefaultSSHConfig.Get(c.endpoint.Host, "Hostname")
228 if configHost != "" {
229 host = configHost
230 found = true
231 }
232
233 if !found {
234 return
235 }
236
237 configPort := DefaultSSHConfig.Get(c.endpoint.Host, "Port")
238 if configPort != "" {
239 if i, err := strconv.Atoi(configPort); err == nil {
240 port = i
241 }
242 }
243
244 addr = net.JoinHostPort(host, strconv.Itoa(port))
245 return
246}
247
248func (c *command) setAuthFromEndpoint() error {
249 var err error
250 c.auth, err = DefaultAuthBuilder(c.endpoint.User)
251 return err
252}
253
254func endpointToCommand(cmd string, ep *transport.Endpoint) string {
255 return fmt.Sprintf("%s '%s'", cmd, ep.Path)
256}
257
258func overrideConfig(overrides *ssh.ClientConfig, c *ssh.ClientConfig) {
259 if overrides == nil {
260 return
261 }
262
263 t := reflect.TypeOf(*c)
264 vc := reflect.ValueOf(c).Elem()
265 vo := reflect.ValueOf(overrides).Elem()
266
267 for i := 0; i < t.NumField(); i++ {
268 f := t.Field(i)
269 vcf := vc.FieldByName(f.Name)
270 vof := vo.FieldByName(f.Name)
271 vcf.Set(vof)
272 }
273
274 *c = vc.Interface().(ssh.ClientConfig)
275}