
正文
Go连接到Linux服务器进行操作-执行shell命令&&上传文件
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Go连接到Linux服务器进行操作使用密码连接Linux服务器
package mainimport (
"fmt"
"golang.org/x/crypto/ssh"
"log"
"time"
)func pwdConnect(sshHost, sshUser, sshPassword string, sshPort int) (*ssh.Client, error) {
// 创建ssh登录配置
config := &ssh.ClientConfig{
Timeout: 5 * time.Second, // 超时时间
User: sshUser, // 登录账号
Auth: []ssh.AuthMethod{ssh.Password(sshPassword)}, // 密码
HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 这个不够安全,生产环境不建议使用
//HostKeyCallback: ssh.FixedHostKey(), // 建议使用这种,目前还没研究出怎么使用[todo]
}// dial连接服务器
addr := fmt.Sprintf("%s:%d", sshHost, sshPort)
Client, err := ssh.Dial("tcp", addr, config)
if err != nil {
log.Fatal("连接到服务器失败", err)
return nil, err
}//defer sshClient.Close()
return Client, nil
}func main() {
// 连接到服务器
conn, err := pwdConnect("192.168.3.121", "root", "123456", 22)
if err != nil {
return
}
defer conn.Close()// 创建 ssh session 会话
session, err := conn.NewSession()
if err != nil {
panic(err)
}
defer session.Close()// 执行远程命令
cmd := "cd /tmp/;ls -l; tar -czf test.tar.gz hello.txt test.txt;ls -l"
cmdInfo, err := session.CombinedOutput(cmd)
if err != nil {
panic(err)
}
fmt.Println(string(cmdInfo))
}
使用秘钥连接到Linux服务器
package mainimport (
"fmt"
"golang.org/x/crypto/ssh"
"io/ioutil"
"time"
)// 使用秘钥连接Linux服务器// 连接到linux服务器
func keyConnect(sshUser, sshHost, sshKey string, sshPort int) (*ssh.Client, error) {
// 读取秘钥
key, err := ioutil.ReadFile(sshKey)
if err != nil {
panic("秘钥读取失败")
}// 创建秘钥签名
// 会拿着秘钥去登录服务器
signer, err := ssh.ParsePrivateKey(key)
if err != nil {
panic("秘钥签名失败")
}// ssh配置
config := &ssh.ClientConfig{
Timeout: 5 * time.Second, // 超时时间
User: sshUser,
Auth: []ssh.AuthMethod{
// 使用秘钥登录远程服务器
ssh.PublicKeys(signer),
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(), //这个不够安全,生产环境不建议使用
//var hostKey ssh.PublicKey
//HostKeyCallback: ssh.FixedHostKey(hostKey),
}// 连接远程服务器
addr := fmt.Sprintf("%s:%d", sshHost, sshPort)
client, err := ssh.Dial("tcp", addr, config)
if err != nil {
fmt.Println("连接远程服务器失败", err)
return nil, err
}//defer client.Close()
return client, nil
}func main() {
// 连接服务器
conn, err := keyConnect("root", "192.168.3.121", "id_rsa", 22)
if err != nil {
panic(err)
}
defer conn.Close()// 创建 ssh session 会话
session, err := conn.NewSession()
if err != nil {
panic(err)
}
defer session.Close()// 执行远程命令
cmd := "cd /tmp/; ls -l"
cmdInfo, err := session.CombinedOutput(cmd)
if err != nil {
panic(err)
}
fmt.Println(string(cmdInfo))
}
使用秘钥或者密码连接到服务器
package mainimport (
"errors"
"fmt"
"golang.org/x/crypto/ssh"
"io/ioutil"
"log"
"time"
)func keyOrPwdConnect(sshHost, sshUser, sshPassword, sshKey string, sshPort int) (*ssh.Client, error) {
// 创建ssh登录配置
config := &ssh.ClientConfig{
Timeout: 5 * time.Second, // 超时时间
User: sshUser, // 登录账号
HostKeyCallback: ssh.InsecureIgnoreHostKey(), //这个不够安全,生产环境不建议使用
//HostKeyCallback: ssh.FixedHostKey(), //建议使用这种
}if sshKey != "" {
// 秘钥登录
key, err := ioutil.ReadFile(sshKey) // 读取秘钥
if err != nil {
panic("秘钥读取失败")
}
// 创建秘钥签名
signer, err := ssh.ParsePrivateKey(key)
if err != nil {
panic("秘钥签名失败")
}
// 配置秘钥登录
config.Auth = []ssh.AuthMethod{
ssh.PublicKeys(signer),
}
} else if sshPassword != "" {
// 密码登录
config.Auth = []ssh.AuthMethod{ssh.Password(sshPassword)}
} else {
err := errors.New("秘钥或者密码登录")
return nil, err
}// dial连接服务器
addr := fmt.Sprintf("%s:%d", sshHost, sshPort)
Client, err := ssh.Dial("tcp", addr, config)
if err != nil {
log.Fatal("连接到服务器失败", err)
return nil, err
}return Client, nil
}func main() {
// 连接服务器
//conn, err := keyOrPwdConnect("192.168.3.121", "root", "", "id_rsa", 22) // 秘钥登录
conn, err := keyOrPwdConnect("192.168.3.121", "root", "123456", "", 22) // 密码登录
if err != nil {
panic(err)
}
defer conn.Close()// 创建 ssh session 会话
session, err := conn.NewSession()
if err != nil {
panic(err)
}
defer session.Close()// 执行远程命令
cmd := "echo 'hello world!'"
cmdInfo, err := session.CombinedOutput(cmd)
if err != nil {
panic(err)
}
fmt.Println(string(cmdInfo))
}
上传文件到Linux服务器
package mainimport (
"errors"
"fmt"
"github.com/pkg/sftp"
"golang.org/x/crypto/ssh"
"io/ioutil"
"log"
"os"
"path"
"time"
)// 通过SSH连接Linux服务器
func keyOrPwdConnectLinuxServer(sshHost, sshUser, sshPassword, sshKey string, sshPort int) (*ssh.Client, error) {
// 创建ssh登录配置
config := &ssh.ClientConfig{
Timeout: 5 * time.Second, // 超时时间
User: sshUser, // 登录账号
HostKeyCallback: ssh.InsecureIgnoreHostKey(), //这个不够安全,生产环境不建议使用
//HostKeyCallback: ssh.FixedHostKey(), //建议使用这种
}if sshKey != "" {
// 秘钥登录
key, err := ioutil.ReadFile(sshKey)
if err != nil {
panic("秘钥读取失败")
}
// 创建秘钥签名
// 会拿着秘钥去登录服务器
signer, err := ssh.ParsePrivateKey(key)
if err != nil {
panic("秘钥签名失败")
}
// 配置秘钥登录
config.Auth = []ssh.AuthMethod{
ssh.PublicKeys(signer),
}
} else if sshPassword != "" {
// 密码登录
config.Auth = []ssh.AuthMethod{ssh.Password(sshPassword)}
} else {
err := errors.New("秘钥或者密码登录")
return nil, err
}// dial连接服务器
addr := fmt.Sprintf("%s:%d", sshHost, sshPort)
Client, err := ssh.Dial("tcp", addr, config)
if err != nil {
log.Fatal("连接到服务器失败", err)
return nil, err
}return Client, nil
}// 创建sftp会话
func CreateSftp(sshHost, sshUser, sshPassword, sshKey string, sshPort int) (*sftp.Client, error) {
// 连接Linux服务器
conn, err := keyOrPwdConnectLinuxServer(sshHost, sshUser, sshPassword, sshKey, sshPort)
if err != nil {
fmt.Println("连接Linux服务器失败")
panic(err)
}
//defer conn.Close()// 创建sftp会话
client, err := sftp.NewClient(conn)
if err != nil {
return nil, err
}
//defer client.Close()
return client, nil
}func main() {
// 连接sftp
client, err := CreateSftp("192.168.3.121", "root", "123456", "", 22)
if err != nil {
return
}
defer client.Close()// 浏览服务器/home/devel目录
//w := client.Walk("/home/devel")
//for w.Step() {
//if w.Err() != nil {
//continue
//}
//fmt.Println(w.Path())
//}// 在服务器创建文件
//f, err := client.Create("/tmp/hello.txt")
//if err != nil {
//panic(err)
//}
//_, err = f.Write([]byte("hello world!\n")) // 写入内容
//if err != nil {
//panic(err)
//}
//f.Close()// 查看服务器的文件
//fi, err := client.Lstat("/tmp/hello.txt")
//if err != nil {
//panic(err)
//}
//fmt.Printf("%#v\n", fi)// 上传文件
var localFilePath = "./test.txt" // 本地文件全路径
var remoteDir = "/tmp" // 服务器目录
// 打开需要上传的本地文件
srcFile, err := os.Open(localFilePath)
if err != nil {
panic(err)
}
defer srcFile.Close()
// 获取需要上传的文件的名称
var remoteFileName = path.Base(localFilePath)
// 在服务器创建文件并打开文件获得句柄
dstFile, err := client.Create(path.Join(remoteDir, remoteFileName))
if err != nil {
panic(err)
}
defer dstFile.Close()
// 写入内容
buf := make([]byte, 1024)
for {
n, _ := srcFile.Read(buf) // 把文件中的内容读取到buf中,每次读取本地需要上传的文件1024字节内容
// 当n=0时,证明本地需要上传的文件已经读取完毕了
if n == 0 {
break
}
dstFile.Write(buf) // 写入到句柄
}
fmt.Println("文件上传完毕")
}
Go连接到Linux服务器进行操作-执行shell命令&&上传文件的更多相关文章- 使用“rz -be”命令上传文件至服务器;使用“sz 文件名”从服务器下载文件到本地
注意:需要事先安装lrzsz服务 yum install -y lrzsz 因为服务器没有安装sftp服务,无法使用FileZilla.Xftp等连接服务器上传文件,这种情况可以利用rz命令上传文件. ...
- 本地命令上传文件到服务器以及linux编辑过程中非正常退出问题
一.上传文件到linux服务器首先从你本地切换到你要上传文件的目录,接下来:scp 文件名字 服务器用户名字@服务器ip:存储路径例子:scp index.html root@106.75.229 ...
- Linux下vsftpd的安装,Java上传文件实现。
首先我们需要查看是否已经安装vsftpd,输入命令 :vsftpd -v.如果出现以下信息,那么就说明已经安装vsftpd 如果没有安装,那么输入命令 : yum install vsftpd ...
- Linux学习笔记:使用ftp命令上传和下载文件
Linux中如何使用ftp命令,包括如何连接ftp服务器,上传or下载文件以及创建文件夹.虽然现在有很多ftp桌面应用(例如:FlashFXP),但是在服务器.SSH.远程会话中掌握命令行ftp的使用 ...
- secureCRT下linux rz命令上传文件失败或变小(破损)的问题解决方法
在使用secureCRT的linux服务器时候,很多时候需要安装软件,而服务器本身是没有连接外网的 ,这时候就需要用到rz命令了. 在使用rz命令时候,有时候上传文件会失败,是因为上传的文件流中包含某 ...
- linux下 利用 rz 命令上传文件
1. 如何安装? 1)编译安装 root 账号登陆后,依次执行以下命令: # cd /tmp # wget http://www.ohse.de/uwe/releases/lrzsz-0.12.20 ...
- Linux下使用popen()执行shell命令【转】
本文转载自:https://my.oschina.net/u/727148/blog/262987 函数原型: #include “stdio.h” FILE popen( const char co ...
- Linux下使用popen()执行shell命令
转载 http://www.cnblogs.com/caosiyang/archive/2012/06/25/2560976.html 简单说一下popen()函数 函数定义 #include < ...
- linux服务器rz命令上传文件
1.首先,要是服务器不支持rz命令的话,需要安装执行 yum -y install lrzsz 2.再输入rz -be命令,选择需要上传的本地文件
随机推荐- 搭建Nexus3私服(含使用说明,支持CentOS、Windows)
官方文档 Nexus仓库介绍(支持maven.yum.docker私服等) 仓库分为三种: proxy:是远程仓库的代理.比如说在nexus中配置了一个central repository的proxy ...
- final添加内存屏障问题
看了 why大佬的 博客一个困扰我122天的技术问题,我好像知道答案了. 发现他留了个坑,在变量i类型为 int 或者 Integer 时,int类型的i死循环了而Integer类型的i可以结束 in ...
- Spring中的<context:annotation-config/>配置
当我们需要使用BeanPostProcessor时,直接在Spring配置文件中定义这些Bean显得比较笨拙,例如: 使用@Autowired注解,必须事先在Spring容器中声明AutowiredA ...
- gitlab找回管理员密码
1.登陆后台服务器,切换git用户 su - git 2.登录GitLab的Rails控制台 gitlab-rails console production 另一种 切换root账户 执行: git ...
- Message /index.jsp (line: [17], column: [45]) The JSP specification requires that an attribute name is preceded by whitespace
Error: Message /index.jsp (line: [17], column: [45]) The JSP specification requires that an attribut ...
- 第12次抽考(GUI)
1. package week4; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextFiel ...
- python 16篇 多线程和多进程
1.概念 线程.进程 进程 一个程序,它是一组资源的集合 一个进程里面默认是有一个线程的,主线程 多进程是可以利用多核cpu的线程 最小的执行单位 线程和线程之间是互相独立的 主线程等待子线程执行结束 ...
- python使用笔记008-模块
模块的原理: 1.就是一个python文件 2.标准模块是python自带的 3.第三方模块需要自己安装 导入模块的顺序: 1.从当前目录下找 2.从python的环境变量中找 一.自己定义的模块 1 ...
- Ubuntu20.4 bs4安装的正确姿势
一.背景 公司一小伙子反馈在内网机器上通过代理,还是安装不了bs4:于是乎,作为菜鸡的我开始排查.一直认为是网络和代理问题,所以关注点一直放在网络和安装包上:在网上搜索到,主要是以下问题: 1)更新a ...
- .h .cpp区别
首先,我们可以将所有东西都放在一个.cpp文件内. 然后编译器就将这个.cpp编译成.obj,obj是什么东西? 就是编译单元了.一个程序,可以由一个编译单元组成, 也可以有多个编译单元组成. 如果你 ...
注意:需要事先安装lrzsz服务 yum install -y lrzsz 因为服务器没有安装sftp服务,无法使用FileZilla.Xftp等连接服务器上传文件,这种情况可以利用rz命令上传文件. ...
一.上传文件到linux服务器首先从你本地切换到你要上传文件的目录,接下来:scp 文件名字 服务器用户名字@服务器ip:存储路径例子:scp index.html root@106.75.229 ...
首先我们需要查看是否已经安装vsftpd,输入命令 :vsftpd -v.如果出现以下信息,那么就说明已经安装vsftpd 如果没有安装,那么输入命令 : yum install vsftpd ...
Linux中如何使用ftp命令,包括如何连接ftp服务器,上传or下载文件以及创建文件夹.虽然现在有很多ftp桌面应用(例如:FlashFXP),但是在服务器.SSH.远程会话中掌握命令行ftp的使用 ...
在使用secureCRT的linux服务器时候,很多时候需要安装软件,而服务器本身是没有连接外网的 ,这时候就需要用到rz命令了. 在使用rz命令时候,有时候上传文件会失败,是因为上传的文件流中包含某 ...
1. 如何安装? 1)编译安装 root 账号登陆后,依次执行以下命令: # cd /tmp # wget http://www.ohse.de/uwe/releases/lrzsz-0.12.20 ...
本文转载自:https://my.oschina.net/u/727148/blog/262987 函数原型: #include “stdio.h” FILE popen( const char co ...
转载 http://www.cnblogs.com/caosiyang/archive/2012/06/25/2560976.html 简单说一下popen()函数 函数定义 #include < ...
1.首先,要是服务器不支持rz命令的话,需要安装执行 yum -y install lrzsz 2.再输入rz -be命令,选择需要上传的本地文件
- 搭建Nexus3私服(含使用说明,支持CentOS、Windows)
官方文档 Nexus仓库介绍(支持maven.yum.docker私服等) 仓库分为三种: proxy:是远程仓库的代理.比如说在nexus中配置了一个central repository的proxy ...
- final添加内存屏障问题
看了 why大佬的 博客一个困扰我122天的技术问题,我好像知道答案了. 发现他留了个坑,在变量i类型为 int 或者 Integer 时,int类型的i死循环了而Integer类型的i可以结束 in ...
- Spring中的<context:annotation-config/>配置
当我们需要使用BeanPostProcessor时,直接在Spring配置文件中定义这些Bean显得比较笨拙,例如: 使用@Autowired注解,必须事先在Spring容器中声明AutowiredA ...
- gitlab找回管理员密码
1.登陆后台服务器,切换git用户 su - git 2.登录GitLab的Rails控制台 gitlab-rails console production 另一种 切换root账户 执行: git ...
- Message /index.jsp (line: [17], column: [45]) The JSP specification requires that an attribute name is preceded by whitespace
Error: Message /index.jsp (line: [17], column: [45]) The JSP specification requires that an attribut ...
- 第12次抽考(GUI)
1. package week4; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextFiel ...
- python 16篇 多线程和多进程
1.概念 线程.进程 进程 一个程序,它是一组资源的集合 一个进程里面默认是有一个线程的,主线程 多进程是可以利用多核cpu的线程 最小的执行单位 线程和线程之间是互相独立的 主线程等待子线程执行结束 ...
- python使用笔记008-模块
模块的原理: 1.就是一个python文件 2.标准模块是python自带的 3.第三方模块需要自己安装 导入模块的顺序: 1.从当前目录下找 2.从python的环境变量中找 一.自己定义的模块 1 ...
- Ubuntu20.4 bs4安装的正确姿势
一.背景 公司一小伙子反馈在内网机器上通过代理,还是安装不了bs4:于是乎,作为菜鸡的我开始排查.一直认为是网络和代理问题,所以关注点一直放在网络和安装包上:在网上搜索到,主要是以下问题: 1)更新a ...
- .h .cpp区别
首先,我们可以将所有东西都放在一个.cpp文件内. 然后编译器就将这个.cpp编译成.obj,obj是什么东西? 就是编译单元了.一个程序,可以由一个编译单元组成, 也可以有多个编译单元组成. 如果你 ...







