生成密钥
cd ~/.ssh
ssh-keygen -t rsa
配置远程主机
vim ~/.ssh/config
Host pdev
User user00
HostName 192.168.13.220
Port 8888
PubkeyAuthentication yes
IdentityFile /Users/xxxx/.ssh/id_rsa
拷贝公钥到远程主机上
查看本地公钥
cat id_rsa.pub
复制到远程linux机器的~/.ssh/authorized_keys文件里面
修改目录和文件的权限:
.ssh目录的权限必须是700
.ssh/authorized_keys文件权限必须是600
重启ssh服务
service sshd restart
如果还是提示输入密码 关闭 selinux
临时关闭
setenforce 0
永久关闭
修改/etc/selinux/config 文件
将SELINUX=enforcing改为SELINUX=disabled
进行免密登陆
可以通过~/.ssh/config中配置的Host名字直接免密登陆
ssh pdev
代理ssh端口
大部分情况下,开发机都会对端口进行访问限制,只允许访问8000-9000端口,这时候,可以自己在8000-9000开一个tcp代理,代理到22端口,方便本地机器进行免密登陆。
package main
import (
"fmt"
"io"
"net"
)
func main() {
server()
}
func server() {
lis, err := net.Listen("tcp", "192.168.13.220:8888")
if err != nil {
fmt.Println(err)
return
}
defer lis.Close()
for {
conn, err := lis.Accept()
if err != nil {
fmt.Printf("建立连接错误:%+v\n", err)
continue
}
fmt.Println(conn.RemoteAddr(), conn.LocalAddr())
go handle(conn)
}
}
func handle(sconn net.Conn) {
defer sconn.Close()
dconn, err := net.Dial("tcp", "192.168.13.220:22")
if err != nil {
fmt.Printf("连接失败:\n")
return
}
ExitChan := make(chan bool, 1)
go func(sconn net.Conn, dconn net.Conn, Exit chan bool) {
//会一直读到eof或者其他err,网络fd会一直可读,所以,只要客户端不退出,这里会一直执行
_, err := io.Copy(dconn, sconn)
fmt.Printf("往发送数据失败:%+v\n", err)
ExitChan