文件ssh 上传和下载

it2025-02-08  6

传输文件

package main import ( "fmt" "github.com/pkg/sftp" "golang.org/x/crypto/ssh" "log" "net" "os" "path" "time" ) const PrivateKey = ` -----BEGIN RSA PRIVATE KEY----- -----END RSA PRIVATE KEY----- ` func connect(user, password, host string, port int) (*sftp.Client, error) { var ( auth []ssh.AuthMethod addr string clientConfig *ssh.ClientConfig sshClient *ssh.Client sftpClient *sftp.Client err error ) // get auth method auth = make([]ssh.AuthMethod, 0) auth = append(auth, ssh.Password(password)) /*私钥登陆才用得到*/ signer, err := ssh.ParsePrivateKey([]byte(PrivateKey)) if err != nil { log.Fatalf("Unable to parse private key: %v", err) } clientConfig = &ssh.ClientConfig{ User: user, Auth: []ssh.AuthMethod{ //ssh.Password(password),//密码登录 ssh.PublicKeys(signer), }, Timeout: 30 * time.Second, // error---ssh: must specify HostKeyCallback add 需要验证服务端,不做验证返回nil就可以 HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error { return nil }, } // connet to ssh addr = fmt.Sprintf("%s:%d", host, port) if sshClient, err = ssh.Dial("tcp", addr, clientConfig); err != nil { fmt.Println(err) return nil, err } // create sftp client if sftpClient, err = sftp.NewClient(sshClient); err != nil { return nil, err } return sftpClient, nil } func main() { var ( err error sftpClient *sftp.Client ) // 这里换成实际的 SSH 连接的 用户名,密码,主机名或IP,SSH端口 此处要root的密码 sftpClient, err = connect("user", "passwd", "127.0.0.1", 22) if err != nil { log.Fatal(err) } defer sftpClient.Close() //用来测试的本地文件路径 和 远程机器上的文件夹 var localFilePath = "/Users/zhangsan/go/src/workspace/test/test.txt" var remoteDir = "/tmp" srcFile, err := os.Open(localFilePath) if err != nil { log.Fatal(err) } defer srcFile.Close() var remoteFileName = path.Base(localFilePath) dstFile, err := sftpClient.Create(path.Join(remoteDir, remoteFileName)) if err != nil { log.Fatal(err) } defer dstFile.Close() buf := make([]byte, 1024) for { n, _ := srcFile.Read(buf) if n == 0 { break } dstFile.Write(buf) } fmt.Println("copy file to remote server finished!") }

下载文件

package main import ( "fmt" "log" "os" "path" "time" "github.com/pkg/sftp" "golang.org/x/crypto/ssh" ) func main() { var ( err error sftpClient *sftp.Client ) // 这里换成实际的 SSH 连接的 用户名,密码,主机名或IP,SSH端口 sftpClient, err = connect("root", "rootpass", "127.0.0.1", 22) if err != nil { log.Fatal(err) } defer sftpClient.Close() // 用来测试的远程文件路径 和 本地文件夹 var remoteFilePath = "/path/to/remote/path/test.txt" var localDir = "/local/dir" srcFile, err := sftpClient.Open(remoteFilePath) if err != nil { log.Fatal(err) } defer srcFile.Close() var localFileName = path.Base(remoteFilePath) dstFile, err := os.Create(path.Join(localDir, localFileName)) if err != nil { log.Fatal(err) } defer dstFile.Close() if _, err = srcFile.WriteTo(dstFile); err != nil { log.Fatal(err) } fmt.Println("copy file from remote server finished!") }
最新回复(0)