【问题标题】:Running interactive shell script in name of other user以其他用户的名义运行交互式 shell 脚本
【发布时间】:2010-09-02 15:34:46
【问题描述】:

在我的 shell 脚本 (bash) 中,我想调用其他 shell 脚本。
我以 user_A 身份运行我的脚本。 这些脚本之一需要特殊处理:

  1. 它必须以不同的用户身份运行 (用户_B)。此处需要密码。
  2. 它是交互式的,但不仅仅是询问 问题,但运行另一个脚本 另一个用户的名称 (user_C) 使用 苏。我必须在这里输入密码 也一样。

我可以使用 su 调用这个脚本,但它的问题必须以某种方式回答。我无法输入任何内容,因为它会为每个问题打印“stty: : Not a typewriter”

我是这样调用特殊脚本的

su user_B << ABC
...
special_script
...
ABC

【问题讨论】:

    标签: bash su


    【解决方案1】:
    #!/bin/bash
    
    main_for_root(){
        :
    }
    # ------------------------------------------------------------------------------
    abs_path="$(readlink -f `dirname $0`)/$(basename $0)"
    
    # if [ `id -u` != 0 ] ; then
    if [ `whoami` != 'root' ] ; then
        echo "[su -] run as root"
        su -c"/bin/bash $abs_path $@"
        exit 0
    else
        main_for_root $@
    fi
    

    它适用于 1 个用户,所以现在为第二个用户添加 'if ...'

    【讨论】:

      【解决方案2】:

      另一个以其他用户身份运行脚本的选项是“sudo”命令,出于可读性目的,将其视为“超级用户 do:”。 -u 参数提供用户名信息。所以:

      sudo -u user_B special_script

      将提示输入 user_B 的密码。我从来没有遇到过使用它运行交互式程序的问题。您可以通过 visudo 命令管理谁可以向谁发送 sudo。

      【讨论】:

        【解决方案3】:

        您可以使用 sudo 并创建一个允许 user_A 以 user_B 身份运行脚本的 sudoers 文件。

        一行:

        user_A      ALL = (user_B) NOPASSWD: /usr/share/stuff/ABC
        

        将允许 user_A 做类似的事情

        sudo -u user_B /usr/share/stuff/ABC
        

        无需输入密码

        【讨论】:

          【解决方案4】:

          su 尝试从终端获取密码并需要一个 tty 设备,以便它可以调用 ioctl 以关闭密钥回显。由于标准输入来自“here document”(ABC),因此尝试在文件描述符 0 上调用 ioctl 会产生“not a tty”。

          如果您必须使用此处的文档而不是 真正的 脚本,请执行以下操作:

          cat > /tmp/myscript.$$ <<ABC
          #!/bin/sh
          ...
          ABC
          chmod +x /tmp/myscript.$$
          sudo -u user_B /tmp/myscript.$$
          

          【讨论】:

            【解决方案5】:

            您可能想使用expect。它专为脚本交互而设计。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-07-11
              • 1970-01-01
              • 2016-05-27
              • 2013-06-19
              • 2019-09-18
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多