重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
使用 SSH 登录服务器有两种方法: 用户账号登录 和 使用公钥登录
创新互联公司长期为上1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为城北企业提供专业的网站设计、网站制作,城北网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制开发。
直接使用以下命令
另外可以配置主机别名,这个和 使用公钥登录 差不多,区别是无需指定公钥地址而已,这里就不重复了。
方法一:(在命令行中指定私钥文件)
方法二:(使用 ssh-agent 代理)
方法三:(在 SSH 配置中指定私钥文件)
使用跳板机登录的方法在我看来不算其它登录方式,它用到的还是本章的内容。
如果我把这三种方法都用了呢?即既使用了 -i ~/.ssh/id_rsa_server ,又使用了 ssh-agent ssh-add ~/.ssh/id_rsa_server ,还使用了域名主机配置 IdentityFile ~/.ssh/id_rsa 。
答案很简单,SSH 会先使用 -i ~/.ssh/id_rsa_server ,如果登录失败,则使用 ssh-agent ssh-add ~/.ssh/id_rsa_server ,找不到合适的公钥的话,再使用 IdentityFile ~/.ssh/id_rsa ,还是失败的话则提示输入密码,如果允许账号登录的话,否则整个登录失败。
教你如何通过ssh控制远程主机,远程执行命令ssh控制远程主机远程执行命令这个分两步,很简单很实用。第一步,设置ssh免认证,免认证就是只不用密码认证就可以直接登录,这在写脚本服务器控制时特别有用。每二步,就是到远端服务器上去执行命令
假如现在有两个服务器,一个叫SA,另一个叫SB。现在我要在SA上去控制SB。
格式:ssh
SB_用户名@SB_IP
命令for
example:ssh
tuxedo@172.16.18.54
echo
aaahzs_test.txtssh
tuxedo@172.16.18.54
'echo
-e
haha/n
hoho
hzs_test.txt'
一般命令
所谓一般命令,就是在一定时间内会执行完的命令。比如 grep, cat 等等。 执行命令的步骤是:连接,执行,获取结果
连接
连接包含了认证,可以使用 password 或者 sshkey 2种方式来认证。下面的示例为了简单,使用了密码认证的方式来完成连接。
import (
"fmt"
"time"
"golang.org/x/crypto/ssh"
)
func connect(user, password, host string, port int) (*ssh.Session, error) {
var (
auth []ssh.AuthMethod
addr string
clientConfig *ssh.ClientConfig
client *ssh.Client
session *ssh.Session
err error
)
// get auth method
auth = make([]ssh.AuthMethod, 0)
auth = append(auth, ssh.Password(password))
clientConfig = ssh.ClientConfig{
User: user,
Auth: auth,
Timeout: 30 * time.Second,
}
// connet to ssh
addr = fmt.Sprintf("%s:%d", host, port)
if client, err = ssh.Dial("tcp", addr, clientConfig); err != nil {
return nil, err
}
// create session
if session, err = client.NewSession(); err != nil {
return nil, err
}
return session, nil
}
连接的方法很简单,只要提供登录主机的 用户*, *密码*, *主机名或者IP*, *SSH端口
执行,命令获取结果
连接成功后,执行命令很简单
import (
"fmt"
"log"
"os"
"time"
"golang.org/x/crypto/ssh"
)
func main() {
session, err := connect("root", "xxxxx", "127.0.0.1", 22)
if err != nil {
log.Fatal(err)
}
defer session.Close()
session.Run("ls /; ls /abc")
}
上面代码运行之后,虽然命令正常执行了,但是没有正常输出的结果,也没有异常输出的结果。 要想显示结果,需要将 session 的 Stdout 和 Stderr 重定向 修改 func main 为如下:
func main() {
session, err := connect("root", "xxxxx", "127.0.0.1", 22)
if err != nil {
log.Fatal(err)
}
defer session.Close()
session.Stdout = os.Stdout
session.Stderr = os.Stderr
session.Run("ls /; ls /abc")
}
这样就能在屏幕上显示正常,异常的信息了。
交互式命令
上面的方式无法远程执行交互式命令,比如 top , 远程编辑一个文件,比如 vi /etc/nginx/nginx.conf 如果要支持交互式的命令,需要当前的terminal来接管远程的 PTY。
func main() {
session, err := connect("root", "olordjesus", "dockers.iotalabs.io", 2210)
if err != nil {
log.Fatal(err)
}
defer session.Close()
fd := int(os.Stdin.Fd())
oldState, err := terminal.MakeRaw(fd)
if err != nil {
panic(err)
}
defer terminal.Restore(fd, oldState)
// excute command
session.Stdout = os.Stdout
session.Stderr = os.Stderr
session.Stdin = os.Stdin
termWidth, termHeight, err := terminal.GetSize(fd)
if err != nil {
panic(err)
}
// Set up terminal modes
modes := ssh.TerminalModes{
ssh.ECHO: 1, // enable echoing
ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud
ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud
}
// Request pseudo terminal
if err := session.RequestPty("xterm-256color", termHeight, termWidth, modes); err != nil {
log.Fatal(err)
}
session.Run("top")
}
golang SSH客户端系列文章目录
SSH(Secure Shell)协议在远程登录时比较常用,但是除此之外还有一些其它的功能也很好用,比如端口映射,X11转发,sftp文件传输等。
以下三篇文章将介绍golang版SSH的远程登录功能,端口映射功能及sftp文件传输功能。X11包含GUI的一些操作,没有找到相关的包,故不做介绍
通过golang自带的ssh包 golang.org/x/crypto/ssh 可以实现远程登录功能, 默认是不支持tab键和上下箭头的 ,
通过导入golang.org/x/crypto/ssh/terminal来创建VT100终端可以支持tab等功能,让golang版本的ssh客户端体验和平时用的其它客户端差不多。