Нужно написать некоторую проверку статуса в bash-скрипте:

Есть файл с такими строками:

domain.com; 111.111.111.111,222.222.222.222; /link/to/somefile.js,/link/to/somefile2.js
domain2.com; 122.122.111.111,211.211.222.222; /link/to/somefile2.js,/link/to/somefile3.js

Всего необходимо выполнить такие команды:

curl -s -I -H 'Host: domain.com' http://111.111.111.111/link/to/somefile.js
curl -s -I -H 'Host: domain.com' http://222.222.222.222/link/to/somefile.js

curl -s -I -H 'Host: domain.com' http://111.111.111.111/link/to/somefile2.js
curl -s -I -H 'Host: domain.com' http://222.222.222.222/link/to/somefile2.js

curl -s -I -H 'Host: domain2.com' http://122.122.111.111/link/to/somefile2.js
curl -s -I -H 'Host: domain2.com' http://211.211.222.222/link/to/somefile2.js

curl -s -I -H 'Host: domain2.com' http://122.122.111.111/link/to/somefile3.js
curl -s -I -H 'Host: domain2.com' http://211.211.222.222/link/to/somefile3.js

Вопрос в том:

  1. какой инструмент мне нужно использовать, чтобы получить такой результат в целом?
  2. Может быть, xargs с некоторыми аргументами / флагами сможет это сделать или gnu parallel?
  3. Не могли бы вы привести примеры?

Я могу разделить строки и установить результат для разных переменных, что совсем не проблема:

domain=$(cut -d';' -f1 file| xargs -I N -d "," echo curl -H) \'N\'
ip=$(cut -d';' -f2 file| xargs -I N -d "," echo curl -H) \'N\'
and else

Но вопрос в другом :): как после разграничения и разделения строк на переменные я могу выполнить curl с разными переменными в таком случае - количество аргументов для разных переменных будет разным?

Ответ в том, что получить Barmar, вообще не касается проблемы задачи, потому что у него больше двух списков. Проблема не в незнании bash, а в том, как я могу решить проблему

1
Kein 20 Сен 2018 в 17:58

2 ответа

Лучший ответ
#!/usr/bin/env bash
#              ^^^^- IMPORTANT: not /bin/sh

# print command instead of running it, so people can test their answers without real URLs
log_command() { printf '%q ' "$@"; printf '\n'; }

while IFS='; ' read -r domain addrs_str files_str; do
  IFS=, read -a addrs <<<"$addrs_str"
  IFS=, read -a files <<<"$files_str"
  for file in "${files[@]}"; do
    for addr in "${addrs[@]}"; do
      log_command curl -s -I -H "Host: $domain" "http://$addr/$file"
    done
  done
done

... выдает как вывод (как список команд, если бы он был запущен, если бы был удален префикс log_command):

curl -s -I -H Host:\ domain.com http://111.111.111.111//link/to/somefile.js 
curl -s -I -H Host:\ domain.com http://222.222.222.222//link/to/somefile.js 
curl -s -I -H Host:\ domain.com http://111.111.111.111//link/to/somefile2.js 
curl -s -I -H Host:\ domain.com http://222.222.222.222//link/to/somefile2.js 
curl -s -I -H Host:\ domain2.com http://122.122.111.111//link/to/somefile2.js 
curl -s -I -H Host:\ domain2.com http://211.211.222.222//link/to/somefile2.js 
curl -s -I -H Host:\ domain2.com http://122.122.111.111//link/to/somefile3.js 
curl -s -I -H Host:\ domain2.com http://211.211.222.222//link/to/somefile3.js 

... как вы можете видеть на странице https://ideone.com/dTC8q8


Как это работает?

0
Charles Duffy 20 Сен 2018 в 16:51

С GNU Parallel это будет выглядеть так

doit() {
  domain="$1"
  ips="$2"
  paths="$3"
  parallel --dry-run -d ',' -q curl -s -I -H Host:\ "$domain" http://{1}/{2} ::: "$ips" ::: "$paths"
}
export -f doit
parallel --colsep ';' doit :::: input.file

Удалите --dry-run, когда убедитесь, что он работает.

0
Ole Tange 21 Сен 2018 в 09:50