在我shell script(bash)我想呼吁其他外壳脚本。
我跑我的剧本作为user_A.这些脚本需要特别处理:

  1. 它已被作为不同用户运行 (user_B).密码在这里需要。
  2. 它是互动的,但不是唯一的要求 的问题,但是运行的另一个脚本 另一名用户(user_C)使用 su。我需要输入密码在这里 为好。

我可以用苏打这个电脚本,但它问题有待回答。我不能进入任何东西,因为它打印的每个questons"stty::不是一个打字机"

我要特别的脚本,这种方式

su user_B << ABC
...
special_script
...
ABC
有帮助吗?

解决方案

#!/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个用户,因此现在增加,如果...'为第二个户

其他提示

另一个选项,用于运行的脚本,作为其他用户是'命令'的命令,认为它是'超级用户的做:'为便于阅读,目的。-U参数提供用户名的信息。所以:

sudo -u user_B special_script

将提供的密码user_B.我从来没有一个问题与正在运行的互动节目的使用它。你可以管理谁可以命令向其通过visudo命令。

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

没有要求一个密码

su 试图获得一个密码从终端,并需要一个讯设备,因此它可以呼叫 ioctl 关掉关键的呼应。由于标准输入来自"here document"(ABC),试图呼叫的读写文件的描述符0yields"不tty".

如果你必须使用一个在这里的文件而不是一个 善意 脚本,这样做:

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

你可能想要使用 expect.其设计用于编写脚本的相互作用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top