我有许多集中式脚本,用于安装某些中间件(例如 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
对于务实的解决方案:您可以使用临时远程文件。
你的脚本将会
scp
脚本 文件 发送 到 远程/tmp/randomfilename
.ssh -t user@remote sudo sh /tmp/randomfilename
从本质上讲,这显然是一个安全风险,因为的内容/tmp/randomfilename
可能会被用户更改scp
,但如果涉及到本地操作,实际上这应该没有什么可担心的(除非你不信任本地用户,但我相信你会有其他更大的问题:-))。