Linux 在非交互模式下使用sudo命令
在Linux中,sudo(Super User DO)命令经常被用作只有超级用户可以执行的命令的前缀。任何有”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选项
使用超级用户/根用户角色,sudo -s会启动给定的SHELL环境变量中的shell。可以通过-u指定另一个用户。 用户的默认登录shell的路径存储在SHELL环境变量中。通常,etc/passwd包含真正的默认shell程序设置。根据您在当前会话中的操作,您当前使用的shell应用程序可能不在SHELL变量中。例如,如果您使用zsh自动登录,然后运行bash,则SHELL将保持为/bin/zsh。 让我们通过执行相同的命令来查看这个选择-C
tutorialsecho "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
正如我们所看到的,密码被管道传输到了标准输入。尽管提示还在那里,但是这次sudo命令执行了cp命令,而无需等待我们的输入。
禁止提示
当使用-S参数时,sudo命令从标准输入读取密码。Man sudo解释道:-S,—stdin
不使用终端设备,而是将提示写入标准错误并从标准输入读取密码。密码后必须有一个换行符。
需要注意的是,当使用-S选项时,sudo会将提示写到标准输出(stdout)而不是标准错误(stderr)。
通过重定向的帮助,我们可以快速禁用密码提示 –
tutorialsecho "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时,你学会了如何在不输入密码的情况下运行命令。不需要密码的操作会带来严重的安全风险。