Não faço muitas perguntas no Stack Overflow, mas esta é uma daquelas vezes em que estou terrivelmente preso.
TLDR: Preciso saber como channel.Close()
funciona golang.org/x/crypto/ssh
e onde devo chamá-lo (supondo que seja isso que eu preciso).
Estou escrevendo um programa 'pequeno' para sincronizar automaticamente meus repositórios Git, incluindo stash, arquivos extras, etc. Eu uso go-ssh para lidar com a parte mais importante no servidor. O estado atual do projeto pode ser encontrado no GitHub
Tentei reduzir para um exemplo simples. Esta é uma das poucas coisas que ajustei do exemplo oficial no repositório Golang . Eu me livrei das terminal
referências e fiz com que ele manipulasse explicitamente um comando (aleatório):
go func(in <-chan *ssh.Request) {
for req := range in {
switch req.Type {
case "exec":
channel.Stderr().Write([]byte("Request received!\n"))
req.Reply(true, nil)
// Do some more work here
channel.Close() // ???
default:
req.Reply(false, nil)
}
}
wg.Done()
}(requests)
O Gist está aqui . Há também outro exemplo de outra pessoa aqui .
Sempre que tento conectar algo como ssh localhost -T -vvvv -p 2022 git-receive-pack foo
o exemplo, recebo o seguinte:
Authenticated to localhost ([::1]:2022) using "publickey".
debug1: channel 0: new session [client-session] (inactive timeout: 0)
debug3: ssh_session2_open: channel_new: 0
debug2: channel 0: send open
debug3: send packet: type 90
debug1: Entering interactive session.
debug1: pledge: filesystem
debug3: client_repledge: enter
debug3: receive packet: type 91
debug2: channel_input_open_confirmation: channel 0: callback start
debug2: fd 3 setting TCP_NODELAY
debug3: set_sock_tos: set socket 3 IPV6_TCLASS 0x20
debug2: client_session2_setup: id 0
debug1: Sending command: git-receive-pack foo
debug2: channel 0: request exec confirm 1
debug3: send packet: type 98
debug3: client_repledge: enter
debug2: channel_input_open_confirmation: channel 0: callback done
debug2: channel 0: open confirm rwindow 2097152 rmax 32768
debug2: channel 0: rcvd ext data 6
debug3: receive packet: type 99
debug2: channel_input_status_confirm: type 99 id 0
debug2: exec request accepted on channel 0
debug3: receive packet: type 97
debug2: channel 0: rcvd close
debug2: channel 0: output open -> drain
debug2: chan_shutdown_read: channel 0: (i0 o1 sock -1 wfd 4 efd 6 [write])
debug2: channel 0: input open -> closed
debug3: channel 0: will not send data after close
debug2: channel 0: obuf_empty delayed efd 6/(6)
Request received!
debug2: channel 0: written 6 to efd 6
debug3: channel 0: will not send data after close
debug2: channel 0: obuf empty
debug2: chan_shutdown_write: channel 0: (i3 o1 sock -1 wfd 5 efd 6 [write])
debug2: channel 0: output drain -> closed
debug2: channel 0: almost dead
debug2: channel 0: gc: notify user
debug2: channel 0: gc: user detached
debug2: channel 0: send_close2
debug2: channel 0: send close for remote id 0
debug3: send packet: type 97
debug2: channel 0: is dead
debug2: channel 0: garbage collecting
debug1: channel 0: free: client-session, nchannels 1
debug3: channel 0: status: The following connections are open:
#0 client-session (t4 [session] r0 nm0 i3/0 o3/0 e[write]/0 fd -1/-1/6 sock -1 cc -1 nc0 io 0x00/0x00)
debug3: send packet: type 1
Transferred: sent 3624, received 2892 bytes, in 0.0 seconds
Bytes per second: sent 3203530.2, received 2556459.6
debug1: Exit status -1
No meu projeto pessoal, um "cano quebrado" também é incluído.
Alguém sabe como resolver esse problema?