在非交互模式下使用 sudo 命令
摘要
在 Linux 中,sudo(超级用户执行)命令经常用作命令的前缀,只有超级用户才能执行这些命令。任何带有“sudo”前缀的命令都将以提升的权限运行,或者换句话说,允许具有必要权限的用户以其他用户(例如超级用户)的角色执行命令。这类似于 Windows 的“以管理员身份运行”选项。由于 sudo,我们可以拥有多个管理员。
注意 - Linux 命令区分大小写。
默认 sudo 行为
要在大多数现代 Linux 发行版上使用 sudo 命令,用户必须是 wheel、sudo 或 sudoers 组的成员。单用户系统默认会为其用户提供 sudo 权限。系统或服务器上的多个用户帐户可能会阻止某些用户获得 sudo 访问权限。
让我们首先回顾一下 sudo 命令的默认行为 -
$ sudo cp /root/temp1 lecture_class [sudo] password for tutorials: $ ls -l lecture_class -rw------- 1 root root 12863 Jan 15 13:48 lecture_class
在上面的示例中,我们以普通用户 tutorials 运行了 sudo 命令。root 的 lecture_class 文件应复制到当前目录。
将参数作为密码传递
如果我们需要在脚本中包含 sudo 命令,或者如果我们想在非交互模式下运行它。
现在让我们看看如何将密码作为参数发送到 sudo。
使用 -S 选项
使用超级用户/root 角色,sudo -s 启动在您的 $SHELL 环境变量中给出的 shell。使用 -u,可以指定另一个用户。
用户默认登录 shell 的路径存储在 $SHELL 环境变量中。通常,etc/passwd 包含实际的默认 shell 程序设置。根据您在当前会话中执行的操作,您当前正在使用的 shell 应用程序可能不在 $SHELL 变量中。例如,如果您使用 zsh 自动登录,然后运行 bash,则 $SHELL 将保持为 /bin/zsh。
让我们通过执行相同的命令来检查此选项 -
tutorials$ echo "My Pass" | sudo -S cp /root/temp1 lecture_class [sudo] password for tutorials: tutorials$ ls -l lecture_class -rw------- 1 root root 12863 Jan 15 13:48 lecture_class
如我们所见,密码已通过管道传输到 stdin。虽然提示仍然存在,但 sudo 命令这次在没有等待我们的输入的情况下执行了 cp 命令。
抑制提示
当使用 -S 参数时,sudo 命令会从标准输入读取密码。Man sudo 解释:-S,—stdin
将提示写入标准错误而不是终端设备,并从标准输入读取密码。密码后必须有一个换行符。
需要注意的是,当使用 -S 选项时,sudo 会将提示写入标准输出 (stdout) 而不是标准错误 (stderr)。
借助重定向,我们可以快速禁用密码提示 -
tutorials$ echo "My password" | sudo -S cp /root/temp1 lecture_class 2>/null tutorials$ ls -l lecture_class -rw------- 1 root root 12863 Jan 15 13:48 lecture_class
我们将使用 2 将 cat 命令的标准错误重定向。
无需密码即可使用超级用户
对于 Linux 或类 Unix 系统,sudo(“超级用户执行”)只是一个用于以不同用户身份运行命令和程序的工具。例如,作为 root 用户或其他用户。使用 sudo,您可以将例行任务分配给非特权用户,例如重新启动服务器、启动 Apache 或创建备份。默认情况下,sudo 在执行命令之前需要用户的密码身份验证。当您需要以 root 身份运行命令但不想输入密码时,可以使用 sudo 命令。对于脚本编写或任何其他用途,这很有帮助。通过在 /etc/sudoers 文件中进行适当的条目,可以实现这一点。
$ su - # or use the sudo command $ sudo -i
通过输入以下命令,您可以备份您的 /etc/sudoers 文件,并按如下所示编辑文件,
$ cp /etc/sudoers /root/sudoers.bak # visudo
在 /etc/sudoers 文件中添加以下行,以便用户“tutorials”可以执行命令“/bin/kill”和“systemctl”而无需输入密码,以便当所有用户以 root 身份运行应用程序时,它不会请求密码 -
# tutorials ALL = NOPASSWD: /bin/systemctl restart httpd.service, /bin/kill
保存并退出文件,然后通过运行以下命令进行测试,
# sudo /bin/kill {pid}
结论
当我们使用 sudo 命令启动程序时,它默认会请求当前登录用户的密码。但是,有时我们希望使用 sudo 在非交互模式下运行某些操作。首先,我们演示了如何使用 sudo 命令的 -S 选项将密码作为参数传递。在 Linux 或其他类 Unix 系统上使用 sudo 时,您学习了如何在没有密码的情况下运行命令。不需要密码的操作会带来严重的安全风险。