2017-10-09 88 views
-1

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

+0

是否有你想为此使用'expect'的原因? –

+0

我想让这个过程自动化。去服务器 - >做这个工作 - >回来检查一下 - >回去重复。我认为期望是这里的工具,对吧? –

+0

不一定。您可以使用bash协处理器进行这项工作,也可以使用ControlMaster功能的单个SSH会话,同时在传输过程中运行多个单独的命令时打开传输器。 –

回答

0

要做的最简单的事情 - 包括从正确性的角度来看 - 不是尝试拥有一个长时间运行的SSH会话,而是多个寿命较短的会话(可能使用SSH multiplexing在这些会话之间重复使用单个传输):

count_remote_files() { 
    local host=$1 dirname=$2 dirname_q 
    printf -v dirname_q '%q' "$dirname" 
    remote_files=$(ssh "$host" "bash -s ${dirname_q}" <<EOF 
    cd "$1" || exit 
    set -- * 
    if [ "$#" -eq 1 ] && [ ! -e "$1" ] && [ ! -L "$1" ]; then 
     echo "0" 
    else 
     echo "$#" 
    fi 
EOF 
) 
} 

count_local_files() { 
    local dirname=$1 
    cd "$dirname" || return 
    set -- * 
    if [ "$#" -eq 1 ] && [ ! -e "$1" ] && [ ! -L "$1" ]; then 
    echo "0" 
    else 
    echo "$#" 
    fi 
} 

if (($(count_remote_files "$host" "$remote_dir") == 
     $(count_local_files "$local_dir"))); then 
    echo "File count is identical" 
else 
    echo "File count differs" 
    ssh "$host" 'echo "doing something else now"' 
fi 
+0

哇,谢谢。这是很多工作。非常感谢。 –

0

由于您使用的期待,你可以很容易地计算使用Tcl命令在本地文件,因为期望的是建立在Tcl的顶部:

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

欲了解更多信息请参阅http://nikit.tcl.tk/page/Tcl+Tutorial+Lesson+25