Linux Centos 服务器免密验证(ansible版/非root用户)

简介: Ansible中,-k或--ask-pass选项用于提示输入SSH密码。这在你需要通过SSH连接到目标主机,但又没有设置SSH密钥对的情况下非常有用。使用-k选项后,Ansible将在执行playbook或命令时提示你输入SSH密码。

Ansible中,-k或--ask-pass选项用于提示输入SSH密码。这在你需要通过SSH连接到目标主机,但又没有设置SSH密钥对的情况下非常有用。使用-k选项后,Ansible将在执行playbook或命令时提示你输入SSH密码。


在使用ansible的时候会遇到如果不加 -k( 通过key验证)这个参数时认证失败。

20200430223120743.png可以通过 ssh-keygen - > ssh-copy-id [-i [identity_file]] [user@]machine 把操作机的私钥添加到目标主机的密钥列表中。

ssh]# ssh-copy-id -i /root/.ssh/id_rsa.pub  root@10.50.**.**
root@10.50.10.**'s password:
Now try logging into the machine, with "ssh 'root@10.50.**.1*'", and check in:
  .ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
 .ssh]# ssh 10.50.10.161
Last login: Mon May 24 10:19:54 2021 from 10.56.**.**

20200430223251696.png需求 :A 主机想通过shh 、scp...等通过ssh协议连接主机的命令来连接B主机,但是不想输入密码。


具体操作:

1、ssh-keygen  用这个命令是用来生成本机的公钥和私钥的

2、将A主机的id_rsa.pub copy到B主机上

ansible gpservers -m copy -a 'src=/root/.ssh/id_rsa.pub dest=/root/.ssh/' -k

3、在B主机2中的的id_rsa.pub 重定向到B主机的authorized_keys(一个信任主机列表)。注意一点要用 >> 追加,以免覆盖掉其他的密钥验证。造成其他程序报错。这点很重要

ansible gpservers -m copy -a 'src=/root/.ssh/id_rsa.pub dest=/root/.ssh/' -k

以上2 、3两步可以用ssh-copy-id(会自动将第一步中生成的id_rsa.pub添加到目标主机的authorized_keys中。) 命令来实现。如果是多个主机需要一个一个执行,用ansible批量操作还是较快。


如果需要相互信任,只需要将如上步骤逆向进行即可。


需要用到ansible的fetch模块。


1、现将gpserver的18台机器上的公钥fetch到控制机

注意fetch 回来是不会被覆盖的,fetch回来的文件是放在以ip命名的一个文件夹里面

2、重定向。


------------------------------update 2020年5月24日21:38:15--------------------------------


如若是非root用于,别于root的用户的就是需要对authorized_keys 赋权。


默认是664

ssh]$ ll
total 16
-rw-rw-r-- 1 gpadmin gpadmin  796 May 24 21:35 authorized_keys
-rw------- 1 gpadmin gpadmin 1675 May 24 21:17 id_rsa
-rw-r--r-- 1 gpadmin gpadmin  398 May 24 21:17 id_rsa.pub
-rw-r--r-- 1 gpadmin gpadmin  403 May 22 22:00 known_hosts

非root用户ssh 自己需要710权限。这一点容易忽视,请注意

ssh]$ ll
total 16
-rwx--x--- 1 gpadmin gpadmin  796 May 24 21:35 authorized_keys
-rw------- 1 gpadmin gpadmin 1675 May 24 21:17 id_rsa
-rw-r--r-- 1 gpadmin gpadmin  398 May 24 21:17 id_rsa.pub
-rw-r--r-- 1 gpadmin gpadmin  403 May 22 22:00 known_hosts

20210412092243497.png如果希望ssh公钥生效需满足至少下面两个条件:

    1) .ssh目录的权限必须是700

     2) .ssh/authorized_keys文件权限必须是600


---------------update 2021年7月28日16:47:52


在建立hadoop集群时,做免密验证时有如下报错


centos7

 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub hadoop102
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

这个配置需要修改

1. /etc/ssh/sshd_config
2. PasswordAuthentication yes
~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.56.12
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.56.12's password:
Number of key(s) added: 1
Now try logging into the machine, with:   "ssh '192.168.56.12'"
and check to make sure that only the key(s) you wanted were added.
[root@hadoop100 ~]#
[root@hadoop100 ~]#
[root@hadoop100 ~]# ssh hadoop102
Last login: Wed Jul 28 07:57:20 2021 from 192.168.56.12
[root@hadoop102 ~]# exit

--update 2022年1月16日22:59:00

使用expect 多进程完成免密验证

注意点:

1. ip.txt 中的内容

192.168.56.11 ninesun0318 
192.168.56.12 ninesun0318
8.142.104.169 ro....

2. expect交互那块,根据实际情况修改

注意EOF 时不要随意敲空格,一定要用table键,send完消息之后一定要使用\r 回车。

  • spawn:触发,执行命令
  • expect:识别输出
  • send:发送信息
#!/bin/bash
# 2022年1月16日22:10:51
# ninesun
while read ip;do
#判断当前主机上是否有共要文件
if [ ! -f ~/.ssh/id_rsa ];then
        ssh-keygen -P "" -f ~/.ssh/id_rsa
fi
#从文件中ip 和密码
ipaddr=`echo $ip | awk '{print $1}'`
passwd=`echo $ip | awk '{print $2}'`
echo "$ipaddr"
echo "$passwd"
#判断是否可以ping通
{
ping -c1 -W1 $ipaddr >&/dev/null
if [ $? -eq 0 ];then
        /usr/bin/expect <<-EOF
        set timeout 10
        spawn ssh-copy-id  $ipaddr
        expect {
                #"yes/no" { send "yes\r"; exp_continue }
                "password:" { send "$passwd\r" }
        }
        expect eof
        EOF
fi
}&
done <ip.txt
wait
echo "all finished"

--update

2022年5月30日15:49:18

#!/bin/bash
# Copyright 2018 Xiak.com.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
##########################################
# 脚本用法
# passwordless.sh 192.168.1.5,192.168.1.6,192.168.1.7 your-cluster-password
# 参数说明:
#   总共两个参数,参数之间用空格隔开
#   第一个参数定义了集群的IP地址,IP之间用逗号隔开
#   第二个参数为所有集群的密码
##########################################
# 脚本只要发生错误,就终止执行
set -o errexit
# 遇到不存在的变量就会报错,并停止执行
set -o nounset
# 只要一个子命令失败,整个管道命令就失败,脚本就会终止执行
set -o pipefail
# 工作目录
root_dir="/xiak/k8s"
# 生成的 cert 文件存放目录
cert_dir="$root_dir/cert"
hosts="${HOSTS:="${1}"}"
password="${2}"
# 工具 expect
if ! (hash expect) >/dev/null 2>&1; then
    echo "=== expect command not found: Aborting ===" 1>&2
    exit 2
fi
if ! (hash ssh-copy-id) >/dev/null 2>&1; then
    echo "=== ssh-copy-id command not found: Aborting ===" 1>&2
    exit 2
fi
##########################################
# Function: SshKeyGen()
# Usage:    SshKeyGen
# Params:   Null
# Comments: 生成 id_rsa id_rsa.pub
##########################################
SshKeyGen() {
    # Delete old id_rsa
    rm -f ~/.ssh/id_rsa
    rm -f ~/.ssh/id_rsa.pub
    # Generate new id_rsa.pub
    expect -c "
        set timeout -1;
        spawn ssh-keygen -t rsa;
        expect {
            */root/.ssh/id_rsa* {send -- \r;exp_continue;}
            *passphrase):*      {send -- \r;exp_continue;}
            *again:*            {send -- \r;exp_continue;}
            eof                 {exit 0;}
        };"
}
##########################################
# Function: SshKeyGen()
# Usage:    SshKeyGen 192.168.1.2,192.168.1.3 password
# Params:
#   $1 主机列表,主机之间以逗号分隔,不能有空格
#   $2 主机的密码
# Comments:
#   1. 生成 id_rsa id_rsa.pub
#   2. 免密登录
##########################################
SshWithoutAuth() {
    SshKeyGen
    IFS=',' read -ra host_array <<< "${1}"
    for host in "${host_array[@]}";
    do
        echo "ssh-copy-id to $host"
        expect -c "set timeout -1;
            spawn ssh-copy-id $host;
            expect {
                *(yes/no)* {send -- yes\r;exp_continue;}
                *assword:* {send -- ${2}\r;exp_continue;}
                eof        {exit 0;}
            }" >/dev/null 2>&1;
    done
}
SshWithoutAuth ${hosts} ${password}
echo "All tasks done!"

-- update 2022年7月15日13:36:57

# 在control_node节点上生成密钥对
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ''
for host in 192.168.200.{27..33};do
  # 将各节点的主机信息(host key)写入control_node的
  # `~/.ssh/known_hosts`文件
  ssh-keyscan $host >>~/.ssh/known_hosts 2>/dev/null
  # 将control_node上的ssh公钥分发给各节点:
  sshpass -p'123456' ssh-copy-id root@$host &>/dev/null
done
相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
目录
相关文章
|
2月前
|
NoSQL Linux Redis
在 centos7 下重启/开启 redis 服务器
本文提供了一种在Centos 7操作系统下如何重启Redis服务器的步骤,包括停止Redis服务、确认停止成功以及重新启动Redis服务。
148 2
在 centos7 下重启/开启 redis 服务器
|
2月前
|
存储 网络协议 Linux
AWS实操-EC2-创建购买linux(centos)EC2服务器
AWS实操-EC2-创建购买linux(centos)EC2服务器
|
2月前
|
弹性计算 关系型数据库 MySQL
CentOS 7.x操作系统的ECS云服务器上搭建WordPress网站
CentOS 7.x操作系统的ECS云服务器上搭建WordPress网站
|
2月前
|
Linux 数据安全/隐私保护 Windows
centos 7.2 搭建svn服务器
centos 7.2 搭建svn服务器
53 0
|
4月前
|
安全 关系型数据库 MySQL
在Linux中,如何重置 mysql root 密码?
在Linux中,如何重置 mysql root 密码?
|
4月前
|
安全 Linux 数据安全/隐私保护
驾驭Linux的权力:Root与Sudo
在 Linux 系统中,权限管理至关重要,Root 用户与 Sudo 命令为核心组件。Root 作为超级用户,拥有最高权限,可执行任意命令,但也带来较高安全风险,建议仅在必要时使用。Sudo 则允许系统管理员授予普通用户临时的 Root 权限以执行特定命令,提升了系统的安全性和管理灵活性。通过合理配置 Sudoers 文件,可以实现对用户权限的精细化管理。综合运用 Root 和 Sudo 可确保系统的安全稳定运行。
77 1
|
4月前
|
网络协议 Linux Shell
【Azure 应用服务】App Service For Linux 中安装paping, 用于验证从App Service向外请求的网络连通性
【Azure 应用服务】App Service For Linux 中安装paping, 用于验证从App Service向外请求的网络连通性
|
4月前
|
监控 安全 Linux
在Linux中,什么是 root 帐户?
在Linux中,什么是 root 帐户?
|
4月前
|
安全 Linux 数据安全/隐私保护
Linux安全大揭秘:一键切换root权限背后隐藏的秘密
【8月更文挑战第23天】Linux操作系统因其出色的灵活性和安全性备受推崇,用户权限管理是其核心功能之一。本文介绍如何安全地在用户间切换,特别是切换至拥有最高权限的root用户。我们探讨了两种主要的方法:`su` 和 `sudo` 命令,并通过示例展示了它们的应用场景。`su` 命令适合需要执行多个root权限操作的情况,而 `sudo` 更适用于临时执行单个高权限命令。同时,文章还提供了一些最佳实践,如避免长时间使用root账户、定期审查 `sudoers` 文件等,以确保系统的安全性。正确理解和应用这些工具和原则对于维护Linux系统的安全至关重要。
59 0
|
12天前
|
人工智能 弹性计算 编解码
阿里云GPU云服务器性能、应用场景及收费标准和活动价格参考
GPU云服务器作为阿里云提供的一种高性能计算服务,通过结合GPU与CPU的计算能力,为用户在人工智能、高性能计算等领域提供了强大的支持。其具备覆盖范围广、超强计算能力、网络性能出色等优势,且计费方式灵活多样,能够满足不同用户的需求。目前用户购买阿里云gpu云服务器gn5 规格族(P100-16G)、gn6i 规格族(T4-16G)、gn6v 规格族(V100-16G)有优惠,本文为大家详细介绍阿里云gpu云服务器的相关性能及收费标准与最新活动价格情况,以供参考和选择。