Написать оболочку script в ssh на удаленную машину и выполнить команды
У меня есть два вопроса:
- Существует несколько удаленных Linux-машин, и мне нужно написать оболочку script, которая будет выполнять тот же набор команд на каждой машине. (Включая некоторые операции sudo). Как это можно сделать с помощью сценариев оболочки?
- Когда ssh'ing на удаленном компьютере, как обращаться, когда он запрашивает аутентификацию отпечатка RSA.
Удаленные компьютеры - это виртуальные машины, созданные на ходу, и у меня есть только их IP-адреса. Поэтому я не могу разместить файл script заранее на этих машинах и выполнить их с моей машины.
Ответы
Ответ 1
Существует несколько удаленных Linux-машин, и мне нужно написать оболочку script, которая будет выполнять тот же набор команд на каждом компьютере. (Включая некоторые операции sudo). Как это можно сделать с помощью сценариев оболочки?
Вы можете сделать это с помощью ssh, например:
#!/bin/bash
USERNAME=someUser
HOSTS="host1 host2 host3"
SCRIPT="pwd; ls"
for HOSTNAME in ${HOSTS} ; do
ssh -l ${USERNAME} ${HOSTNAME} "${SCRIPT}"
done
Когда ssh'ing на удаленном компьютере, как обращаться, когда он запрашивает аутентификацию отпечатка RSA.
Вы можете добавить опцию StrictHostKeyChecking=no
в ssh:
ssh -o StrictHostKeyChecking=no -l username hostname "pwd; ls"
Это будет отключить проверку ключа хоста и автоматически добавить ключ хоста в список известных хостов. Если вы не хотите, чтобы хост добавлен в файл известных хостов, добавьте опцию -o UserKnownHostsFile=/dev/null
.
Обратите внимание, что этот отключает определенные проверки безопасности, например защиту от атаки "человек-в-середине". Поэтому он не должен применяться в чувствительной к безопасности среде.
Ответ 2
Существует несколько способов справиться с этим.
Мой любимый способ - установить http://pamsshagentauth.sourceforge.net/ в удаленных системах, а также ваш собственный открытый ключ. (Подумайте, как установить их на виртуальной машине, каким-то образом у вас установлена вся система Unix, что еще несколько файлов?)
При пересылке вашего агента ssh вы можете войти в систему без пароля.
И даже лучше, что модуль pam будет аутентифицироваться для sudo с вашей парой ключей ssh, чтобы вы могли работать с правами root (или любыми другими пользователями) по мере необходимости.
Вам не нужно беспокоиться о взаимодействии с ключом хоста. Если вход не является терминалом, тогда ssh просто ограничит вашу способность пересылать агенты и аутентифицировать пароли.
Вы также должны посмотреть в пакеты как Capistrano. Определенно осмотрите этот сайт; он имеет введение в удаленный сценарий.
Личные script строки могут выглядеть примерно так:
ssh remote-system-name command arguments ... # so, for exmaple,
ssh target.mycorp.net sudo puppet apply
Ответ 3
Установите sshpass с помощью apt-get install sshpass
, затем отредактируйте script и поместите свои IP-адреса, имена пользователей и пароль в Linux в соответствующем порядке. После этого запустите script. Это оно! Этот script установит VLC во всех системах.
#!/bin/bash
SCRIPT="cd Desktop; pwd; echo -e 'PASSWORD' | sudo -S apt-get install vlc"
HOSTS=("192.168.1.121" "192.168.1.122" "192.168.1.123")
USERNAMES=("username1" "username2" "username3")
PASSWORDS=("password1" "password2" "password3")
for i in ${!HOSTS[*]} ; do
echo ${HOSTS[i]}
SCR=${SCRIPT/PASSWORD/${PASSWORDS[i]}}
sshpass -p ${PASSWORDS[i]} ssh -l ${USERNAMES[i]} ${HOSTS[i]} "${SCR}"
done
Ответ 4
Если вы можете написать Perl-код, вам следует рассмотреть возможность использования Net:: OpenSSH:: Parallel.
Вы могли бы описать действия, которые должны выполняться на каждом узле декларативным образом, и модуль позаботится обо всех страшных деталях. Также поддерживаются команды с помощью sudo
.
Ответ 5
Для такого рода задач я многократно использую Ansible, который позволяет согласованно дублировать скрипты bash в нескольких контейнерах или виртуальных машинах. Ansible (точнее, Red Hat) теперь имеет дополнительный веб-интерфейс AWX, который является версией их коммерческой башни с открытым исходным кодом.
Ansible: https://www.ansible.com/
AWX: https://github.com/ansible/awx
Ansible Tower: коммерческий продукт, вы, вероятно, впервые исследуете бесплатный AWX с открытым исходным кодом, а не 15-дневный бесплатный маршрут Tower
Ответ 6
Вы можете следовать этому подходу:
- Подключитесь к удаленному компьютеру с помощью Ожидайте Script. Если ваша машина не поддерживает ожидание, вы можете загрузить ее. Письмо Ожидание script очень просто (google, чтобы получить справку об этом)
- Поместите все действия, которые необходимо выполнить на удаленном сервере в оболочке script.
- Вызов удаленной оболочки script из ожидаемого script после успешного входа в систему.