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服务即可。
四、跳板机直连内网机器
为了安全,我们在连接到业务服务器的时候,需要先链接到跳板机器,再通过跳板机器跳到业务机器。但是连接步骤还是比较繁琐,我们可以通过配置直接连接到目标服务器。
解决步骤:
- 修改.ssh/config 文件
- 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
我们看到进程号分别是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
九、不同的服务器使用使用不同的密钥连接
默认情况下,ssh都是通过 $HOME/.ssh/id_rsa 及对应的公钥和服务器通信的,如果想在不同的服务器之间使用不同的公钥,可以进行下面的配置
Host myserver
HostName 192.168.2.10
User root
# 需要在当前服务器上添加id_rsa_other.pub而不是id_rsa.pub
IdentityFile ~/.ssh/id_rsa_other