ssh -p 10551 -S /tmp/manpagemaker/ssh.connect -MfN root@192.168.1.25
for xe in ${XECOMMANDS[@]} ;do
xe=$(echo ${xe#*-}) ; xe=$(echo ${xe%.*})
ssh -p 10551 -S /tmp/manpagemaker/ssh.connect root@192.168.1.25 t 'bash -s' < ./manpagemaker.sh "$xe"
done
有更好的方法吗?我觉得我的方法非常低效。
我编写了一个脚本,为手册页构建asciidoc模板。我正在编写xap命令的manpages,它是xapi的一部分。 “manpagemaker.sh”脚本依赖于正确执行的xe命令,该命令存在于我的远程xenserver云上。
因此,不是为我需要运行的每个manpagemaker实例打开一个新的ssh连接,我是否可以使用命名管道并将其流式传输到我的xenserver云?请记住,我最后需要添加一个重定向来捕获发送到stdout的所有文本。
答案 0 :(得分:0)
您可以尝试将函数传递给xargs:
showCommands() {
for xe in ${XECOMMANDS[@]}; do
xe=$(echo ${xe#*-}) ; xe=$(echo ${xe%.*})
echo "$xe"
done
}
showCommands | xargs -l1 ssh -p 10551 -S /tmp/manpagemaker/ssh.connect root@192.168.1.25 t 'bash -s' < ./manpagemaker.sh
我不知道XECOMMANDS
的内容,但似乎这个代码在文件名包含空格字符的情况下被破坏了。这是一种解决方法:
showCommands() {
for xe in "${XECOMMANDS[@]}";do
echo -n "$xe"
echo -ne '\0'
done
}
showCommands | xargs -0 -l1 ssh -p 10551 -S /tmp/manpagemaker/ssh.connect root@192.168.1.25 t 'bash -s' < ./manpagemaker.sh
-l1
表示xargs将逐行读取管道输入。
由于文件名不能包含null character,因此我使用\0
来分割参数。
如果要将多个参数传递给ssh,则必须将-l
增加1并添加另一个回声输出。这是一个例子:
showCommands() {
for xe in "${XECOMMANDS[@]}";do
echo -n "$xe"
echo -ne '\0'
echo -n 'This is another parameter'
echo -ne '\0'
done
}
showCommands | xargs -0 -l2 ssh -p 10551 -S /tmp/manpagemaker/ssh.connect root@192.168.1.25 t 'bash -s' < ./manpagemaker.sh