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