1

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

  1. 它必须以不同的用户 (user_B) 身份运行。这里需要密码。
  2. 它是交互式的,但不仅提出问题,而且使用 su 以另一个用户 (user_C) 的名义运行另一个脚本。我也必须在这里输入密码。

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

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

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

5 回答 5

1

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

sudo -u user_B special_script

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

于 2010-09-02T15:40:35.120 回答
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 ...'

于 2010-09-02T18:16:55.163 回答
0

您可以使用 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

无需输入密码

于 2010-09-02T15:43:22.833 回答
0

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.$$
于 2010-09-02T15:45:57.570 回答
0

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

于 2010-09-02T16:31:25.857 回答