我创建了一个非常简单的 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"