client_func_test.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // Copyright 2011 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package ssh
  5. // ClientConn functional tests.
  6. // These tests require a running ssh server listening on port 22
  7. // on the local host. Functional tests will be skipped unless
  8. // -ssh.user and -ssh.pass must be passed to gotest.
  9. import (
  10. "bytes"
  11. "flag"
  12. "io"
  13. "testing"
  14. )
  15. var (
  16. sshuser = flag.String("ssh.user", "", "ssh username")
  17. sshpass = flag.String("ssh.pass", "", "ssh password")
  18. sshprivkey = flag.String("ssh.privkey", "", "ssh privkey file")
  19. )
  20. func TestFuncPasswordAuth(t *testing.T) {
  21. if *sshuser == "" {
  22. t.Log("ssh.user not defined, skipping test")
  23. return
  24. }
  25. config := &ClientConfig{
  26. User: *sshuser,
  27. Auth: []ClientAuth{
  28. ClientAuthPassword(password(*sshpass)),
  29. },
  30. }
  31. conn, err := Dial("tcp", "localhost:22", config)
  32. if err != nil {
  33. t.Fatalf("Unable to connect: %s", err)
  34. }
  35. defer conn.Close()
  36. }
  37. func TestFuncPublickeyAuth(t *testing.T) {
  38. if *sshuser == "" {
  39. t.Log("ssh.user not defined, skipping test")
  40. return
  41. }
  42. kc := new(keychain)
  43. if err := kc.loadPEM(*sshprivkey); err != nil {
  44. t.Fatalf("unable to load private key: %s", err)
  45. }
  46. config := &ClientConfig{
  47. User: *sshuser,
  48. Auth: []ClientAuth{
  49. ClientAuthKeyring(kc),
  50. },
  51. }
  52. conn, err := Dial("tcp", "localhost:22", config)
  53. if err != nil {
  54. t.Fatalf("unable to connect: %s", err)
  55. }
  56. defer conn.Close()
  57. }
  58. func TestFuncLargeRead(t *testing.T) {
  59. if *sshuser == "" {
  60. t.Log("ssh.user not defined, skipping test")
  61. return
  62. }
  63. kc := new(keychain)
  64. if err := kc.loadPEM(*sshprivkey); err != nil {
  65. t.Fatalf("unable to load private key: %s", err)
  66. }
  67. config := &ClientConfig{
  68. User: *sshuser,
  69. Auth: []ClientAuth{
  70. ClientAuthKeyring(kc),
  71. },
  72. }
  73. conn, err := Dial("tcp", "localhost:22", config)
  74. if err != nil {
  75. t.Fatalf("unable to connect: %s", err)
  76. }
  77. defer conn.Close()
  78. session, err := conn.NewSession()
  79. if err != nil {
  80. t.Fatalf("unable to create new session: %s", err)
  81. }
  82. stdout, err := session.StdoutPipe()
  83. if err != nil {
  84. t.Fatalf("unable to acquire stdout pipe: %s", err)
  85. }
  86. err = session.Start("dd if=/dev/urandom bs=2048 count=1")
  87. if err != nil {
  88. t.Fatalf("unable to execute remote command: %s", err)
  89. }
  90. buf := new(bytes.Buffer)
  91. n, err := io.Copy(buf, stdout)
  92. if err != nil {
  93. t.Fatalf("error reading from remote stdout: %s", err)
  94. }
  95. if n != 2048 {
  96. t.Fatalf("Expected %d bytes but read only %d from remote command", 2048, n)
  97. }
  98. }