ssh-HowTo

使用ssh登陆Linux系统有两种方式:

相对于使用密码,公钥认证的方式更加安全,也方便。

基础设置

修改文件:/etc/ssh/sshd_config

设置屏蔽密码:PasswordAuthentication no

设置监听端口: Port 18888

重启sshd服务:

systemctl restart sshd

生成密钥

ssh-keygen -t rsa

# 添加一个注释,设置一个输出文件名字
ssh-keygen -t rsa -C "your comment" -f outputfile

连续敲击三次回车生成密钥至目录:~/.ssh,id_rsa.pub即是要给服务端的公钥,id_rsa是客户机保留的私钥。

如果是windows系统,则可以使用SecureCRT工具生成:工具->创建公钥,一些关键步骤是:

其余保持默认即可。

问题:秘钥登录设置后还是提示需要输入密码(密码登录未取消)

解决:可能是权限的问题,检查:服务器的 .ssh 目录权限是700, authorized_keys 的权限是600

加入公钥认证

将公钥的内容加入到文件(服务器): ~/.ssh/authorized_keys

ssh 命令

使用 ssh 登入远程主机,举例:

ssh -l root -i ~/.ssh/id_rsa 192.168.11.214 -p 18888

还可以在后面追加命令。比如:

ssh -l root -i ~/.ssh/id_rsa 192.168.11.214 -p 18888 "ps aux"

如果追加命令,那么默认不登入。还可以查询远程命令的执行结果:echo $?

如果登录不了,并提示 sign_and_send_pubkey: signing failed: agent refused operation

那么可能是开启了 ssh-agent 导致的,这时候需要把秘钥添加一下:

ssh-add private_key
ssh-add -l # 查看

ssh config

编辑 ~/.ssh/config 文件, 可以方便地执行 ssh 命令, 代替各种参数, 如:

Host txyun
    HostName 118.24.3.169
    User root
    IdentityFile ~/.ssh/Identity_dev
    Port 18888
    ServerAliveInterval 30

然后执行 ssh txyun 就可以快速地远程登录了.

ssh txyun "ps aux" 执行一个远程命令.

反向代理/访问内网

使用 ssh 进行反向代理, 使得任意一台计算机通过公网代理服务器访问内网机器.

内网机器开启反向代理:

# ssh -fCNR 远程端口:localhost:本地ssh监听端口 远程用户@远程ip -p 远程ssh端口
ssh -fCNR 7001:localhost:18888 root@118.24.3.169 -p 18888 -i ~/.ssh/Identity_dev

公网代理开启正向代理:

# ssh -fCNL *:客户端登录端口:localhost:本地端口 localhost -p 本地ssh端口
ssh -fCNL *:7002:localhost:7001 localhost -p 18888 -i ~/.ssh/Identity_dev

客户机登录:

# ssh -p 公网登录端口 内网机器用户名@公网ip地址
ssh -p 7002 diwen@118.24.3.169

客户机 config 配置:

Host *
    ServerAliveInterval 30

Host office
    HostName 118.24.3.169
    User diwen
    IdentityFile ~/.ssh/Identity_dev
    Port 7002
    ServerAliveInterval 30

保持反向代理的连接:

我的方法是令公网计算机也设置一个客户机配置,每隔一段时间发送一个 ssh 心跳包。脚本如:

#! /bin/bash

main()
{
    while true ; do
        ssh office echo "hi office"
        if [ $? ] ; then
            echo $(date)" save connect succ"
        fi
        sleep 30
    done
}

将这个脚本设置成后台运行:

nohup ./save_office_connect.sh >log_save_office_connect.txt 2>&1 &