У меня есть локальный компьютер, который должен сделать сеанс SSH с удаленной master
машиной, а затем еще один внутренний сеанс SSH от master
каждого до некоторого удаленного slaves
, а затем выполнить 2 команды, т.е. удалить конкретный каталог и воссоздать его.
Обратите внимание, что локальный компьютер имеет SSH без пароля для ведущего, а мастер имеет SSH без пароля для подчиненных. Кроме того, все имена хостов известны .ssh/config
на локальных / главных машинах, а имена хостов подчиненных slaves.txt
локально, и я читаю их оттуда.
Так что я делаю и работаю так:
username="ubuntu"
masterHostname="myMaster"
while read line
do
#Remove previous folders and create new ones.
ssh -n $username@$masterHostname "ssh -t -t $username@$line "rm -rf Input Output Partition""
ssh -n $username@$masterHostname "ssh -t -t $username@$line "mkdir -p EC2_WORKSPACE/$project Input Output Partition""
#Update changed files...
ssh -n $username@$masterHostname "ssh -t -t $username@$line "rsync --delete -avzh /EC2_NFS/$project/* EC2_WORKSPACE/$project""
done < slaves.txt
Этот кластер находится на Amazon EC2, и я заметил, что на каждой итерации создается 6 сессий SSH, что вызывает значительную задержку. Я хотел бы объединить эти 3 команды в 1, чтобы получить меньше соединений SSH. Поэтому я попытался объединить первые две команды в
ssh -n $username@$masterHostname "ssh -t -t $username@$line "rm -rf Input Output Partition && mkdir -p EC2_WORKSPACE/$project Input Output Partition""
Но это не работает, как ожидалось. Кажется, он выполняет первый ( rm -rf Input Output Partition
), а затем выходит из сеанса и продолжается. Что я могу сделать?
источник
-J
опцию, которая будет определять ваш прыжковый хост.Ответы:
Считайте, что
&&
это логический оператор. Это не означает «также выполнить эту команду», это означает «выполнить эту команду, если другая преуспела».Это означает, что если
rm
команда не выполнена (что произойдет, если какой-либо из трех каталогов не существует), то командаmkdir
не будет выполнена. Это не похоже на поведение, которое вы хотите; если каталоги не существуют, вероятно, их можно создать.использование
;
Точка с запятой
;
используется для разделения команд. Команды выполняются последовательно, ожидая каждой, прежде чем перейти к следующей, но их успех или неудача не влияют друг на друга.Escape внутренние кавычки
Кавычки внутри других кавычек следует избегать, в противном случае вы создаете дополнительную конечную точку и начальную точку. Ваша команда:
становится:
Ваша текущая команда из-за отсутствия экранированных кавычек должна выполняться:
если это удастся:
Вы заметите, что подсветка синтаксиса показывает всю команду красным цветом, что означает, что вся команда является строкой, передаваемой в ssh. Проверьте свой локальный компьютер; у вас могут быть каталоги
Input
Output
иPartition
где вы работали.источник
&
команды причин для запуска INT он фона, а это значит , они не будут дождались до конца , прежде чем перейти на следующий.Вы всегда можете определить в своем Jumpbox мультиплексирование в OpenSSH
Для этого сделайте в
/etc/ssh/ssh_config
:Таким образом, любые последовательные подключения к одному и тому же серверу в следующие 30 минут будут выполняться с использованием предыдущего ssh-соединения.
Вы также можете определить его для машины или группы машин. Взято по предоставленной ссылке.
источник
/tmp/
.man ssh
,ControlPath
,ControlMaster
иControlPersist
являются действительными варианты , чтобы передатьssh
команду , используя-o
. Может быть, даже более точный вариант использования, настройте мультиплексирование в первомssh
сценарии и перезапустите его для других, но в противном случае избегайте снижения производительности. Интересно, что эталон мультиплексирования VS не для 3 SSH-соединений, учитывая, что «Существует также значительная задержка при открытии нового соединения»Вы можете поместить все свои команды в отдельный скрипт на своем «главном» сервере.
Мастер сценарий
Тогда в вашем скрипте ssh назовите это так: SSH Script
ИЛИ, если все файлы должны быть на исходной машине, вы можете сделать что-то вроде этого:
script1
Скрипт2
скрипт ssh
источник
Некоторое время назад у меня была возможность использовать контрольные сокеты, как рекомендуют другие ответы (этот ответ по сути представляет собой комбинацию использования контрольных сокетов, таких как этот ответ, и сценариев, подобных этому ответу ).
Вариант использования был взломом:
authorized_keys
целевой пользователь периодически перезаписывал запланированное задание, и я хотел быстро протестировать вещи, не проходя волокиту, необходимую для добавления чего-либо в этот файл. Так что я бы настроил цикл while, который добавил ключ к этому файлу по мере необходимости, запустил мой тест и отменил цикл. Тем не менее, было бы небольшое окно, в котором запланированное задание перезаписывало файл, и мой цикл все ещеsleep
работал. Итак, установка управляющего сокета при запуске позволит моему скрипту SSH позже без проблем:Где
setup-ssh.sh
находится:И
.ssh-config
:И
run-test.sh
:Последовательность выглядит следующим образом:
setup-ssh.sh
.setup-ssh.sh
занят-зацикливает серверы до тех пор, пока на всех из них не будет настроен сокет управления.hosts
Файл просто перечисляет сервер имен хостов по одному в каждой строке.${CONFIG_DIR}/scripts/.ssh-config
указан управляющий сокет, присутствует только в том случае , если я не укажу этот файл с помощью-F
, соединения SSH не будут его использовать. Так что это позволяет мне использовать контрольный сокет только там, где он мне нужен, используяF
опцию.xargs
для распределения рабочей нагрузки по серверам, начиная новые задания, как только выполняются выполняемые.источник