使用 sudo 向多个客户端发送 SSH 命令的正确方法是什么?

使用 sudo 向多个客户端发送 SSH 命令的正确方法是什么?

我创建了一个非常简单的 shell 脚本来向多个主机发送 SSH 命令。现在我已经复制了我的 ssh id,这样我就不必使用密码登录服务器了。但如果我想做一个apt-get update示例,那么我必须以 root 身份登录,我确定这不是首选方法?所以问题是,向具有 sudo 权限的多个客户端发送多个 ssh 命令的最佳方法是什么?

#!/bin/bash
# Hosts
hostarray=(
        "host1"
        "host2"
        "host3"
        )

for i in "${hostarray[@]}"; do
    ssh "$i" "command here"
done

答案1

如上所述,Ansible 可以使用“--become --become-method=sudo --ask-become-password”选项更优雅地处理此问题。但是,例如,您可以将其放在名为 /etc/sudoers.d/puppet 的文件中(假设您的远程用户名是 puppet - 命名是可选的,但它可以帮助我保持事情的正确性):

Defaults:puppet    !requiretty

puppet ALL=(ALL) NOPASSWD: ALL

这样就无需输入密码,也无需使用 tty。

答案2

您收到 tty 错误是因为 sudoers 配置为需要 TTY。 https://unix.stackexchange.com/questions/122616/why-do-i-need-a-tty-to-run-sudo-if-i-can-sudo-without-a-password

-tt您可以尝试使用强制 tty 分配的 选项运行 ssh 。https://www.freebsd.org/cgi/man.cgi?query=ssh&sektion=1

ssh -tt user@host

答案3

您还可以将您的公钥复制到~root/.ssh/authorized_keys每个远程主机上,然后

ssh root@"$i" "command"

如果安全不是问题,而且环境封闭,那么它可能会让你的生活更轻松。否则,我不推荐这样做,我会将 sudo 中的默认值设置为不要求 tty,或者强制分配 tty,如上所述

ssh -tt "$i" "command"

相关内容