SSH使用常见问题和技巧

一、Bad owner or permissions on .ssh/config

为了在终端免密码登录服务器,一般情况会在.ssh文件夹下面创建config文件来映射一些服务器别名,方便登录;但是创建以后,使用ssh登录远程机器时报了上面的错误。

根据错误应该是权限的问题,进行下面的处理即可

sudo chmod 600 ~/.ssh/config

详细配置:https://www.ssh.com/academy/ssh/config

二、Could not open a connection to your authentication agent

执行ssh-add时出现Could not open a connection to your authentication agent。

再执行 ssh-add ~/.ssh/id_rsa 时发生此错;

ssh-agent bash

然后再执行 ssh-add ~/.ssh/id_rsa 即可。

三、no hostkeys available—exiting

服务器上ssh服务启动不了,查看出现错误原因:

/usr/sbin/sshd -T

若输出错误存在问题:no hostkeys available—exiting,则错误原因是ssh服务器密钥出现问题。
root权限下,重新生成服务器密钥:

ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

修改密钥权限:

chmod 600 /etc/ssh/ssh_host_dsa_key
chmod 600 /etc/ssh/ssh_host_rsa_key

重启ssh服务即可。

四、跳板机直连内网机器

为了安全,我们在连接到业务服务器的时候,需要先链接到跳板机器,再通过跳板机器跳到业务机器。但是连接步骤还是比较繁琐,我们可以通过配置直接连接到目标服务器。

解决步骤:

  1. 修改.ssh/config 文件
  2. ssh-add .ssh/id_rsa
# 将本地的秘钥转发链接的机器,在跳板机的时候有用
Host *
  ForwardAgent yes
  IdentityFile ~/.ssh/id_rsa

# 配置跳板机
Host jump-server
   HostName 192.168.1.20
   Port 2202
   User username

# 目标服务器
Host target-server
  HostName 10.1.0.195
  Port 22
  User username
  ProxyCommand ssh username@jump-server -W %h:%p

上面的配置target-server是通过跳板机jump-server连接后再执行ssh 10.1.0.195才可以连接上。

现在在链接target-server的时候使用跳板机代理一下就直接过去了;

五、生成自定义文件名和备注ssh_key

生成ssh秘钥可以自定义部分字段,方便隐藏设备信息或者起别名。

ssh-keygen -t rsa -f id_rsa_other -C "otherkey"

# -f 输出的文件名称,如果不加路径,就会在当前目录生成
# -C 修改密钥的备注,在公钥字符串的最后可以看到
# ====

# 生成的公钥如下所示,后面会跟上备注
# ssh-rsa lkxjalskdjalkdjalksdj......= otherkey

六、ssh直接执行远程命令

ssh username@hostname command
ssh foo@server.example.com cat /etc/hosts

上述执行的远程命令不是交互式命令,例如要使用vim编辑远程的文件就需要加-t参数

ssh -t foo@server.example.com vim /etc/hosts

ssh-copy-id 可以拷贝本地的公钥到服务器的authorized_keys文件,就不需要手动复制了

ssh-agent和ssh-add解决私钥设置密码需要反复输入密码的问题,详细查看

七、ssh转发实现连接目标服务器内网数据库

需求:开发的时候想连接正式环境的数据库,一般是不可以的,因为正式数据库一般搭建在线上服务器的内网,或者只有线上服务器才可以访问数据库服务器。

情况如下:

  • 本地 => 数据库服务器 — 连不上
  • 线上服务器 => 数据库服务器 — 能连上

所以我们可以将线上服务器作为中转去连接数据库就可以了

本地 => 线上服务器 => 数据库服务器

现在ssh就可以使用端口转发来连接到正式数据库;详细查看「SSH端口转发」

# 举例 
# 正式数据库的链接地址是 db-server:27017
# ms 是线上服务器
# ms这个服务器可以链接db-server数据库

# 下面的命令就做了一个转发,执行之后可以了
ssh -L 27018:db-server:27017 ms -N -f

# -L 转发本地端口
# -N 不发送任何命令,只建立连接
# -f 放在后台运行

# 所以我们将本地的27018端口使用转发的方式映射到远程数据库
# 执行了上述的命令后,我们可以在客户端通过 127.0.0.1:27018 直接链接到数据库了

如果需要取消转发,在Mac或者Linux操作系统上找到对应的进程杀掉就可以了

ps aux | grep ssh

pasted-20231121111056

我们看到进程号分别是7595和8337,直接杀掉就可以了

kill 7595 8337

八、防止ssh连接一段时间不操作自动断开连接

ssh连接默认会有一个超时时间,如果用户一段时间没有操作,连接就会断开,如果我们在跑一个耗时很久的命令断开后就很麻烦。

不过可以通过修改 .ssh/config 中的配置来解决这个问题,如果修改所有连接的配置就在 Host * 下面修改,否则就在对应的配置下面修改,我一般会在 Host * 下面修改。添加下面的配置:

Host *
    # 指定是否将 TCP keepalive 发送到另一端。
    # 它们在 TCP 协议级别上运行。
    # 发送 keepalive 有助于在网络或服务器出现故障时正确关闭套接字。
    # 另一方面,如果没有它,即使网络关闭一段时间,连接也可能保持活动状态并打开任何窗口。
    TCPKeepAlive yes
    # 指定向服务器发送 keepalive 消息的时间间隔。
    # 消息通过加密通道发送,用于检测服务器是否崩溃或网络是否中断。
    # 这里的单位是秒,下面的配置是60秒发送一次消息检测
    ServerAliveInterval 60
    # 设置客户端在未从服务器接收任何消息的情况下可能发送的 keepalive 消息数。
    # 当达到此阈值时,客户端将终止会话。
    # 当和服务没有交互开始,发送的 keepalive 次数,超过次数就断开
    # 一旦和服务器进行交互,这个值会重置为0
    # 下面的配置是最多发600次消息后断开
    ServerAliveCountMax 600

以上配置,60s发一次,超过600次就断开,理论上就是能保持600分钟,即10小时。

参考: https://www.ssh.com/academy/ssh/config

留下回复