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

发布于 2024-09-17 10:32:11 字数 375 浏览 19 评论 0原文

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

  1. 它必须以不同的用户身份运行 (用户_B)。这里需要密码。
  2. 它是互动的,但不仅仅是询问 问题但运行另一个脚本 另一个用户的名称 (user_C) 使用 苏。我必须在这里输入密码 以及。

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

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

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

In my shell script (bash) I want to call other shell scripts.
I run my script as user_A.
One of these scripts needs special handling:

  1. It has to be run as different user
    (user_B). Password needed here.
  2. It is interactive, but not only asks
    questions but runs another script in
    name of another user (user_C) using
    su. I have to enter a password here
    as well.

I can use su calling this script but its questions have to be answered somehow. I can not enter anything because it prints for each questons "stty: : Not a typewriter"

I'm calling the special script this way

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

梦里梦着梦中梦 2024-09-24 10:32:11
#!/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 ...”

#!/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

It works for 1 user, so now add 'if ...' for second user

埋情葬爱 2024-09-24 10:32:11

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

sudo -u user_Bspecial_script

将提示输入 user_B 的密码。我在使用它运行交互式程序时从未遇到过问题。您可以通过 visudo 命令管理谁可以对谁进行 sudo。

Another option for running scripts as other users is the 'sudo' command, think of it as 'superuser do:' for readability purposes. The -u parameter gives username information. So:

sudo -u user_B special_script

Will prompt for the password for user_B. I've never had a problem with running interactive programs using it. You can manage who can sudo to whom via the visudo command.

心病无药医 2024-09-24 10:32:11

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

而不要求输入密码

You can use sudo and create a sudoers file which allows user_A to run the script as user_B.

a line like:

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

would allow user_A to do something like

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

without asking for a password

猛虎独行 2024-09-24 10:32:11

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

如果您必须使用此处文档而不是善意脚本,请执行以下操作:

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

su attempts to get a password from the terminal and needs a tty device so it can call ioctl to turn off key echoing. Since the standard input is coming from a "here document" (ABC), an attempt to call the ioctl on file descriptor 0 yields "not a tty".

If you must use a here document instead of a bona fide script, do:

cat > /tmp/myscript.$ <<ABC
#!/bin/sh
...
ABC
chmod +x /tmp/myscript.$
sudo -u user_B /tmp/myscript.$
嗼ふ静 2024-09-24 10:32:11

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

You may want to use expect. Its designed for scripted interaction.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文