Выполните команду на нескольких хостах, но только команда печати, если это успешно?

Вот то, что я хочу сделать.

Я хочу проверить 100 хостов и видеть, существует ли файл на том хосте. Если файл действительно существует, то я хочу распечатать имя хоста и вывод команды.

В этом примере в качестве примера предположите, что у меня есть три хоста: host1.example.org host2.example.org host3.example.org. Файл /etc/foobar существует на host2.example.org, но не на host1.example.org или host3.example.org.

  1. Я хочу работать ls -l /etc/foobar на каждом хосте в списке.
  2. Если этот файл существует на том хосте, то распечатайте имя хоста и вывод команды.
  3. Если файл не существует на том хосте, то ничего не печатайте. Я не хочу дополнительный шум.
HOSTLIST="host1.example.org host2.example.org host3.example.org"
for HOST in $HOSTLIST
do
    echo "### $HOST"
    ssh $HOST "ls -ld /etc/foobar"
done

Идеальный вывод был бы:

### host2.example.org
drwx------ 3 root root 4096 Apr 10 16:57 /etc/foobar

Но эффективная выходная мощность:

### host1.example.org
### host2.example.org
drwx------ 3 root root 4096 Apr 10 16:57 /etc/foobar
### host3.example.org

Я не хочу, чтобы строки для host1.example.org или host3.example.org распечатали.

Я экспериментирую фигурные скобки для содержания вывода, выложенного echo и ssh, но я не могу выяснить волшебный синтаксис, чтобы сделать то, что я хочу. Я уверен, что сделал это в прошлом без управляющих символов,

HOSTLIST="host1.example.org host2.example.org host3.example.org"
for HOST in $HOSTLIST
do
    # If 'ls' shows nothing, don't print $HOST or output of command
    # This doesn't work
    { echo "### $HOST" && ssh $HOST "ls -ld /etc/foobar" ; } 2>/dev/null
done
4
11.04.2012, 04:01
3 ответа

Это работало на меня:

for HOST in $HOSTLIST; do
  ssh $HOST '[ -f /etc/passwd ] && echo $(hostname) has file'
done
2
27.01.2020, 20:49

Выезд clusterssh легко выполнить команду в системах в мае. Будьте чрезвычайно осторожны с выполнением команд в таком количестве систем сразу, оно Вы делаете неудачную опечатку, все серверы будут затронуты.

Команда, которую Вы хотите выполнить, пошла бы что-то как (относитесь для избиения страницы руководства за детали):

[ -e some_existing_file ] && { hostname; ls -l; }
1
27.01.2020, 20:49
set -- host1.example.org host2.example.org
for host; do
        ssh "$host" sh -c '[ -e /etc/foobar ] && { printf %s\\n "$1"; ls -ld /etc/foobar; }' _ "$host"
done
1
27.01.2020, 20:49

Теги

Похожие вопросы