一.引子
最近在忙大创项目,在折腾hadoop的过程中免不了需要创建一个新用户并配置ssh免密登陆,然而这个看起来简单得不能再简单的地方我也栽了个跟头,真的尴尬,不过还是记下来吧,希望其他碰到问题的人能顺利解决。
二.情况复现
那么到底发生了啥,请容我娓娓道来,因为我要把用户创建和配置全部写到脚本里,所以我期望做到的是尽可能少的交互操作,更接近无人值守式配置。
①.需要给新创建的用户hadoop赋予root权限。这个如果是交互式操作那很方便了,直接visudo然后按照root的权限格式添加hadoop就行,但是非交互式就需要直接操作/etc/sudoers文件了,我选择的是使用sed命令插入,虽然echo貌似也行,但不能准确插入到指定行,所以作为半个强迫症我果断放弃,那么问题来了,怎么获取目标行号?这就需要一套组合拳
cat -n /etc/sudoers|grep ALL=|grep root|awk '{print $1}
这条命令便能输出"root ALL=(ALL) ALL"这行的行号,我们的目标便是在它的下一行插入"hadoop ALL=(ALL) ALL",所以我们需要
sed -i "行数 ahadoop\tALL=(ALL)\tALL" /etc/sudoers
这里我一开始没加"a"(ahadoop前那个),然后试了半天各种报错……这个是after的意思,即为在指定行数之后,还有个"i"是之前。把这两条命令合并便是如下
SULINE=`cat -n /etc/sudoers|grep ALL=|grep root|awk '{print $1}'` sed -i "${SULINE} ahadoop\tALL=(ALL)\tALL" /etc/sudoers
OK,这个问题便解决了。
②.ssh-keygen能够生成用于ssh登陆的公钥和私钥,但默认是交互式操作,我搜了下找到了它的非交互式操作
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
需要注意的是单引号中间啥都不要有,这样私钥才是不加密的,然后问题就来了,在我
cat id_rsa.pub >> authorized_keys chmod 600 ./authorized_keys
后本地登陆依旧提示需要密码,这就很尴尬,多次失败之后我去翻阅了ssh日志
Sep 18 15:22:56 localhost su: pam_unix(su:session): session opened for user hadoop by root(uid=0) Sep 18 15:23:43 localhost sshd[28884]: Authentication refused: bad ownership or modes for directory /home/hadoop/.ssh Sep 18 15:23:45 localhost sshd[28894]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=127.0.0.1 user=hadoop Sep 18 15:23:46 localhost sshd[28884]: error: PAM: Authentication failure for hadoop from 127.0.0.1 Sep 18 15:23:47 localhost sshd[28885]: Connection closed by 127.0.0.1
发现第二行提示 /home/hadoop/.ssh 文件夹的权限貌似有问题,于是我去查了下,发现这是ssh默认安全机制的问题,用如下命令
chmod 700 /home/hadoop/.ssh
修改了下权限然后便啥问题都没有了
文章评论