LINUX.ORG.RU

Подскажите пожалуйста по bash скрипту

 , ,


0

1

В общем написал скрипт, хочу понять, как это всё сделать в массиве одной строчкой, а не плодить бесконечные команды. Есть около 20 серверов, на них нужно запускать переодически определённый скрипт, IP и количество серверов меняются. Вот что я написал:

#!/bin/bash
USER="user"
PWD="password"
IP1="ip1"
IP2="ip2"
IP3="ip3"

echo "Сервер №1 - $IP1"
sshpass -p $PWD ssh -o StrictHostKeyChecking=no $USER@$IP1 'wget https://www/auto.bash'
sshpass -p $PWD ssh $USER@$IP1 'bash auto.bash'
echo "Сервер №2 - $IP2"
sshpass -p $PWD ssh -o StrictHostKeyChecking=no $USER@$IP2 'wget https://www/auto.bash'
sshpass -p $PWD ssh $USER@$IP2 'bash auto.bash'
echo "Сервер №3 - $IP3"
sshpass -p $PWD ssh -o StrictHostKeyChecking=no $USER@$IP3 'wget https://www/auto.bash'
sshpass -p $PWD ssh $USER@$IP3 'bash auto.bash'

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

Что-нибудь в духе

#!/bin/sh

USER="user"
PWD="password"

bump() {
echo "Сервер - $1"
sshpass -p $PWD ssh -o StrictHostKeyChecking=no $USER@$1 'wget https://www/auto.bash'
sshpass -p $PWD ssh $USER@$1 'bash auto.bash'
}

bump ip1
bump ip2
bump ip3
luka83
()
for ip in ${ip1} ${ip2} ${ip3}; do
    echo "${ip}"
done

Переменные и команды подставить самостоятельно.

Ivan_qrt ★★★★★
()
Ответ на: комментарий от beastie

Нет такой возможности к сожалению. Слишком много ключей придётся хранить, вообще запутаюсь тогда. =(

Galka13
() автор топика
Ответ на: комментарий от luka83
USER="user"
PWD="password"

bump() {
echo "Сервер - $1"
sshpass -p $PWD ssh -o StrictHostKeyChecking=no $USER@$1 'wget https://www/auto.bash'
sshpass -p $PWD ssh $USER@$1 'bash auto.bash'
}

bump 192.168.1.1
bump 192.168.1.2
bump 192.168.1.3
>>>> бесконечность? Так?
Galka13
() автор топика

Есть около 20 серверов, на них нужно запускать переодически определённый скрипт, IP и количество серверов меняются.

Для таких задач был придуман Rex.

anonymous
()
Ответ на: комментарий от Galka13

Где какие ключи хранить? На мастер-сервере хранится один его ключ, на слейвах он же прописывается в authorized_keys.

firkax ★★★★★
()

Решения как убрать повторяющиеся строка уже предложили (даже два), не буду повторяться.

Но тут ещё можно доработать:

1) замени

#!/bin/bash
на
#!/bin/sh

2) у тебя ssh запускается два раза, с разными опциями, видимо

-o StrictHostKeyChecking=no
не нужно, раз вторая команда без него работает; так вот, можно его вызывать 1 раз а wget и bash через точку с запятой перечислить в передаваемой команде, или через &&

3) допиши ключ -O wget-у, а то он будет мусорить auto.bash.1 auto.bash.2 итд

4) вместо wget-а можно использовать

cat > auto.bash
и давать его на вход ssh-клиенту (не знаю будет ли с sshpass работать но он не нужен всё равно, лучше ключи)

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

сделать на много короче

«Намного», слитно, либо «на много чего-нибудь короче», раздельно.

anonymous
()

кто вас таких к серверам пускает?

anonymous
()
Ответ на: комментарий от Galka13

Не совсем понимаю какая милая скромность. как бы понимаю, но не совсем. но я понимаю, я учил, честно.

anonymous
()
Ответ на: комментарий от Galka13

Ключи или пароли. Если проще, зачем мучать попу больше?

beastie ★★★★★
()

Есть подозрение, что вам нужен ansible, но если ansible страшно, используйте pdsh.

pinus_nigra
()
Ответ на: комментарий от Borifed

Всем спасибо, разобрался. Всё заработало.

Galka13
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.