ssh.go 676 B

123456789101112131415161718192021222324252627282930
  1. package sniff
  2. import (
  3. "bufio"
  4. "context"
  5. "io"
  6. "os"
  7. "github.com/sagernet/sing-box/adapter"
  8. C "github.com/sagernet/sing-box/constant"
  9. E "github.com/sagernet/sing/common/exceptions"
  10. )
  11. func SSH(_ context.Context, metadata *adapter.InboundContext, reader io.Reader) error {
  12. const sshPrefix = "SSH-2.0-"
  13. bReader := bufio.NewReader(reader)
  14. prefix, err := bReader.Peek(len(sshPrefix))
  15. if err != nil {
  16. return E.Cause1(ErrNeedMoreData, err)
  17. } else if string(prefix) != sshPrefix {
  18. return os.ErrInvalid
  19. }
  20. fistLine, _, err := bReader.ReadLine()
  21. if err != nil {
  22. return err
  23. }
  24. metadata.Protocol = C.ProtocolSSH
  25. metadata.Client = string(fistLine)[8:]
  26. return nil
  27. }