Как выполнить псевдоним из оболочки, определенной в .screenrc?

Некоторое время назад у меня была возможность использовать управляющие сокеты, как рекомендуют другие ответы (этот ответ, по сути, представляет собой комбинацию использования управляющих сокетов, таких как этот ответ и скриптов, таких как этот ответ ).

Примером использования был взлом :Файл 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.shbusy -зацикливает серверы до тех пор, пока на всех них не будет настроен контрольный сокет. Файл hostsпросто перечисляет имена хостов серверов по одному в строке.
  • Поскольку конфигурация, определяющая сокет управления, находится только в ${CONFIG_DIR}/scripts/.ssh-config, пока я не укажу этот файл с помощью -F, соединения SSH не будут его использовать. Таким образом, это позволяет мне использовать управляющий сокет только там, где он мне нужен, используя опцию F.
  • Сценарий установки также копирует на серверы сценарий выполнения теста. Сам сценарий выполнения содержит набор команд, и, поскольку я скопировал сценарий выполнения, мне не нужно беспокоиться о дополнительном уровне цитирования для SSH (и дополнительных когнитивных издержках для выяснения того, что расширяется, когда ).
  • Затем основной сценарий использует xargsдля распределения рабочей нагрузки по серверам, запуская новые задания, как только заканчиваются запущенные.

1
26.09.2019, 21:39
1 ответ

Я предполагаю, что edc-web-localявляется примером псевдонима. Единственный способ заставить его работать - добавить bash -icперед командой:

screen -t SHELL 0 bash -ic edc-web-local

.. и тот же трюк для других команд псевдонимов

-cсообщает, что следующий аргумент (, который не является опцией ), является командой для выполнения. -iсообщает, что оболочка работает в «интерактивном» режиме, что означает, что она включает разрешение псевдонимов и загружает ~/.bashrc(, который обычно загружает~/.bash_aliases).

1
28.01.2020, 00:00

Теги

Похожие вопросы