在我的shell脚本(bash)中,我想调用其他shell脚本。
我以user_A运行我的脚本。
其中一个脚本需要特殊处理:
我可以使用su来调用这个脚本但是它的问题必须以某种方式回答。我不能输入任何东西,因为它打印每个questons“stty ::不是打字机”
我用这种方式调用特殊脚本
su user_B << ABC
...
special_script
...
ABC
答案 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
。它专为脚本交互而设计。