记一次ssh生成密钥,配置无密码访问的问题

前几天遇到的令人无语的问题,当时忘了记录,这里记录下。
那天想要实验k8s的环境,装了三台虚拟机,用其中一台访问另两台。
为了方便,想配置无密码访问,此为前提。
老生常谈:

# 生成
ssh-keygen -t rsa -f '/root/.ssh/k8s_rsa'
# 传输
ssh-copy-id -i ~/.ssh/k8s_rsa.pub -p 22 root@node01
ssh-copy-id -i ~/.ssh/k8s_rsa.pub -p 22 root@node02
ssh-copy-id -i ~/.ssh/k8s_rsa.pub -p 22 root@master

# ssh node01

what?!还要输密码,不是吧,这么简单的操作都搞不好?!
开始寻找解决办法

# 查看sshd的系统日志
journalctl --unit=sshd

#就是正常的
823 15:06:10 taosd systemd[1]: Starting OpenSSH server daemon...
823 15:06:10 taosd sshd[1144]: Server listening on 0.0.0.0 port 22.
823 15:06:10 taosd sshd[1144]: Server listening on :: port 22.
823 15:06:10 taosd systemd[1]: Started OpenSSH server daemon.
823 15:10:51 taosd sshd[14972]: Accepted password for upc from 192.168.1.24 port 49335 ssh2
823 15:10:51 taosd sshd[14972]: pam_unix(sshd:session): session opened for user upc(uid=1000) by (uid=0)
823 15:10:52 taosd sshd[14974]: Accepted password for upc from 192.168.1.24 port 49336 ssh2
# 没有百度说的这种日志
Authentication refused: bad ownership or modes for file /home/admin/.ssh/authorized_
# 是说.ssh 目录权限设置有异常,我是新装的虚拟机,不会有这种问题吧··,查看了目录权限,正常啊
# 但是以防万一,还是运行一下
cd .ssh
chmod 700 ../
chmod 700 .
chmod 600 authorized_keys

再来

# 客户端调试
ssh -vvv user@ip
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
debug1: Reading configuration data /root/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 58: Applying options for *
debug2: resolving "node01" port 22
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to node01 [192.168.56.107] port 22.
debug1: Connection established.
debug1: permanently_set_uid: 0/0
debug1: identity file /root/.ssh/id_rsa type 1
debug1: key_load_public: No such file or directory
debug1: identity file /root/.ssh/id_rsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /root/.ssh/id_dsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /root/.ssh/id_dsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /root/.ssh/id_ecdsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /root/.ssh/id_ecdsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /root/.ssh/id_ed25519 type -1
debug1: key_load_public: No such file or directory
debug1: identity file /root/.ssh/id_ed25519-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_7.4
debug1: Remote protocol version 2.0, remote software version OpenSSH_7.4
debug1: match: OpenSSH_7.4 pat OpenSSH* compat 0x04000000
debug2: fd 3 setting O_NONBLOCK


看见了吗? identity file /root/.ssh/id_rsa
ssh-keygen 默认是生成的id_rsa,很遗憾,当时我为了装B,指定了生成的私钥名字,ssh-keygen -t rsa -f ‘/root/.ssh/k8s_rsa’,所以ssh 不认识我自己生成的私钥。啊 问题找到了,那就好说了。怎么让ssh 识别我的私钥呢

# 可以这样指定
ssh node01 -i /root/.ssh/k8s_rsa

但这不是办法,我不能每次都加-i ,当然可以alias,但这绝不是最终的答案。
继续检索
找到这位大神
https://blog.csdn.net/weixin_43364556/article/details/123281962

#ssh-agent激活,ssh-agent是验证公钥私钥对的执行者。ssh-agent可以记录不同的公钥私钥对的密码,可以避免多次输入密码。
#启动
eval $(ssh-agent -s)
#上面的命令也可以转换为ssh-agent $SHELL来启动agent。
#将私钥添加到agent的代理范围内,这样可以避免多次输入密码
ssh-add  ~/.ssh/ssh_rsa
#上面语句中用的是私钥
#可以通过ssh-add -l来查询已经被代理的秘钥,注:虽然有时候我的显示为空,但是不影响公钥和私钥的使用

但是这样每次退出shell, ssh-agent会停止,再连接就会

[root@master ~]# ssh-add
Could not open a connection to your authentication agent.

第二个方法:

#当需要为不同的仓库或者服务器设置不同的秘钥的时候可以参考这里,比如github仓库,gitlab仓库等,这里说的仓库指的是一个域名对应一个仓库,比如github.com,gitlab.com,不过一个仓库可以对应多个秘钥对。
#设置密钥对的时候需要用~/.ssh/config文件,设置的格式如下
Host gitlab.xtalpi.xyz
    HostName gitlab.xtalpi.xyz
    User xuezhe.fan
    IdentityFile /data/personal/fanxuezhe/.ssh/gitlab_company
#Host之后为自己定义的仓库名(自定义即可)
#HostName之后给定的是仓库的域名或者公网IP
#User指定仓库对应的用户名
#IdentityFile指定的是私钥文件的绝对路径

这个方法我也试了,连接的时候确实会读取config

[root@master ~]# ssh -vvv node01
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
debug1: Reading configuration data /root/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 58: Applying options for *
debug2: resolving "node01" port 22
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to node01 [192.168.56.107] port 22.

但是还是要输入密码
想想 想想
想什么想 百度
好吧,最后找到一个帖子
https://qa.1r1g.com/sf/ask/1321601711/
希望能帮到大家
最后的解决方案:


# .bash_profile 添加
exec ssh-agent $BASH -s 10<&0 << EOF
    ssh-add ~/.ssh/your_key1.rsa \
            ~/.ssh/your_key2.rsa &> /dev/null
    exec $BASH <&10-
EOF

还有一些有趣的解决方案:

# 安装keychain
sudo apt-get install keychain
nano  ~/.bashrc
eval $(keychain --eval id_rsa)

还有创建systemd用户服务的

nano ~/.config/systemd/user/ssh-agent.service

[Unit]
Description=SSH key agent

[Service]
Type=forking
Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
ExecStart=/usr/bin/ssh-agent -a $SSH_AUTH_SOCK

[Install]
WantedBy=default.target

#安装shell以获得socket(.bash_profile, .zshrc, ...)的环境变量:
export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"

#启用该服务,因此它将在登录时自动启动,并启动它:
systemctl --user enable ssh-agent
systemctl --user start ssh-agent

#将以下配置设置添加到ssh配置文件~/.ssh/config(这可以从SSH 7.2开始):
AddKeysToAgent  yes
#这将指示ssh客户端始终将密钥添加到正在运行的代理,因此不需要事先ssh-add.

你可能感兴趣的:(运维,ssh,运维)