Кратчайший код оболочки для запуска и traceroute, и traceroute6 - PullRequest
0 голосов
/ 06 января 2019

Я хотел бы запустить одновременно traceroute -w2 и traceroute6 -w2 в сценарии оболочки, чтобы опробовать несколько разных хостов.

Наивный подход может просто использовать временную переменную, чтобы собрать все хосты внутри (например, установить HOSTS в ordns.he.net one.one.one.one google-public-dns-a.google.com), а затем просто передать ее по отдельности каждой команде, например, echo $HOSTS | xargs -n1 traceroute -w2 и др., Но в tcsh это будет работать иначе, чем в bash, и может привести к ошибкам, если вы захотите добавить больше команд (как если бы вы добавляли их как код, а не как список действий), и я Я думаю, что есть какой-то лучший способ объединить список команд (например, имя команды с одним параметром) со списком аргументов (например, имена хостов в нашем примере), чтобы оболочка выполняла все возможные комбинации.

Я пытался создать комбинацию xargs -n1 (для хостов) и xargs -n2 (для команд с одним параметром), соединяя друг с другом, но это не имело особого смысла и не работало.

Я ищу решение, которое не использует никаких инструментов GNU и работало бы в базовой установке OpenBSD (при необходимости perl является частью базовой OpenBSD, поэтому оно также доступно).

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Если у вас есть Perl:

perl -e 'for(@ARGV){ print qx{  traceroute -w2 -- $_; traceroute6 -w2 -- $_ } }' google.com debian.org

Что касается лучшего способа объединить список команд (например, имя команды с одним параметром) со списком аргументов (например, имен хостов), то ответом может быть GNU Parallel, который построен именно для этого :

parallel "{1}" -w2 -- "{2}" ::: traceroute traceroute6 ::: google.com debian.org

Если вам нужны специальные аргументы, связанные с каждой командой, вы можете сделать:

parallel eval "{1}" -- "{2}" ::: "traceroute -a -w2" "traceroute6 -w2" ::: google.com debian.org

eval необходим, потому что GNU Parallel заключает в кавычки все входные данные, и, хотя вы обычно этого хотите, мы не хотим этого в этом случае.

Но так как это инструмент GNU, он выходит за рамки вашего вопроса. Это включено только для других людей, которые читают ваш вопрос и не имеют этого ограничения.

0 голосов
/ 06 января 2019

Проще говоря:

#!/bin/sh
set -- host1 host2 host3 host4 ...
for host do traceroute -w2 -- "$host"; done
for host do traceroute6 -w2 -- "$host"; done
...