如何运行命令作为另一个用户
How to run command as another user
我有一个 shell 脚本,它在某些时候调用 Asterisk 并显示一些输出。调用 Asterisk 是我尝试过的第一个似乎 not 起作用的方法。我确定我设置为 运行 的用户脚本没有 运行 Asterisk 的权限,所以我想方设法以 root 身份 运行 它可以解决这个问题(唯一系统上的其他用户)。
我尝试使用 su
但没有成功。在过去的两个小时里,我一直在搞乱 sudo
和 sudoers
而无法让它工作。
例如,这是我的脚本中调用的一些代码,运行 用户 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
这里有两个问题,
- 提示输入密码。为什么提示输入 current 用户密码而不是 root 密码,我不知道,但它根本不应该提示输入任何密码。
- 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 帖子的答案,例如:
- Use sudo without password INSIDE a script
- https://unix.stackexchange.com/questions/18877/what-is-the-proper-sudoers-syntax-to-add-a-user
不幸的是,尽管遵循了我在这个问题上找到的所有答案,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 密码。
我有一个 shell 脚本,它在某些时候调用 Asterisk 并显示一些输出。调用 Asterisk 是我尝试过的第一个似乎 not 起作用的方法。我确定我设置为 运行 的用户脚本没有 运行 Asterisk 的权限,所以我想方设法以 root 身份 运行 它可以解决这个问题(唯一系统上的其他用户)。
我尝试使用 su
但没有成功。在过去的两个小时里,我一直在搞乱 sudo
和 sudoers
而无法让它工作。
例如,这是我的脚本中调用的一些代码,运行 用户 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
这里有两个问题,
- 提示输入密码。为什么提示输入 current 用户密码而不是 root 密码,我不知道,但它根本不应该提示输入任何密码。
- 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 帖子的答案,例如:
- Use sudo without password INSIDE a script
- https://unix.stackexchange.com/questions/18877/what-is-the-proper-sudoers-syntax-to-add-a-user
不幸的是,尽管遵循了我在这个问题上找到的所有答案,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 密码。