我在 (centos6) 中创建了一个脚本/etc/profile.d
,它与 puppet 没有任何关系,它只是将一些文件复制到用户目录。不知何故,在 puppet 企业主服务器上,此脚本干扰了服务pe-postgresql
,导致服务器启动延迟,并且不会让该服务运行。
此配置文件脚本具有一项功能,如果找不到其中一个文件,它会在用户登录时提示用户并询问他们是否要安装 (y,n)。我怀疑这是在某个地方启动 puppet 服务时在后台发生的,导致该服务失败。
#/etc/profile.d/custom.sh
if [ ! f ~/.custom ]; then
logPrompted;
while true; do
read -p "Do you want to install?)" yn
case $yn in
[Yy]* )
installCustom;
break;;
[Nn]* )
logOptedOut;
break;;
* ) echo "Please enter y or n!";;
esac
done
fi
一旦将文件移出/etc/profile.d
,问题就会停止。sudo service pe-postgresql start
每次使用该脚本时,Eg 都会失败。
当我看到傀儡用户时,cat /etc/passwd | grep pe-
我可以验证他们都是nologin
。
这里要么是我遗漏了什么东西,要么是我遗漏了另一个傀儡服务用户。可能是交互式的。
logPrompted
在提出问题之前,我通过报告添加了每次运行时的日志记录以查看其运行时间( ) $(whoami)
,希望能够发现隐藏的用户,并且在日志中我确实看到pe-postgres
每次“我”尝试重新启动服务时都会记录日志,但这并不一致。
查看 /etc/passwd 该用户是pe-postgres:x:492:493:Puppet Enterprise PostgreSQL Server:/opt/puppet/var/lib/pgsql:/sbin/nologin
我试图弄清楚如何避免该用户或任何nologin
用户与该配置文件脚本进行交互。
我是否需要在 profile.d 脚本的开头添加一些内容来保护它免受此类事情的影响?
答案1
仅当 shell 是交互式时,提示才有意义。(您不希望它们干扰 SFTP 连接等...)要检查交互性,您有两个选择:
测试是否
$-
包含字母i
。case $- in *i*) <do your prompts>;; *) return;; esac
或者:
if ! case $- in *i*) false; esac; then <do your prompting> fi
用于
[ -t 0 ]
测试标准输入(文件描述符#0)是一个终端:if [ ! -t 0 ]; then return fi
或者:
if test -t 0; then <do prompts here> fi
(由于您的脚本是由父脚本“获取”的,因此return
允许调用外部函数并将其返回到父脚本。这使您可以避免额外的缩进级别。)
第二种方法(检查标准输入)没有实际上测试交互性——例如,sh -l -c "some command"
通过终端运行时仍会通过测试。但它在许多情况下仍然有效,因为服务和 SFTP 连接没有分配终端。