以其他用户的名义运行交互式shell脚本

时间:2010-09-02 15:34:47

标签: bash su

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

  1. 必须以不同的用户身份运行 (用户_B)。这里需要密码。
  2. 这是互动的,但不仅要求 问题,但运行另一个脚本 使用的另一个用户(user_C)的名称 苏。我必须在这里输入密码 同样。
  3. 我可以使用su来调用这个脚本但是它的问题必须以某种方式回答。我不能输入任何东西,因为它打印每个questons“stty ::不是打字机”

    我用这种方式调用特殊脚本

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

5 个答案:

答案 0 :(得分:1)

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

sudo -u user_B special_script

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

答案 1 :(得分: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 :(得分:0)

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

这样的一行:

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

允许user_A执行类似

的操作
sudo -u user_B /usr/share/stuff/ABC

没有要求密码

答案 3 :(得分:0)

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

如果您必须使用here here而不是 bona fide 脚本,请执行以下操作:

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

答案 4 :(得分:0)

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