本文整理汇总了Golang中golang.org/x/crypto/ssh.NewChannel类的典型用法代码示例。如果您正苦于以下问题:Golang NewChannel类的具体用法?Golang NewChannel怎么用?Golang NewChannel使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了NewChannel类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。
示例1: logChannel
/* logChannel returns a logger which can be used to log channel activities to a
file in the directory ldir. The logger as well as the filename are
returned. */
func logChannel(
ldir string,
nc ssh.NewChannel,
) (*log.Logger, *os.File, string, error) {
/* Log file is named after the channel time and type */
logName := filepath.Join(
ldir,
time.Now().Format(LOGFORMAT)+"-"+nc.ChannelType(),
)
/* Open the file */
lf, err := os.OpenFile(
logName,
os.O_WRONLY|os.O_APPEND|os.O_CREATE|os.O_EXCL,
0600,
)
if nil != err {
return nil, nil, "", err
}
return log.New(
//lf,
io.MultiWriter(lf, os.Stderr), /* DEBUG */
"",
log.LstdFlags|log.Lmicroseconds,
), lf, logName, nil
}
开发者ID:magisterquis,项目名称:sshhipot,代码行数:28,代码来源:channel.go
示例2: handleSSHChannel
func handleSSHChannel(newChan ssh.NewChannel, session *Session) {
ch, reqs, err := newChan.Accept()
if err != nil {
log.Println("handle channel failed:", err)
return
}
exitCh := make(chan int)
go func() {
status := struct{ Status uint32 }{uint32(<-exitCh)}
_, err = ch.SendRequest("exit-status", false, ssh.Marshal(&status))
assert(err)
ch.Close()
}()
for req := range reqs {
go func(req *ssh.Request) {
if req.WantReply {
req.Reply(true, nil)
}
switch req.Type {
case "exec":
var payload = struct{ Value string }{}
ssh.Unmarshal(req.Payload, &payload)
line := strings.Trim(payload.Value, "\n")
var args []string
if line != "" {
args = strings.Split(line, " ")
}
RunCmd(args, ch, ch, ch.Stderr(), exitCh, session)
}
}(req)
}
}
开发者ID:agriffis,项目名称:envy,代码行数:32,代码来源:socket.go
示例3: handleNewPortForwardChannel
func (sshClient *sshClient) handleNewPortForwardChannel(newChannel ssh.NewChannel) {
defer sshClient.channelHandlerWaitGroup.Done()
// http://tools.ietf.org/html/rfc4254#section-7.2
var directTcpipExtraData struct {
HostToConnect string
PortToConnect uint32
OriginatorIPAddress string
OriginatorPort uint32
}
err := ssh.Unmarshal(newChannel.ExtraData(), &directTcpipExtraData)
if err != nil {
sshClient.rejectNewChannel(newChannel, ssh.Prohibited, "invalid extra data")
return
}
// Intercept TCP port forwards to a specified udpgw server and handle directly.
// TODO: also support UDP explicitly, e.g. with a custom "direct-udp" channel type?
isUDPChannel := sshClient.sshServer.support.Config.UDPInterceptUdpgwServerAddress != "" &&
sshClient.sshServer.support.Config.UDPInterceptUdpgwServerAddress ==
fmt.Sprintf("%s:%d",
directTcpipExtraData.HostToConnect,
directTcpipExtraData.PortToConnect)
if isUDPChannel {
sshClient.handleUDPChannel(newChannel)
} else {
sshClient.handleTCPChannel(
directTcpipExtraData.HostToConnect, int(directTcpipExtraData.PortToConnect), newChannel)
}
}
开发者ID:code-mx,项目名称:psiphon-tunnel-core,代码行数:32,代码来源:tunnelServer.go
示例4: HandleNewChannel
func (handler *SessionChannelHandler) HandleNewChannel(logger lager.Logger, newChannel ssh.NewChannel) {
err := newChannel.Reject(ssh.Prohibited, "SSH is not supported on windows cells")
if err != nil {
logger.Error("handle-new-session-channel-failed", err)
}
return
}
开发者ID:benjaminharnett,项目名称:diego-ssh,代码行数:8,代码来源:session_channel_handler_windows.go
示例5: HandleNewChannel
func (handler *SessionChannelHandler) HandleNewChannel(logger lager.Logger, newChannel ssh.NewChannel) {
channel, requests, err := newChannel.Accept()
if err != nil {
logger.Error("handle-new-session-channel-failed", err)
return
}
handler.newSession(logger, channel, handler.keepalive).serviceRequests(requests)
}
开发者ID:benjaminharnett,项目名称:diego-ssh,代码行数:9,代码来源:session_channel_handler.go
示例6: handleChannel
func (s *Server) handleChannel(ch ssh.NewChannel) {
id := rand.Int()
s.Debug("Handling Channel", "id", id, "chan", ch.ChannelType())
if ch.ChannelType() != "session" {
s.Info("Received unknown channel type", "chan", ch.ChannelType())
ch.Reject(ssh.UnknownChannelType, "unknown channel type")
return
}
channel, requests, err := ch.Accept()
if err != nil {
s.Error("Failed to accept channe", "err", err)
return
}
var closer sync.Once
closeChannel := func() {
s.Debug("Closed Channel", "id", id)
channel.Close()
}
defer closer.Do(closeChannel)
for req := range requests {
spew.Dump(req.Type)
switch req.Type {
case "exec":
// Let it through
case "env":
if req.WantReply {
if err = req.Reply(true, nil); err != nil {
s.Error("Failed to ignore env command", "err", err)
}
}
continue
default:
s.Info("Received unhandled request type", "type", req.Type)
continue
}
r := &scpRequest{db: s.DB}
processors := []processor{
r.ParseSCPRequest, r.DownloadFile, r.EndConnectionGracefully,
}
for _, proc := range processors {
if err := proc(channel, req); err != nil {
fmt.Fprintln(channel, "failed to process request:", err.Error())
// log.Printf("%+v", err)
break
}
}
closer.Do(closeChannel)
}
}
开发者ID:zqzca,项目名称:back,代码行数:57,代码来源:scp.go
示例7: rejectNewChannel
func (sshClient *sshClient) rejectNewChannel(newChannel ssh.NewChannel, reason ssh.RejectionReason, message string) {
// TODO: log more details?
log.WithContextFields(
LogFields{
"channelType": newChannel.ChannelType(),
"rejectMessage": message,
"rejectReason": reason,
}).Warning("reject new channel")
newChannel.Reject(reason, message)
}
开发者ID:yangguangyu,项目名称:psiphon-tunnel-core,代码行数:10,代码来源:sshService.go
示例8: handleChannel
func handleChannel(newChannel ssh.NewChannel, sh SessionHandler) {
// At this point, we have the opportunity to reject the client's
// request for another logical connection
channel, requests, err := newChannel.Accept()
if err != nil {
log.Printf("Could not accept channel (%s)", err)
return
}
// Prepare teardown function
close := func() {
channel.Close()
log.Printf("Session closed")
}
defer close()
sh.SetChannel(&channel)
var payload []byte
ok := true
for req := range requests {
if len(req.Payload) == 0 {
req.Reply(true, nil)
}
path := string(req.Payload)
typ := Mode(req.Type)
switch typ {
// in reality, this would be an scp with the appropriate args,
// but for testing this is fine.
case SOURCE:
ok, payload = sh.Source(path)
case DEST:
ok, payload = sh.Destination(path)
default:
return
}
// make sure that errors get send back if we failed
if req.WantReply {
log.Printf("Wants reply %s", string(payload))
req.Reply(ok, payload)
}
// run any pending work now that a reply has been sent
pendingFn := sh.GetPendingWork()
if pendingFn != nil {
pendingFn()
}
}
}
开发者ID:jak-atx,项目名称:vic,代码行数:53,代码来源:test_utils.go
示例9: ChannelForward
// ChannelForward establishes a secure channel forward (ssh -W) to the server
// requested by the user, assuming it is a permitted host.
func (s *Server) ChannelForward(session *Session, newChannel ssh.NewChannel) {
var msg channelOpenDirectMsg
ssh.Unmarshal(newChannel.ExtraData(), &msg)
address := fmt.Sprintf("%s:%d", msg.RAddr, msg.RPort)
permitted := false
for _, remote := range session.Remotes {
if remote == address {
permitted = true
break
}
}
if !permitted {
log.Printf("Disallowed access to %s for user %s", address, session.User.Name)
newChannel.Reject(ssh.Prohibited, "remote host access denied for user")
return
}
// Log the selection
if s.Selected != nil {
if err := s.Selected(session, address); err != nil {
newChannel.Reject(ssh.Prohibited, "access denied")
return
}
}
conn, err := net.Dial("tcp", address)
if err != nil {
newChannel.Reject(ssh.ConnectionFailed, fmt.Sprintf("error: %v", err))
return
}
channel, reqs, err := newChannel.Accept()
go ssh.DiscardRequests(reqs)
var closer sync.Once
closeFunc := func() {
channel.Close()
conn.Close()
}
go func() {
io.Copy(channel, conn)
closer.Do(closeFunc)
}()
go func() {
io.Copy(conn, channel)
closer.Do(closeFunc)
}()
}
开发者ID:boazy,项目名称:sshmux,代码行数:54,代码来源:forward.go
示例10: HandleNewChannel
func (handler *DirectTcpipChannelHandler) HandleNewChannel(logger lager.Logger, newChannel ssh.NewChannel) {
type channelOpenDirectTcpipMsg struct {
TargetAddr string
TargetPort uint32
OriginAddr string
OriginPort uint32
}
var directTcpipMessage channelOpenDirectTcpipMsg
err := ssh.Unmarshal(newChannel.ExtraData(), &directTcpipMessage)
if err != nil {
newChannel.Reject(ssh.ConnectionFailed, "Failed to parse open channel message")
return
}
destination := fmt.Sprintf("%s:%d", directTcpipMessage.TargetAddr, directTcpipMessage.TargetPort)
conn, err := handler.dialer.Dial("tcp", destination)
if err != nil {
newChannel.Reject(ssh.ConnectionFailed, err.Error())
return
}
channel, requests, err := newChannel.Accept()
go ssh.DiscardRequests(requests)
wg := &sync.WaitGroup{}
wg.Add(2)
go helpers.CopyAndClose(logger.Session("to-target"), wg, conn, channel)
go helpers.CopyAndClose(logger.Session("to-channel"), wg, channel, conn)
wg.Wait()
}
开发者ID:benjaminharnett,项目名称:diego-ssh,代码行数:33,代码来源:direct_tcpip_channel_handler.go
示例11: HandleChannel
// HandleChannel handles one SSH channel
func (c *Client) HandleChannel(newChannel ssh.NewChannel) error {
if newChannel.ChannelType() != "session" {
log.Debugf("Unknown channel type: %s", newChannel.ChannelType())
newChannel.Reject(ssh.UnknownChannelType, "unknown channel type")
return nil
}
channel, requests, err := newChannel.Accept()
if err != nil {
log.Errorf("newChannel.Accept failed: %v", err)
return err
}
c.ChannelIdx++
log.Debugf("HandleChannel.channel (client=%d channel=%d)", c.Idx, c.ChannelIdx)
log.Debug("Creating pty...")
c.Pty, c.Tty, err = pty.Open()
if err != nil {
log.Errorf("pty.Open failed: %v", err)
return nil
}
c.HandleChannelRequests(channel, requests)
return nil
}
开发者ID:moul,项目名称:ssh2docker,代码行数:27,代码来源:client.go
示例12: HandleDirectChannel
func (s *Session) HandleDirectChannel(newChannel ssh.NewChannel) (bool, ssh.RejectionReason) {
data, err := UnmarshalTunnelData(newChannel.ExtraData())
if err != nil {
return false, ssh.UnknownChannelType
}
// look up session by name
session, host, port := s.Gateway().LookupSessionService(data.Host, uint16(data.Port))
if session == nil {
return false, ssh.ConnectionFailed
}
// found the service, attempt to open a channel
data.Host = host
data.Port = uint32(port)
c2, err := session.OpenChannel("forwarded-tcpip", MarshalTunnelData(data))
if err != nil {
return false, ssh.ConnectionFailed
}
defer func() {
if c2 != nil {
c2.Close()
}
}()
// accept the channel
channel, requests, err := newChannel.Accept()
if err != nil {
return false, ssh.ResourceShortage
}
// cannot return false from this point on
// also need to accepted close the channel
defer func() {
if channel != nil {
if err := channel.Close(); err != nil {
glog.Warningf("failed to close accepted channel: %s", err)
}
}
}()
c, err := NewChannel(s, channel, newChannel.ChannelType(), newChannel.ExtraData())
if err != nil {
glog.Errorf("failed to create accepted channel: %s", err)
return true, 0
}
s.AddChannel(c)
// no failure
go c.HandleRequests(requests)
go c.HandleTunnelChannel(c2)
// do not close channel on exit
channel = nil
c2 = nil
return true, 0
}
开发者ID:ziyan,项目名称:gatewaysshd,代码行数:59,代码来源:session.go
示例13: handleChanReq
func (svr *sshServer) handleChanReq(chanReq ssh.NewChannel) {
fmt.Fprintf(sshServerDebugStream, "channel request: %v, extra: '%v'\n", chanReq.ChannelType(), hex.EncodeToString(chanReq.ExtraData()))
switch chanReq.ChannelType() {
case "session":
if ch, reqs, err := chanReq.Accept(); err != nil {
fmt.Fprintf(sshServerDebugStream, "fail to accept channel request: %v\n", err)
chanReq.Reject(ssh.ResourceShortage, "channel accept failure")
} else {
chsvr := &sshSessionChannelServer{
sshChannelServer: &sshChannelServer{svr, chanReq, ch, reqs},
env: append([]string{}, os.Environ()...),
}
chsvr.handle()
}
default:
chanReq.Reject(ssh.UnknownChannelType, "channel type is not a session")
}
}
开发者ID:tomzhang,项目名称:sftp,代码行数:18,代码来源:server_integration_test.go
示例14: handleSSHChannel
func handleSSHChannel(newChan ssh.NewChannel) {
ch, reqs, err := newChan.Accept()
if err != nil {
log.Println("handle channel failed:", err)
return
}
for req := range reqs {
go func(req *ssh.Request) {
if req.WantReply {
req.Reply(true, nil)
}
switch req.Type {
case "exec":
defer ch.Close()
var payload = struct{ Value string }{}
ssh.Unmarshal(req.Payload, &payload)
line := strings.Trim(payload.Value, "\n")
var args []string
if line != "" {
args = strings.Split(line, " ")
}
cmd := exec.Command("/bin/envy", args...)
cmd.Stdout = ch
cmd.Stderr = ch.Stderr()
err := cmd.Run()
status := struct{ Status uint32 }{0}
if err != nil {
if exiterr, ok := err.(*exec.ExitError); ok {
if stat, ok := exiterr.Sys().(syscall.WaitStatus); ok {
status = struct{ Status uint32 }{uint32(stat.ExitStatus())}
} else {
assert(err)
}
}
}
_, err = ch.SendRequest("exit-status", false, ssh.Marshal(&status))
assert(err)
return
}
}(req)
}
}
开发者ID:smaccona,项目名称:envy,代码行数:42,代码来源:session.go
示例15: handleChannel
func (server *Server) handleChannel(newChannel ssh.NewChannel, conn *ssh.ServerConn) {
channelType := newChannel.ChannelType()
if channelType != "session" {
newChannel.Reject(ssh.UnknownChannelType,
fmt.Sprintf("Unknown SSH Channel Type: %s, only `session` is supported", channelType))
server.Logger.Errorf("Rejected SSH Channel Request from %s due to unknown channel type: %s",
conn.RemoteAddr().String(), newChannel.ChannelType())
return
}
channel, requests, err := newChannel.Accept()
if err != nil {
newChannel.Reject(ssh.ConnectionFailed, "Failed to accept SSH Channel Request, developers are working on it.")
server.Logger.Errorf("Rejected SSH Channel Request from %s due to accept request failure: %s",
conn.RemoteAddr().String(), err)
return
}
server.Logger.Debugf("Accepted new SSH Channel Request from %s", conn.RemoteAddr().String())
server.handleRequest(channel, requests, conn)
}
开发者ID:bachue,项目名称:pages,代码行数:20,代码来源:sshd.go
示例16: handleChannel
func handleChannel(newChannel ssh.NewChannel, rClient *ssh.Client) {
if newChannel.ChannelType() != "session" {
newChannel.Reject(ssh.UnknownChannelType, "unknown channel type: "+newChannel.ChannelType())
return
}
psChannel, psRequests, err := newChannel.Accept()
if err != nil {
panic("could not accept channel.")
}
sChannel, sRequests, err := rClient.OpenChannel(newChannel.ChannelType(), nil)
if err != nil {
panic("Failed to create session: " + err.Error())
}
go pipeRequests(psChannel, sChannel, psRequests, sRequests)
time.Sleep(50 * time.Millisecond)
go pipe(sChannel, psChannel)
go pipe(psChannel, sChannel)
}
开发者ID:Freeaqingme,项目名称:SshReverseProxy,代码行数:20,代码来源:daemon.go
示例17: handleChanReq
func (s *server) handleChanReq(chanReq ssh.NewChannel, authInfo map[string]string) {
if chanReq.ChannelType() != "session" {
chanReq.Reject(ssh.Prohibited, "channel type is not a session")
return
}
ch, reqs, err := chanReq.Accept()
if err != nil {
log.Errorf("fail to accept channel request %v", err)
return
}
for {
req := <-reqs
switch req.Type {
case "env":
case "exec":
s.handleExec(ch, req, authInfo)
return
default:
ch.Write([]byte(fmt.Sprintf("request type %q not allowed\r\n", req.Type)))
ch.Close()
return
}
}
}
开发者ID:robinmonjo,项目名称:dockpack,代码行数:27,代码来源:server.go
示例18: handleChannel
func handleChannel(conn *ssh.ServerConn, newChan ssh.NewChannel, execHandler []string) {
ch, reqs, err := newChan.Accept()
if err != nil {
log.Println("newChan.Accept failed:", err)
return
}
// Setup stdout/stderr
var stdout, stderr io.Writer
if *debug {
stdout = io.MultiWriter(ch, os.Stdout)
stderr = io.MultiWriter(ch.Stderr(), os.Stdout)
} else {
stdout = ch
stderr = ch.Stderr()
}
handler := sshHandler{
ExecHandler: execHandler,
channel: ch,
stdout: stdout,
stderr: stderr,
}
// Load default environment
if *env {
handler.Env = os.Environ()
}
if conn.Permissions != nil {
// Using Permissions.Extensions as a way to get state from PublicKeyCallback
if conn.Permissions.Extensions["environ"] != "" {
handler.Env = append(handler.Env, strings.Split(conn.Permissions.Extensions["environ"], "\n")...)
}
handler.Env = append(handler.Env, "USER="+conn.Permissions.Extensions["user"])
}
for req := range reqs {
go handler.Request(req)
}
}
开发者ID:technosophos,项目名称:execd,代码行数:40,代码来源:handlers.go
示例19: handleChannel
func handleChannel(chanRequest ssh.NewChannel) {
handle, err := NewHandle(chanRequest.ChannelType())
if err != nil {
config.Log.Debug("wrong handler %v", err)
chanRequest.Reject(ssh.UnknownChannelType, err.Error())
return
}
ch, reqs, err := chanRequest.Accept()
if err != nil {
config.Log.Debug("fail to accept channel request %v", err)
return
}
defer ch.Close()
for req := range reqs {
done, err := handle.Request(ch, req)
if err != nil {
config.Log.Debug("request errored out %v", err)
_, err := ch.Write([]byte(fmt.Sprintf("%v\r\n", err)))
if err != nil {
config.Log.Debug(err.Error())
}
}
if done {
return
}
}
}
开发者ID:Lanzafame,项目名称:butter,代码行数:30,代码来源:server.go
示例20: sshHandleChannel
func sshHandleChannel(conn net.Conn, newChannel ssh.NewChannel) {
// Channels have a type, depending on the application level protocol
// intended. In the case of a shell, the type is "session" and ServerShell
// may be used to present a simple terminal interface.
if newChannel.ChannelType() != "session" {
newChannel.Reject(ssh.UnknownChannelType, "unknown channel type")
return
}
channel, requests, err := newChannel.Accept()
if err != nil {
log.Errorln(err)
return
}
// Sessions have out-of-band requests such as "shell", "pty-req" and "env".
// Here we handle only the "shell" request.
go func(in <-chan *ssh.Request) {
for req := range in {
ok := false
switch req.Type {
case "shell":
ok = true
if len(req.Payload) > 0 {
// We don't accept any commands, only the default shell.
ok = false
}
case "pty-req":
ok = true
}
req.Reply(ok, nil)
}
}(requests)
term := terminal.NewTerminal(channel, "> ")
go func() {
defer channel.Close()
for {
line, err := term.ReadLine()
start := time.Now().UnixNano()
if err != nil {
if err != io.EOF {
log.Errorln(err)
}
return
}
sshReportChan <- uint64(len(line))
// just echo the message
log.Debugln("ssh received: ", line)
term.Write([]byte(line))
term.Write([]byte{'\r', '\n'})
stop := time.Now().UnixNano()
log.Info("ssh %v %vns", conn.RemoteAddr(), uint64(stop-start))
}
}()
}
开发者ID:cdshann,项目名称:minimega,代码行数:58,代码来源:ssh.go
注:本文中的golang.org/x/crypto/ssh.NewChannel类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论