2010-09-02 129 views
1

在我的shell脚本(bash)中,我想调用其他shell脚本。
我将我的脚本作为user_A运行。 这些脚本的一个需要特殊处理:以其他用户的名义运行交互式shell脚本

  1. 它来运行不同的用户 (用户_B)。这里需要密码。
  2. 它是交互式的,但不仅要求 的问题,而且要使用 su运行另一用户(user_C)的名称 中的另一个脚本。我也必须在此输入密码 。

我可以使用su调用这个脚本,但它的问题必须以某种方式回答。 “:stty的:不是打字机”,因为它打印每个questons我不能进入任何

我打电话了特殊的脚本这样

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

回答

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 [email protected]" 
    exit 0 
else 
    main_for_root [email protected] 
fi 

它适用于1个用户,所以现在添加“如果......”的第二个用户

1

运行脚本的其他用户的另一种选择是“ sudo'命令,为了便于阅读,可以将其视为“超级用户”。 -u参数提供用户名信息。所以:

sudo -u user_B special_script

会提示输入密码的用户_B。我从来没有遇到过使用它运行交互式程序的问题。你可以通过visudo命令管理谁可以向谁请求。

0

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

这样一行:

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

将允许用户_A做这样

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

东西不要求输入密码

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.$$ 
0

您可能需要使用expect。其设计用于脚本交互。