Shell 使用expect捕获输出

Shell 使用expect捕获输出,shell,expect,Shell,Expect,我想比较远程服务器和本地目录上的文件数。我使用ssh连接到服务器,并能够使用$expect_out(buffer)捕获“ls-somewhere/*somewhere | wc-l”的输出,并将其存储为变量。现在我的问题是,我如何回到我的本地计算机,计算这里的文件并比较它们。比较之后,如果比较结果可以接受,我需要返回服务器并继续作业 从正确性的角度来看,最简单的方法是不要尝试使用一个长时间运行的SSH会话,而是使用多个短时间运行的SSH会话(可能用于在此类会话之间重用单个传输): count_r

我想比较远程服务器和本地目录上的文件数。我使用ssh连接到服务器,并能够使用$expect_out(buffer)捕获“ls-somewhere/*somewhere | wc-l”的输出,并将其存储为变量。现在我的问题是,我如何回到我的本地计算机,计算这里的文件并比较它们。比较之后,如果比较结果可以接受,我需要返回服务器并继续作业

从正确性的角度来看,最简单的方法是不要尝试使用一个长时间运行的SSH会话,而是使用多个短时间运行的SSH会话(可能用于在此类会话之间重用单个传输):

count_remote_文件(){
本地主机=$1目录名=$2目录名
printf-v dirname_q'%q'$dirname

remote_files=$(ssh“$host”“bash-s${dirname_q}”因为您使用的是Expect,所以可以通过使用Tcl命令轻松地计算本地文件,因为Expect是在Tcl之上构建的:

set num_local_files [llength [glob somewhere/*something]]

有关更多信息,请参见

是否有理由使用
expect
来完成此操作?我想自动化此过程。转到服务器->执行作业->返回检查内容->返回并重复。我认为expect是这里的工具,对吗?不一定。您可以使用bash协进程来完成此操作,或者只使用一个SSH会话来控制lMaster功能在传输上运行多个单独命令时保持传输打开。(请参阅:ControlMaster/ControlSocket上的背景;基本上,它提供了一种机制,可以在同一连接上运行多个不同的SSH命令,而无需多次验证和握手).BTW,
ls | wc
不是计算文件数的理想方法——根据运行它的系统,文件名带有换行符(是的,它们是合法的)可以重复计算。您知道该平台吗?如果您保证有GNU
find
可用,您可以使用
find/path-printf.\n'
或类似工具,这样输出只与文件数量相关,而不与文件名相关。另请参阅有关无
ls
的文件计数的其他建议/指导,以及D
set num_local_files [llength [glob somewhere/*something]]