如何运行命令作为另一个用户

How to run command as another user

我有一个 shell 脚本,它在某些时候调用 Asterisk 并显示一些输出。调用 Asterisk 是我尝试过的第一个似乎 not 起作用的方法。我确定我设置为 运行 的用户脚本没有 运行 Asterisk 的权限,所以我想方设法以 root 身份 运行 它可以解决这个问题(唯一系统上的其他用户)。

我尝试使用 su 但没有成功。在过去的两个小时里,我一直在搞乱 sudosudoers 而无法让它工作。

例如,这是我的脚本中调用的一些代码,运行 用户 com:

printf "\n"
calls=`sudo "asterisk -rx 'core show channels'" | grep "active call"`
lastinboundcaller=`cat /var/log/asterisk/lastcaller.txt`
printf '%s\n' "Current Call Count: $calls"
printf '%s\n' "Last Inbound Caller: $lastinboundcaller"

输出:

[sudo] password for com:
sudo: asterisk -rx 'core show channels': command not found
Current Call Count:
Last Inbound Caller: Unknown

这里有两个问题,

  1. 提示输入密码。为什么提示输入 current 用户密码而不是 root 密码,我不知道,但它根本不应该提示输入任何密码。
  2. Asterisk 命令 asterisk -rx "command" 仍然无法正常工作 — 换句话说,它仍然无法 运行 Asterisk shell,尽管它应该有权限。

我尝试更新我的 sudoers 文件并在 /etc/sudoers.d 中创建一个名为 asterisk 的新文件,并将我的命令放在那里。

我对该文件的最新修改是:

com ALL = (ALL:ALL) NOPASSWD: /usr/sbin/asterisk

在那之前,我试过:

com ALL = (root) NOPASSWD: /usr/sbin/asterisk

我的理解是 应该 允许用户 com 以 sudo 的身份执行 asterisk 而无需 密码。显然,有些东西不起作用。

我遵循了许多类似 SO 帖子的答案,例如:

不幸的是,尽管遵循了我在这个问题上找到的所有答案,none 对我有用。

任何人都可以在这里指出正确的方向或提出替代方案吗?我已经咨询了 Linux 专家,这似乎是正确的方法。这在 Windows 中非常容易做到,我很惊讶在 Linux.

中如此复杂

不要引用 sudo 的参数。它期望第一个参数是命令的名称,因此它认为整个命令行都是程序名称。

应该是

calls=`sudo asterisk -rx 'core show channels' | grep "active call"`

Why it's prompting for the current user's password rather than the root password, I have no idea, but it shouldn't prompt for any password at all.

这就是 sudo 的工作原理。它提示输入当前用户的密码,并检查 /etc/sudoers 以查看他们是否被允许 运行 命令。您正在考虑 su,它会提示输入 root 密码。