Перенаправление ввода / вывода в команде ssh - PullRequest
0 голосов
/ 01 февраля 2019

Я написал скрипт 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

Таким образом, печать имен узлов узлов подавляется этим сообщением об ошибке,Я думаю, что это поведение как-то связано с перенаправлением ввода-вывода, и использование таких вещей, как 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 голосов
/ 01 февраля 2019

Добавьте 2> & 1 к команде ssh, чтобы сообщение и ошибка оставались в следующем порядке:

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

Решение после обсуждения:

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