sudo: 命令未找到。

4
我正在尝试使用sudo命令以另一个用户的身份执行screen。
我使用的命令是:
echo 'userpassword' | /usr/bin/sudo -u 'myuser' -S '/usr/bin/screen -ls'

任何在互联网上找到的帮助都说sudo会清除环境变量(如PATH)。因此,我决定使用应用程序的完整路径,但仍然出现命令未找到的错误。
错误:
sudo: /usr/bin/screen -ls: command not found

系统上已安装“sudo”和“screen”。

对于“sudo”,我尝试使用“-E”和“-H”标志,但没有帮助。

我尝试使用如下命令设置“PATH”变量:

... | /usr/bin/sudo -u 'myuser' -S 'env PATH=$PATH; /usr/bin/screen -ls'

据说在命令执行之前,$PATH应该被展开,但是我遇到了其他错误...

有人能提供一个命令,让我可以以另一个用户的身份执行命令,并解释命令的每个部分,以便我可以理解吗?

谢谢。


这个问题可能更适合在StackExchange网站的Super UserServerFault上提问。 - David C. Rankin
请更新问题以显示精确的(复制并粘贴)错误消息。顺便说一句,sudo 并不能完全重置 $PATH;在我的系统上,它将其设置为 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin - Keith Thompson
1
我投票关闭此问题,因为它不是一个编程问题。请尝试 [unix.se]。 - Keith Thompson
好的,我会把它移动到那里。 - Bradley Odell
sudo 正试图将整个字符串 env PATH=$PATH.... 作为单个命令而不是命令和参数来查找。 sudo 会重置 PATH。在我的测试中,sudo env 的结果是 PATH=/sbin:/bin:/usr/sbin:/usr/bin,而我的 PATH 完全不同。请尝试 sudo -u 'myuser' -S PATH=$PATH /usr/bin/screen -ls。请注意命令中没有引号。 - alvits
2个回答

8

请尝试,

export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:$PATH

可能在尝试设置新的路径变量时,您替换了路径变量。

今后,在添加新的路径变量之前,请执行“echo $PATH”。


0

似乎没有必要将命令用引号封装起来,即使没有引号也可以正常工作。

echo 'userpassword' | /usr/bin/sudo -u 'myuser' -S screen -ls


去掉命令周围的引号就可以了。但是为什么呢? 传递的命令是一个参数,我使用了 PHP 中的 escapeshellarg 函数来转义它。 - Bradley Odell
@BradleyOdell - escapeshellarg() 转义引号之间的所有空格。 - alvits
@alvits 我不这么认为。它只是在字符串周围添加单引号。 - Bradley Odell
@BradleyOdell - 哎呀,我想说的是它可以转义现有的引号。我应该只是从这里复制并粘贴文本http://php.net/manual/en/function.escapeshellarg.php - alvits

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接