0
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 模板。我正在为作为 xapi 一部分的 xe 命令编写联机帮助页。“manpagemaker.sh”脚本依赖于 xe 命令才能正确执行,该命令存在于我的远程 xenserver 云中。

因此,与其为我需要运行的每个 manpagemaker 实例打开一个新的 ssh 连接,我是否可以使用命名管道并将其流式传输到我的 xenserver 云中?请记住,我最终需要添加一个重定向来捕获发送到标准输出的所有文本。

4

1 回答 1

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 将逐行读取管道输入。

由于文件名不能包含空字符,因此我用于\0拆分参数。

如果要向 ssh 传递多个参数,则必须增加-l一个并添加另一个 echo 输出。这是一个例子:

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
于 2013-08-23T14:33:08.033 回答