如何将多个命令分配给 UNIX 中的 spawn?

问题描述

如何在 1 个 spawn 中执行所有这些命令?

这些是命令:

sudo du -ckhx /opt/ | sort -rh | head -10
sudo du -ckhx /usr/ | sort -rh | head -10
sudo du -ckhx /var/ | sort -rh | head -10

这是生成命令:

 spawn ssh -o StrictHostKeyChecking=no $username@$ip $commands

生成后,我使用expect 作为密码...

我知道我可以将它们分配给 1 个变量,例如:

set commands "sudo du -ckhx /opt/ | sort -rh | head -10 && sudo du -ckhx /usr/ | sort -rh | head -10 &&..."

但是如果我有很多这样的命令(对于我想要的其他一些目录),它会很长。

谢谢!

解决方法

也许:

set commands {
    sudo du -ckhx /opt/ | sort -rh | head -10
    sudo du -ckhx /usr/ | sort -rh | head -10
    sudo du -ckhx /var/ | sort -rh | head -10
}
spawn ssh -o StrictHostKeyChecking=no $username@$ip sh -c $commands

基于 Nate 的评论:

set dirs { /opt  /usr  /var }
set cmds [lmap dir $dirs {
    format {sudo du -ckhx %s | sort -rh | head -10} $dir
}]

spawn ssh ... sh -c [join $cmds \n]

如果您要开发 expect 代码,我建议您先熟悉一下 语法。

要添加命令,请使用 Tcl list 命令。

  • 附加:lappend cmds {echo "this is the last command"}
  • 前置:set cmds [linsert $cmds 0 {echo "first command"}]