我有两台服务器,服务器A和服务器B。
目前我在上面运行一个shell脚本服务器A创建一个文件并且‘推动’它到服务器B。 shell 脚本作为 cron 每小时运行一次并且需要SUDO
权限。
但是,由于我们的设置发生了变化,我无法再'推'该文件来自服务器A到服务器B,而我现在需要'拉'该文件来自服务器B到服务器A。
有没有'正确的'连接到远程服务器并执行需要提升权限的脚本的方式?但不必在 shell 脚本中写下密码服务器B?
答案1
你有一些选择。以下是一些建议:
使用基于证书的身份验证从 serverB 连接到 root@serverA,并在该服务器上的根上下文中运行脚本。
scp
然后,您可以使用相同的基于证书的身份验证来通过或拉回生成的文件rsync
。缺点是您在 serverB 上的帐户可以完全无限制地访问 root@serverA。然而,在严格管理的环境中,这可能是可以接受的。使用基于证书的身份验证从 serverB 连接到 root@serverA,该身份验证将连接限制为运行单个命令 - 您的脚本。
如果命令将其文件输出到标准输出它可以直接从从 serverB 到 root@serverA 的会话中捕获,
ssh
无需在脚本完成后传输文件。您在 serverB 上的帐户无法任意访问 root@serverA。~root/.ssh/authorized_keys
root@serverA 在其文件中运行该命令所需的条目示例bake
可能如下所示:ssh-rsa AAAAB3Nza...Fr9FvN me@roaima,command="/usr/local/bin/bake",no-agent-forwarding,no-port-forwarding,no-X11-forwarding
从 serverB 连接到 serverA,并用于
sudo
运行脚本。您可以配置sudo
为允许单用户帐户以 root 身份运行脚本,但不需要密码。中的此条目
/etc/sudoers
将允许用户“roaima”使用以下命令以 root 身份运行带或不带参数的命名脚本sudo /usr/local/bin/bake --fruit=apple,blackberry --type=pie
roaima ALL = NOPASSWD: /usr/local/bin/bake
使用触发器进行更复杂的事情,例如连接到 serverA 上定义的 TCP 端口并触发脚本,以 root 身份运行。
这确实意味着任何可以访问 serverA 上的 TCP 端口的人都可以启动您的脚本,因此您需要考虑 DDOS 问题并防止同时运行脚本的多个实例。然而,这将消除需要任何serverA 上的交互式根访问 - 即使是通过
sudo
.
答案2
您可以连接到服务器Bvia ssh
,然后运行sudo
以提升权限执行您的脚本。您可以配置sudo
不要求输入密码。