Некоторое время назад у меня была возможность использовать управляющие сокеты, как рекомендуют другие ответы (этот ответ, по сути, представляет собой комбинацию использования управляющих сокетов, таких как этот ответ и скриптов, таких как этот ответ ).
Примером использования был взлом :Файл authorized_keys
целевого пользователя периодически перезаписывался запланированным заданием, и я хотел быстро протестировать вещи, не проходя через красную -ленту, необходимую для добавления чего-то в этот файл. Поэтому я бы настроил цикл while, который добавлял ключ в этот файл по мере необходимости, запускал мой тест и отменял цикл. Однако было бы небольшое окно, в котором запланированная задача перезаписала бы файл, и мой цикл все еще продолжал бы sleep
. Так,установка управляющего сокета в начале позволила бы моему сценарию SSH без проблем работать позже:
#! /bin/bash -xe
. "${CONFIG_DIR}/scripts/setup-ssh.sh"
# Build and test
export TEST_LABEL="${_started_by}-${BUILD_TAG%-BUILD*}"
#...
xargs --arg-file test-list \
--no-run-if-empty \
--process-slot-var=NUM \
--max-procs=${#SERVERS[@]} \
--max-args="${BATCH_SIZE:-20}" \
"${CONFIG_DIR}/scripts/run-test.sh"
Где setup-ssh.sh
это:
export SSH_CONFIG="${CONFIG_DIR}/scripts/.ssh-config"
mapfile -t SERVERS < "${CONFIG_DIR}/scripts/hosts"
for SERVER in "${SERVERS[@]}"
do
while ! ssh -F "${SSH_CONFIG}" "${SERVER}" -fnN; do sleep 1; done
scp -F "${SSH_CONFIG}" "${CONFIG_DIR}/scripts/ssh-script.sh" "${SERVER}":"${TEST_LABEL}.sh"
done
И.ssh-config
:
Host test-*
User test
StrictHostKeyChecking no
ControlMaster auto
ControlPath /tmp/ssh-%h-%p-%r
Иrun-test.sh
:
mapfile -t TEST_SERVERS < "${CONFIG_DIR}/scripts/hosts"
ssh -F "${SSH_CONFIG}" "${TEST_SERVERS[$NUM]}" "./${TEST_LABEL}.sh"
Последовательность выглядит следующим образом:
setup-ssh.sh
. setup-ssh.sh
busy -зацикливает серверы до тех пор, пока на всех них не будет настроен контрольный сокет. Файл hosts
просто перечисляет имена хостов серверов по одному в строке. ${CONFIG_DIR}/scripts/.ssh-config
, пока я не укажу этот файл с помощью -F
, соединения SSH не будут его использовать. Таким образом, это позволяет мне использовать управляющий сокет только там, где он мне нужен, используя опцию F
. xargs
для распределения рабочей нагрузки по серверам, запуская новые задания, как только заканчиваются запущенные. Я предполагаю, что edc-web-local
является примером псевдонима. Единственный способ заставить его работать - добавить bash -ic
перед командой:
screen -t SHELL 0 bash -ic edc-web-local
.. и тот же трюк для других команд псевдонимов
-c
сообщает, что следующий аргумент (, который не является опцией ), является командой для выполнения. -i
сообщает, что оболочка работает в «интерактивном» режиме, что означает, что она включает разрешение псевдонимов и загружает ~/.bashrc
(, который обычно загружает~/.bash_aliases
).