我使用 Ubuntu 16.04 并尝试直接在 Bash 上执行:
sudo cat << EOF | at 'now + 1 minute'
echo "hello"
EOF
我得到:
warning: commands will be executed using /bin/sh job 6
at Wed Dec 28 03:01:00 2016
Can't signal atd (permission denied)
因此,如果没有权限运行该命令,该短语hello
将不会在 Bash 上回显。
如果我使用sudo
,为什么权限会被拒绝?与 不同,cd
它不是一个实用程序,而是一个内置 shell 命令,at
(以及cat
) 是实用程序,因此sudo
应该应用它们。
您也许知道为什么不能使用吗?
答案1
TL;DR:sudo
通过管道(|
)移动到at
命令本身。
您实际上尚未at
以 root 身份运行。
您cat
以 root 身份运行 ( sudo cat ...
),并将 的输出通过管道传输cat
到at
,但您并没有at
以 root 身份运行命令本身。
在许多系统中,一些非 root 用户被允许运行 at 作业。但是,如果这不是您想要的,您的系统配置方式符合您的喜好,并且您打算以 root 身份运行此特定 at 作业,那么您可以通过at
以 root 身份而不是 来解决问题cat
。(无论哪种方式,您在这种情况下都不需要cat
以 root 身份运行。)
要做到这一点,请在sudo
之前放置:at
cat
cat << EOF | sudo at 'now + 1 minute'
可选详细信息:
目前您有:
sudo cat << EOF | at 'now + 1 minute'
echo "hello"
EOF
它cat
以 root 身份运行sudo
,并将传递echo "hello"
给它(使用 here-document 语法)。该cat
命令的标准输出通过管道传输到命令at 'now + 1 minute'
,即不是以 root 身份运行。因此at
尝试以运行该作业的非 root 用户(您)的身份来安排该作业。
如果您希望 at 作业以 root 身份运行,您可以通过将其更改为以下方式解决此问题:
cat << EOF | sudo at 'now + 1 minute'
echo "hello"
EOF
如果您稍后配置了允许运行作业的非 root 用户帐户,然后你会跑两者都不以 root 身份执行命令:
cat << EOF | at 'now + 1 minute'
echo "hello"
EOF