/etc/profile.d 脚本干扰服务启动,并在重启后大大延迟 ssh 可用性

/etc/profile.d 脚本干扰服务启动,并在重启后大大延迟 ssh 可用性

我在 (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 连接没有分配终端。

相关内容