mirror of https://github.com/pkg/sftp.git
compare golang sftp subsystem to openssh
This commit is contained in:
parent
f9e831be30
commit
1502f6c9e6
|
|
@ -23,6 +23,11 @@ var sshServerDebugStream = os.Stdout // ioutil.Discard
|
||||||
var sftpServerDebugStream = os.Stdout // ioutil.Discard
|
var sftpServerDebugStream = os.Stdout // ioutil.Discard
|
||||||
var sftpClientDebugStream = os.Stdout // ioutil.Discard
|
var sftpClientDebugStream = os.Stdout // ioutil.Discard
|
||||||
|
|
||||||
|
const (
|
||||||
|
GOLANG_SFTP = true
|
||||||
|
OPENSSH_SFTP = false
|
||||||
|
)
|
||||||
|
|
||||||
/***********************************************************************************************
|
/***********************************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -101,21 +106,22 @@ func basicServerConfig() *ssh.ServerConfig {
|
||||||
}
|
}
|
||||||
|
|
||||||
type sshServer struct {
|
type sshServer struct {
|
||||||
conn net.Conn
|
useSubsystem bool
|
||||||
config *ssh.ServerConfig
|
conn net.Conn
|
||||||
sshConn *ssh.ServerConn
|
config *ssh.ServerConfig
|
||||||
newChans <-chan ssh.NewChannel
|
sshConn *ssh.ServerConn
|
||||||
newReqs <-chan *ssh.Request
|
newChans <-chan ssh.NewChannel
|
||||||
|
newReqs <-chan *ssh.Request
|
||||||
}
|
}
|
||||||
|
|
||||||
func sshServerFromConn(conn net.Conn, config *ssh.ServerConfig) (*sshServer, error) {
|
func sshServerFromConn(conn net.Conn, useSubsystem bool, config *ssh.ServerConfig) (*sshServer, error) {
|
||||||
// From a standard TCP connection to an encrypted SSH connection
|
// From a standard TCP connection to an encrypted SSH connection
|
||||||
sshConn, newChans, newReqs, err := ssh.NewServerConn(conn, config)
|
sshConn, newChans, newReqs, err := ssh.NewServerConn(conn, config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
svr := &sshServer{conn, config, sshConn, newChans, newReqs}
|
svr := &sshServer{useSubsystem, conn, config, sshConn, newChans, newReqs}
|
||||||
svr.listenChannels()
|
svr.listenChannels()
|
||||||
return svr, nil
|
return svr, nil
|
||||||
}
|
}
|
||||||
|
|
@ -272,8 +278,9 @@ func (chsvr *sshSessionChannelServer) handleSubsystem(req *ssh.Request) error {
|
||||||
if subsystemReq.Name == "sftp" {
|
if subsystemReq.Name == "sftp" {
|
||||||
req.Reply(true, nil)
|
req.Reply(true, nil)
|
||||||
|
|
||||||
if false {
|
if !chsvr.svr.useSubsystem {
|
||||||
// use the sftp server backend; this is to test the ssh code, not the sftp code
|
// use the openssh sftp server backend; this is to test the ssh code, not the sftp code,
|
||||||
|
// or is used for comparison between our sftp subsystem and the openssh sftp subsystem
|
||||||
cmd := exec.Command(*testSftp, "-e", "-l", "DEBUG") // log to stderr
|
cmd := exec.Command(*testSftp, "-e", "-l", "DEBUG") // log to stderr
|
||||||
cmd.Stdin = chsvr.ch
|
cmd.Stdin = chsvr.ch
|
||||||
cmd.Stdout = chsvr.ch
|
cmd.Stdout = chsvr.ch
|
||||||
|
|
@ -312,7 +319,7 @@ Actual unit tests
|
||||||
***********************************************************************************************/
|
***********************************************************************************************/
|
||||||
|
|
||||||
// starts an ssh server to test. returns: host string and port
|
// starts an ssh server to test. returns: host string and port
|
||||||
func testServer(t *testing.T, readonly bool) (string, int) {
|
func testServer(t *testing.T, useSubsystem bool, readonly bool) (net.Listener, string, int) {
|
||||||
listener, err := net.Listen("tcp", "127.0.0.1:0")
|
listener, err := net.Listen("tcp", "127.0.0.1:0")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
|
@ -337,7 +344,7 @@ func testServer(t *testing.T, readonly bool) (string, int) {
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
sshSvr, err := sshServerFromConn(conn, basicServerConfig())
|
sshSvr, err := sshServerFromConn(conn, useSubsystem, basicServerConfig())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
@ -347,7 +354,7 @@ func testServer(t *testing.T, readonly bool) (string, int) {
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
return host, port
|
return listener, host, port
|
||||||
}
|
}
|
||||||
|
|
||||||
func runSftpClient(script string, path string, host string, port int) (string, error) {
|
func runSftpClient(script string, path string, host string, port int) (string, error) {
|
||||||
|
|
@ -363,14 +370,28 @@ func runSftpClient(script string, path string, host string, port int) (string, e
|
||||||
return string(stdout.Bytes()), err
|
return string(stdout.Bytes()), err
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestServerLstat(t *testing.T) {
|
func TestServerCompareSubsystems(t *testing.T) {
|
||||||
host, port := testServer(t, READONLY)
|
listenerGo, hostGo, portGo := testServer(t, GOLANG_SFTP, READONLY)
|
||||||
|
listenerOp, hostOp, portOp := testServer(t, OPENSSH_SFTP, READONLY)
|
||||||
|
defer listenerGo.Close()
|
||||||
|
defer listenerOp.Close()
|
||||||
|
|
||||||
script := "ls"
|
script := `
|
||||||
output, err := runSftpClient(script, "/tmp/", host, port)
|
ls /
|
||||||
|
ls /dev/
|
||||||
|
`
|
||||||
|
outputGo, err := runSftpClient(script, "/", hostGo, portGo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Log(output)
|
outputOp, err := runSftpClient(script, "/", hostOp, portOp)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if outputGo != outputOp {
|
||||||
|
t.Errorf("outputs differ, go:\n%v\nopenssh:\n%v\n", outputGo, outputOp)
|
||||||
|
}
|
||||||
|
t.Logf("go output:\n%v\nopenssh output:\n%v\n", outputGo, outputOp)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue