sftp/sftp.go

69 lines
1.6 KiB
Go
Raw Normal View History

2013-11-05 08:25:17 +08:00
// Package sftp implements the SSH File Transfer Protocol as described in
// https://filezilla-project.org/specs/draft-ietf-secsh-filexfer-02.txt
package sftp
import (
"code.google.com/p/go.crypto/ssh"
)
const (
SSH_FXP_INIT = 1
SSH_FXP_VERSION = 2
SSH_FXP_OPEN = 3
SSH_FXP_CLOSE = 4
SSH_FXP_READ = 5
SSH_FXP_WRITE = 6
SSH_FXP_LSTAT = 7
SSH_FXP_FSTAT = 8
SSH_FXP_SETSTAT = 9
SSH_FXP_FSETSTAT = 10
SSH_FXP_OPENDIR = 11
SSH_FXP_READDIR = 12
SSH_FXP_REMOVE = 13
SSH_FXP_MKDIR = 14
SSH_FXP_RMDIR = 15
SSH_FXP_REALPATH = 16
SSH_FXP_STAT = 17
SSH_FXP_RENAME = 18
SSH_FXP_READLINK = 19
SSH_FXP_SYMLINK = 20
SSH_FXP_STATUS = 101
SSH_FXP_HANDLE = 102
SSH_FXP_DATA = 103
SSH_FXP_NAME = 104
SSH_FXP_ATTRS = 105
SSH_FXP_EXTENDED = 200
SSH_FXP_EXTENDED_REPLY = 201
)
type packet struct {
length uint32
typ uint8
data []byte
}
// New creates a new sftp client on conn.
func NewClient(conn *ssh.ClientConn) (*ClientConn, error) {
s, err := conn.NewSession()
if err != nil {
return nil, err
}
if err := s.RequestSubsystem("sftp"); err != nil {
return nil, err
}
sftp := &ClientConn{s}
return sftp, sftp.sendInit()
}
type ClientConn struct {
session *ssh.Session
}
func (c *ClientConn) Close() error { return c.session.Close() }
func (c *ClientConn) sendInit() error {
var b = []byte{0, 0, 0, 3, 0, 0, 0, 0}
_, err := c.session.Stdout.Write(b)
return err
}