如何将 ssh 与 sudo 结合使用并将输出重定向到本地文件?

如何将 ssh 与 sudo 结合使用并将输出重定向到本地文件?

我想做的(在 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 ...',不使用-tsudo会从标准输入询问密码,但无法禁用密码提示的终端回显。

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

相关内容