ssh.go 689 B

12345678910111213141516171819202122232425262728293031
  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 string(prefix[:]) != sshPrefix[:len(prefix)] {
  16. return os.ErrInvalid
  17. }
  18. if err != nil {
  19. return E.Cause1(ErrNeedMoreData, err)
  20. }
  21. fistLine, _, err := bReader.ReadLine()
  22. if err != nil {
  23. return err
  24. }
  25. metadata.Protocol = C.ProtocolSSH
  26. metadata.Client = string(fistLine)[8:]
  27. return nil
  28. }