我正在编写一个 shell 脚本,我想在多个 Unix 服务器上自动执行服务重新启动过程。我作为普通用户无权运行服务重新启动命令。仅有的s_用户有权运行它们。
重启服务的步骤:
- 使用我的用户名和密码登录服务器。
要运行重新启动服务,我需要使用以下命令将用户切换到 s_user:(我需要这个命令而不提示密码)
sudo su - s_user
上面的命令提示输入密码,我将提供密码以重新启动服务。我必须在所有服务器上执行此过程。我想通过标准输入向 su 提供密码来跳过密码提示。
到目前为止我已经尝试过以下命令:
1. echo 'password'|sudo -S su -c " .../bin/services stop"
Output:
[sudo]password for abc.xyz: Sorry, user abc.xyz is not allowed to execute '/bin/su - s_user' -c /bin/services stop' as root on [Servername]
在上面的命令中我给出了我的密码。我也尝试过提供 s_user 密码,但它给出以下输出:
[sudo]password for abc.xyz: Sorry,try again.
[sudo]password for abc.xyz:
sudo:pam_authenticate:Conversation error
我在下面的命令中将“su”替换为“u”,但仍然得到与第一个命令相同的输出错误。
2. echo 'password'|sudo -S u -c " .../bin/services stop"
我在下面的命令中提供了 s_user,但仍然收到与第一个命令相同的输出错误。
3. echo 'password'|sudo -S su - s_user -c ".../bin/service stop"
接下来我尝试了以下命令。
4. echo 'my password'|su -c ".../bin/services stop" -s /bin/sh abc.xyz
Output:
Standard in must be a tty
我也尝试过以下命令。
5. su -c "command_to_restart_the_services" -s /bin/sh abc.xyz
我能够成功运行该命令。
6. echo password|sudo -S su - user-to-switch
sudo -S su - user-to-switch
上面的命令仍然要求输入密码。
限制:
• 我无法使用“预计”,它没有安装在我的机器上。
• 我无法编辑“须多儿”文件。我没有权利。
答案1
我看到你正在使用sudo
成为root,然后su
成为s_user
.为此,您将使用您的密码(用于sudo
)。您不需要 的密码s_user
。
您可以通过将 ssh 密钥添加到帐户来做到这一点s_user
,但我认为这种情况下的解决方案不是最佳的。
首先我要指出的是,你不需要su
,而且最好不要使用它。因此sudo su - s_user -c command
,不要这样做sudo -u s_user command
。系统仍会要求您输入密码。但是您现在可以配置/etc/sudoers
添加一个文件/etc/sudoers.d/s_commands
,包含类似的内容(但已检查,带有/usr/bin/visudo
):
Cmnd_Alias S_COMMAND=/usr/bin/command, /usr/bin/anotherCommand
%s_group ALL = (s_user) NOPASSWD : S_COMMAND
这将允许以 s_user 身份使用这些命令的密码较少,但仅限于组 s_group 中的用户(您必须添加该组)。
然后设置一个 shell 别名,例如:alias s_command="sudo -u s_user command"
。
笔记:
su
获取您要切换到的用户的密码。sudo
默认情况下,采用您所在用户(您要切换的用户)的密码。sudo
不从 stdin 读取密码,而是从 tty 读取。
答案2
一种方法是使用 ssh。
使用 ssh-copy-id 您可以存储身份验证:
ssh-copy-id [email protected]
(如果没有设置密钥,则用于ssh-keygen
生成一个)
接下来你可以使用ssh
而不是 sudo 来执行命令而无需密码提示:
ssh [email protected] " .../bin/services stop"
答案3
这并不完全是您问题的答案,但可能是您任务的解决方案。
我想您知道每台服务器上 s_user 的密码,并且sshd
在这些服务器上安装了该密码(并且按预期工作;取决于服务器上运行的操作系统)。
作为普罗莫内特如上所述,您可以使用 ssh,但无需使用自己的凭据登录服务器。
在你的电脑:
首先,使用 生成您自己的密钥对ssh-keygen
。默认情况下,这将存储在 ~/.ssh 目录中。
接下来,对于每个涉及的服务器调用ssh-copy s_user@<server>
;系统会要求您输入服务器上 s_user 的密码。
现在检查是否一切顺利,只需尝试即可ssh s_user@<server>
。如果无需输入密码即可完成此操作。
在您的脚本(在本地计算机上)中,您现在可以调用
ssh s_user@<server> "whatever-command-you-need-to-run"
无需输入密码。
Rem.:我想您的本地计算机也运行类似 UN*X 的操作系统。如果您运行的是 Windows,则可以使用 Windows 数据包附带的程序putty
。