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

留下回复