前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >0614-5.16.1-同一OS用户并行Shell脚本中kinit不同的Principal串掉问题分析

0614-5.16.1-同一OS用户并行Shell脚本中kinit不同的Principal串掉问题分析

作者头像
Fayson
发布2019-05-13 16:50:51
2K0
发布2019-05-13 16:50:51
举报
文章被收录于专栏:Hadoop实操

温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。

Fayson的github: https://github.com/fayson/cdhproject

提示:代码块部分可以左右滑动查看噢

1

文档编写目的

在前面的文章《CDH5.15.0-同一OS用户下不同Kerberos用户执行脚本Principal串掉问题分析》中Fayson主要介绍了同一个OS用户下并发调度Python脚本时会导致Principal账号串掉,通过在Python代码中指定KRB5CCNAME环境变量解决问题,本篇文章Fayson主要介绍通过同一OS用户下并发调度Shell脚本进行不同用户Kerberos认证时Principal账号串掉问题分析及解决。

  • 测试环境

1.RedHat7.3

2.CDH5.16.1

2

问题描述

Fayson通过一段简单的shell脚本示例代码说明问题,在代码中执行kinit命令初始化Kerberos信息,通过hadoop命令去统计各自用户目录下子目录大小,具体代码如下:

a_fayson.sh脚本内容如下:

代码语言:javascript
复制
[root@cdh4 shell-test]# more a_fayson.sh 
kinit -kt /root/shell-test/fayson.keytab fayson
klist
hadoop fs -du -h /user/fayson

a_cdhadmin.sh脚本内容如下:

代码语言:javascript
复制
[root@cdh4 shell-test]# more a_cdhadmin.sh 
kinit -kt /root/shell-test/cdhadmin.fayson cdhadmin
klist
hadoop fs -du -h /user/cdhadmin

在同一个用户的OS下创建a_fayson.sh和a_cdhadmin.sh的两个shell脚本,分别使用fayson和cdhadmin用户初始化Kerberos信息。

在crontab中添加两个定时任务,使两个任务同时并发

在生成的a_fayson.log和a_cdhadmin.log中可以看到两个脚本会获取到对方的Principal信息

通过两个脚本输出的日志可以看到a_fayson.log中kinit的是fayson用户,但在执行hadoop命令的时候显示的为cdhadmin,此时Principal账号串掉导致命令执行失败。

3

问题分析

1.首先在客户端进行Kinit操作后,默认的Ticket Cache是存储在tmp/krb5cc_0临时文件中(Ticket cache文件是根据当前用户的uid在/tmp目录下生成一个以krb5cc_开头的临时文件)。

2.由于上述的两个脚本是在同一个OS用户下,所以两个不同的Kerberos用户在进行Kinit操作后都会覆盖/tmp/krb5cc_{uid}文件

根据上述两点基本可以定位问题的原因,因为Ticket cache文件被覆盖导致Kerberos的票据信息串掉。由于两个shell脚本使用了同一份Ticket cache文件导致Kerberos的票据信息串掉。

4

解决方法一

将脚本进行简单的修改,在脚本中指定KRB5CCNAME的环境变量,具体修改在shell脚本中增加如下内容:

a_fayson.sh脚本内容如下:

代码语言:javascript
复制
[root@cdh4 shell-test]# more a_fayson.sh 
export KRB5CCNAME=/tmp/fayson_ccname
kinit -kt /root/shell-test/fayson.keytab fayson
klist
hadoop fs -du -h /user/fayson

a_cdhadmin.sh脚本内容如下:

代码语言:javascript
复制
[root@cdh4 shell-test]# more a_cdhadmin.sh 
export KRB5CCNAME=/tmp/cdhadmin_ccname
kinit -kt /root/shell-test/cdhadmin.keytab cdhadmin
klist
hadoop fs -du -h /user/cdhadmin

将脚本进行如上修改后,再次运行发现问题解决,未出现Principal串掉的问题

5

解决方法二

在脚本中使用了C shell(csh)命令,C shell是一个交互式命令解释器和一种编程语言,采用的语法类型于C编程语言。在C shell中我们可以指定KRB5CCNAME环境变量,具体实现方式如下:

1.在OS命令行执行如下命令安装csh命令

代码语言:javascript
复制
[root@cdh4 shell-test]# yum -y install csh

2.修改上述的两个脚本,具体修改如下:

a.sh脚本内容如下:

代码语言:javascript
复制
[root@cdh4 shell-test]# more a.sh 
#!/usr/bin/csh

setenv KRB5CCNAME /tmp/fayson_ccname
env |grep KRB5CCNAME
kinit -kt /root/shell-test/fayson.keytab fayson
klist

hadoop fs -du -h /user/fayson

b.sh脚本内容如下:

代码语言:javascript
复制
[root@cdh4 shell-test]# more b.sh 
#!/usr/bin/csh

setenv KRB5CCNAME /tmp/cdhadmin_ccname
env |grep KRB5CCNAME
kinit -kt /root/shell-test/cdhadmin.keytab cdhadmin
klist

hadoop fs -du -h /user/cdhadmin

3.使用crontab定义两个并发的定时任务

代码语言:javascript
复制
*/1 * * * * source /etc/profile & csh /root/shell-test/a.sh >> /root/shell-test/a.log 2>&1 &
*/1 * * * * source /etc/profile & csh /root/shell-test/b.sh >> /root/shell-test/b.log 2>&1 &

4.通过修改上述两个脚本,在两个脚本中都指定KRB5CCNAME环境变量为不同的文件,再次进行测试未发现两个应用的票据信息串掉的问题。

6

总结

1.默认Ticket cache文件的生成是根据用户的uid在/tmp目录下生成一个以krb5cc_开头的缓存文件。

2.如果在同一个OS用户下使用不同的Kerberos用户进行kinit会覆盖/tmp/krb5cc_{uid}文件,从而导致应用中的票据信息串掉。

3.可以通过在shell脚本中为不同的Kerberos用户指定一个独立的Ticket cache文件,以防止票据信息串掉。

4.本篇文章中主要讲述了shell脚本的两种实现方式一种在脚本中使用export的方式指定环境变量,一种使用C shell命令通过setenv方式指定。脚本中的环境变量这里可以理解为局部环境变量,只在当前脚本内有效。

提示:代码块部分可以左右滑动查看噢

为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hadoop实操 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档