2015-07-10 1 views
1

Я написал небольшой вкладыш в bash, чтобы выплескивать версии openssl на моих серверах (checking if I'm protected against this most recent openssl vulnerability), но если SSH не может подключиться и раз out, это останавливает остальную часть скрипта от выполнения. Я знаю достаточно баха, чтобы обойти, но я не совсем уверен, что нужно сделать здесь, чтобы заставить его продолжить, возможно, захватить SIGTERM и продолжить с того места, где я остановился ? Я уверен, что есть более простой способ ..xargs sh -c 'ssh ...' прекращение выполнения, когда какое-либо время соединения отключено

Вот команда:

cat servers.txt | \ 
    xargs -I {} sh -c "echo {} && ssh -o ConnectTimeout=3 [email protected]{} openssl version" 

Где servers.txt это просто большой список IP-адресов, по одному в строке

+0

@CharlesDuffy не знал, что о xargs, спасибо! – bruchowski

+1

Вы должны ** никогда ** не расширять '{}' непосредственно в 'sh -c' или подобный скрипт. Это небезопасно. Вместо этого вы должны передать '{}' в качестве аргумента для оболочки и использовать соответствующие позиционные аргументы в сценарии оболочки. Страница man для 'xargs' указывает, что она должна останавливать всю цепочку выполнения, если внутренний процесс завершается с кодом выхода' 255'. Я бы не ожидал, что 'ssh' сделает это, но может быть, и здесь. Просто добавляет '|| выйти 1' в скрипт «исправить» проблему? –

+0

(в другой точке 'sh' - это POSIX sh, а не bash - даже если/bin/sh является ссылкой на/bin/bash, при запуске он отключает кучу функций, просто' sh' или 'shell' является соответствующим тегом, если не * явно * с использованием bash). –

ответ

3

На странице xargs человек:

Утилита xargs немедленно выходит (без обработки ), если командную строку невозможно собрать, утилиту нельзя вызвать, это вызов утилиты завершается по сигналу, или вызов утилиты выходит со значением 255.

Предположительно ваш отказ, выход щего со статусом 255.


Лично Я бы не стал беспокоиться об этом xargs; вы ничего не делаете (например, распараллеливание или ввод нескольких имен хостов в командной строке), это особенно полезно.

while read -r name <&3; do 
    echo "$name"; ssh -o ConnectTimeout=3 [email protected]"$name" "openssl version" ||: 
done 3<servers.txt 

Это использует дескриптор файла 3 для чтения файла servers.txt так STDIN остается на его значение по умолчанию.


Кстати, если бы я писал код, чтобы использовать xargs, я бы сделал это так:

xargs sh -c 'for host; do ssh -o ConnectTimeout=3 [email protected]"$host" "openssl version" </dev/null' _ <servers.txt 

Таким образом, вы, имеющие xargs передать список хостов к каждому вызову оболочки, а не к одной оболочке на хост.

+0

удивительный, не знал, что о xargs, спасибо! – bruchowski

+0

Я бы поменял цикл на 'для имени в $ ( anishsane

+0

'do command anishsane

-1

в основном вам нужно поЬир

"имя-команды поЬир &" или

"поЬир/путь/к/имя-команды arg1 arg2 &"

Вы также сериализовать к серверам. txt, и я бы подумал, что вам может понравиться , чтобы запустить foreach() в контенте, запуская каждый в фоновом режиме.

HOWEVER, что создает вторичный вопрос о том, как получить ваши результаты? (подсказка: добавление к фиксированному имени results.log)

+0

Проблема заключается не в соединении SSH, которое запускается xargs при выходе, это соединение SSH создается путем выхода xargs. –

0

Использование GNU Parallel который сделан для такого рода работы:

parallel -j0 --retries 3 --slf servers --nonall --timeout 1000% --tag openssl version 

Вам нужно будет предварять «MyUserName @» линий в ' серверов или использовать «User myusername» в ~/.ssh/config.

 Смежные вопросы

  • Нет связанных вопросов^_^