如何让我的 expect 语句不输出第一个命令的标准输出?

如何让我的 expect 语句不输出第一个命令的标准输出?

我试图执行一个 ssh 命令来打印出/etc/shadow文件。显然该文件需要 root 或sudo权限,而我没有 root 凭证,因此我必须使用sudo

这是我制定的命令:

expect -c 'spawn -noecho ssh -q -t -S /tmp/t2.ssh dummy "sudo cat /etc/shadow";expect "assword"; send "password99\r";interact'

它输出的正是我需要的内容,但它还在第一行输出 sudo 密码的提示:

[sudo] password for student99:
root:$x$xxx:18029:0:99999:7:::
daemon:*:17575:0:99999:7:::
bin:*:17575:0:99999:7:::
sys:*:17575:0:99999:7:::
sync:*:17575:0:99999:7:::

如果不使用其他程序(如 grep、awk、tail 等),有没有办法修改expect命令,使其仅打印 cat 命令的输出而不打印[sudo] password for student99:提示?

解决方案:
感谢@larsks,我的最终工作命令是:

expect -c 'spawn -noecho ssh -q -t -S /tmp/t2.ssh dummy "sudo cat /etc/shadow";log_user 0;expect "assword"; send "password99\r";interact'

答案1

您可以通过设置禁用输出日志记录log_user 0。从文档

log_user -info|0|1
    By default, the send/expect dialogue is logged to stdout (and a logfile if
    open). The logging to stdout is disabled by the command "log_user 0" and
    reenabled by "log_user 1". Logging to the logfile is unchanged.

    The -info flag causes log_user to return a description of the most recent
    non-info arguments given. 

相关内容