Example Go-lang command-line utility for SFTP
- Uses the "github.com/pkg/sftp" and "golang.org/x/crypto/ssh" packages
- Implements GET, PUT, RM and LS
- Preserves the unix file permissions (FileInfo.Mode)
Confugre the settings for your file transfer, as well as server and credentials, in the SftpUtil struct. The following comments explain the fields to configure:
type SftpUtil struct {
Rdir string // Remote directory
Ldir string // Local directory
Filename string // File to transfer
Type string // GET or PUT
User string // Username
Pass string // Password
Host string // Hostname or IP Address
Port string // TCP port
Client *sftp.Client
}
The routine GetCmdLine() reads comand-line flags to specify the file details and type of transfer. These parameters set the first four fields in the above struct.
A sample main() routine for making a stand-alone sftp utilty is provided in sftp-cmd/sftp-cmd.go
package main
import (
"fmt"
"github.com/DavidSantia/sftp_util"
)
func main() {
sftp := &sftp_util.SftpSettings{}
err := sftp.GetCmdLine()
if err != nil {
fmt.Printf("Command-line error: %v\n", err)
return
}
sftp.User = "USER"
sftp.Pass = "PASSWORD"
sftp.Host = "HOST"
sftp.Port = "22"
// Open SSH session
err = sftp.Connect()
if err != nil {
fmt.Printf("Connect error: %v\n", err)
return
}
defer sftp.Client.Close()
if sftp.Type == "GET" {
err = sftp.GetFile()
if err != nil {
fmt.Printf("GET error: %v\n", err)
return
}
} else if sftp.Type == "PUT" {
err = sftp.PutFile()
if err != nil {
fmt.Printf("PUT error: %v\n", err)
return
}
} else if sftp.Type == "RM" {
err = sftp.RmFile()
if err != nil {
fmt.Printf("RM error: %v\n", err)
return
}
} else {
err = sftp.LsDir()
if err != nil {
fmt.Printf("LS error: %v\n", err)
return
}
}
}
You can buid directly:
$ cd sftp-cmd
$ go build
Alternatively, a build script is provided that builds for linux using a Docker container:
$ ./build.sh
The utility takes the following flags:
Usage of ./sftp-cmd:
-file string
File to transfer
-ldir string
Local directory (default ".")
-nochmod
Don't attempt to set remote file permissions
-rdir string
Remote directory (default ".")
-type string
GET, PUT, RM or LS (required)