如何在没有密码的情况下远程执行ssh命令和sudo命令

如何在没有密码的情况下远程执行ssh命令和sudo命令

我有一个 Linux(基于 debian)服务器,它配置为允许与用户“admin”进行 SSH 会话,但不允许与用户“root”进行 SSH 会话。这两个帐户以某种方式链接,因为它们共享相同的密码。

在以管理员身份进行 SSH 会话期间,需要“sudo”才能运行命令,除非我切换到用户“root”。

我有一些服务需要时不时运行,甚至在系统启动时运行。我目前正在使用私钥/公钥机制在服务器上远程执行命令。有些命令是手动输入的,其他命令是我执行的 shell 脚本。目前,当命令使用 sudo 时,服务器仍然要求输入密码。

问题:如何在不提供密码的情况下以“admin”用户身份远程执行?是否可以使用私钥/公钥来满足 sudo 的要求?或者甚至可能是一种以用户“root”身份启动 shell 脚本的方法?

是否可以避免使用 sudo 输入密码?如果没有,对于像我这样的情况,他们还有其他选择吗?

答案1

你可以告诉 sudo 跳过某些命令的密码。

例如在/etc/sudoers

archemar  ALL = (www-data) NOPASSWD: /bin/rm -rf /var/www/log/upload.*

这让我可以使用

sudo -u www-data /bin/rm -rf /var/www/log/upload.*

作为没有密码的 archemar。

注意

sudo -u www-data rm -rf /var/www/log/upload.*

不会工作(会询问密码),因为rm/bin/rm. (*)

请务必/etc/sudoers使用visudo命令进行编辑。

一旦您达到高级水平,您可能希望在/etc/sudoers.d.


(*) 现代操作系统(redhat 7.x 大约 2022 年)中的这一变化,如果rm您的路径匹配/bin/rmsudoers.conf您可能会使用rm.

答案2

最简单的方法是提供密码(stdin如果您sudo支持的话)(-S 键)

ssh -t admin@remotehost "echo <yourpassword> |sudo -S <yourcommand>"

答案3

如果帐户以某种方式链接,则允许其中一个帐户使用 ssh 而另一个帐户则不允许使用 ssh 是没有意义的。这是我会做的:

  • 为 root 启用 ssh,仅允许使用 ssh 密钥进行访问,而不允许使用密码
  • 创建一个仅用于您的特定命令的新密钥
  • 将密钥和需要执行的命令放在authorized_keysroot 中,以便一旦与该密钥建立连接,就会启动该命令。

这是安全的,因为这样调用者就不能拥有 shell 也不能执行任何其他命令(即使他提供了一个命令)。

您可以在此处查看示例:https://stackoverflow.com/questions/402615/how-to-restrict-ssh-users-to-a-predefined-set-of-commands-after-logincommand=语法。如果您使用证书而不是密钥,您还可以通过将命令嵌入到证书中来执行相同的操作,或者使用配置选项全局执行此操作ForceCommand

http://larstobi.blogspot.com/2011/01/restrict-ssh-access-to-one-command-but.html另一个例子(这说明您需要考虑命令的参数)

答案4

要添加到 Archemar 的答案中,sudo请输入正在运行的用户的密码sudo,而不是运行命令的用户的密码。您说“admin”和“root”帐户已“链接”并共享相同的密码。如果您基于sudo接受“admin”帐户的密码(并且sudo当“admin”的密码更改时密码接受更改)得出此结论,则这是 的正常行为sudo

相关内容