我想做的(在 bash 中)是:
for i in <host1> <host2> ... <hostN>; do ssh leroy@$i "sudo -i; grep Jan\ 15 /var/log/auth.log" > $i;done
从这些主机 auth.logs 获取今天的条目并将它们聚合到我的本地文件系统上。 sudo 是必需的,因为 auth.log 只允许 root 访问。无法使用 root 用户,因为该帐户已被禁用。使用基于密钥的身份验证不是一种选择,因为系统实施 2FA(密钥和密码)。
当我执行上述操作时(初始身份验证后)我得到
sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
我尝试了 -S 选项的各种参数并包含 -M 选项,但没有任何效果。在网上搜索并没有发现任何与这种情况相关的信息。
答案1
进一步的研究发现了 sudo -S 选项,它具有一些重要的警告。以下是我使用的:
for host in ...; do
read -p "Password for $host sudo:" pswd;
ssh leroy@$host "echo $pswd | sudo -S grep ^Jan\ 15 /var/log/{auth.log,auth.log.1,syslog,syslog.1}" > $host;
done
注意事项:
提示可能会令人困惑,这就是为什么需要非常清晰的“阅读”提示。需要响应远程系统输入密码的提示。本地系统上会出现输入密码的 sudo 提示,但会得到回显应答。如果传递给 sudo 的命令运行一段时间(请注意,我添加了 syslog,在某些情况下,这导致 grep 处理数秒),看起来 sudo 正在等待答复,而实际上命令正在处理。
其次,密码显示在本地系统上,这不太好,但就我而言,我在家,所以这不是问题
第三,最终的密码保留在环境中,回想起来unset pswd
应该已经添加了。
任何建议的增强功能或替代方案都值得赞赏。
答案2
使用ssh ... 'sudo -S ...'
,不使用-t
,sudo
会从标准输入询问密码,但无法禁用密码提示的终端回显。
ssh
如果给定了要运行的命令,则默认情况下不会在远程设备上设置终端。这就是sudo
抱怨的地方。您可以使用-t
选项让它这样做...但正如评论中提到的,这会破坏输出重定向,并且密码提示将转到输出文件。您可以稍后删除提示,但您需要在没有看到提示的情况下知道输入密码,并且在输入密码之前您无法知道是否出现问题......
因此,解决方法可能是sudo -S
在会话期间在本地禁用回显。如果您不需要输入密码以外的任何其他输入,那应该没问题。
另外,sudo -i; grep ...
不会工作,它将运行一个交互式 sudo'ed shell,然后运行grep
后该 shell 退出。所以改为跑步sudo grep
。
所以,也许是这样的:
for host in ...; do
stty -echo
ssh leroy@"$host" 'sudo -S grep "Jan 15" /var/log/auth.log' > "$host"
stty echo
done