如何通过 SSH 以 root 身份运行 bash 脚本?

如何通过 SSH 以 root 身份运行 bash 脚本?

我有许多集中式脚本,用于安装某些中间件(例如 JBoss-AS、JBoss-EWS 等)。想法是使用 expect 编写一个脚本,该脚本在另一个服务器上由其他用户运行(该脚本可以包含多个命令和 if ... then ... else,以及循环结构)。

我需要一个执行如下操作的预期脚本:

central $ ssh <user>@<remote> "sudo local-script"

我曾尝试将类似的东西放入管道中cat local-script | ssh -t <user>@<remote> sudo,但 sudo 不允许这样做。当我得到上述序列时,即sudo local-script通过 ssh 通道运行,然后我可以使用 autoexpect 生成一个可以工作的 expect 文件(类似的东西也ssh -t <user>@<remote> sudo < cat local-script不起作用)。

我知道您可以使用它来运行远程服务器上的命令,所以这不是我的问题。

由于我们使用的大多数安装脚本都需要 root 权限,并且由于显而易见的原因您不会对 root 使用 NOPASSWD,因此这可能吗?如何实现?

答案1

在服务器上创建一个专用用户帐户,仅用于此目的。/etc/sudoers在服务器上进行配置,以便专用用户帐户可以运行的命令只是您想要的命令。还要/etc/sudoers在服务器上进行配置,以便专用用户帐户不需要密码即可使用 sudo。然后以专用用户身份 ssh 到服务器并运行 sudo 以 root 身份执行所需的命令。

答案2

您不能在通过管道传输到 ssh 的内容前面加上“sudo”和密码吗?我以前在远程驱动与 expect 交互时就这样做过。

答案3

对于务实的解决方案:您可以使用临时远程文件。

你的脚本将会

  1. scp脚本 文件 发送 到 远程/tmp/randomfilename.
  2. ssh -t user@remote sudo sh /tmp/randomfilename

从本质上讲,这显然是一个安全风险,因为的内容/tmp/randomfilename可能会被用户更改scp,但如果涉及到本地操作,实际上这应该没有什么可担心的(除非你不信任本地用户,但我相信你会有其他更大的问题:-))。

相关内容