ssh命令中的I / O重定向

时间:2019-01-31 21:12:45

标签: bash ssh io-redirection

我编写了一个bash脚本rm_remote_file.sh,该脚本SSH到一组远程计算机并删除文件。我在每个函数调用的末尾使用&来并行运行这些命令,脚本如下所示:

#!/bin/bash

rm_remote_file() {
    echo "Removing file on node $1:"
    ssh $1 'rm ~/test_file'
}

for node in node1.com node2.com node3.com; do
    rm_remote_file $node &
done

当每个节点上都有test_file时-rm命令成功-此脚本的输出为:

Removing file on node node1.com:
Removing file on node node2.com:
Removing file on node node3.com:

我更喜欢打印每个主机名。但是,如果每个节点上都不存在test_file-rm命令失败-此脚本的输出为:

rm: cannot remove ‘~/test_file’: No such file or directory
rm: cannot remove ‘~/test_file’: No such file or directory
rm: cannot remove ‘~/test_file’: No such file or directory

因此,此错误消息禁止打印节点的主机名。我认为这种行为与I / O重定向有关,使用2>&1之类的东西可以解决此问题。但是我想知道为什么ssh命令错误消息会抑制echo命令。

请注意,这仅在ssh命令中发生,以下仅删除一些本地文件的脚本将同时输出“正在删除文件”和“没有此类文件或目录”。

#!/bin/bash

rm_file() {
    echo "Removing file..."
    rm ./$1
}

for file in test1 test2 test3 test4 test5; do
    rm_file $file &
done

1 个答案:

答案 0 :(得分:0)

在ssh命令中添加2>&1,并对该消息和错误按顺序排列:

ssh $1 'rm ~/test_file' 2>&1

讨论后的解决方案:

rm_remote_file() {
    echo "Removing file on node $1: $( ssh $1 'rm ~/test_file' 2>&1 )"
}