1:

1:

Я ищу способ передачи конфигурации с одной центральной машины на несколько удаленных машин без необходимости установки чего-либо на удаленных машинах.

Цель состоит в том, чтобы сделать что-то вроде того, что вы найдете с помощью инструментов вроде cfengine, но на наборе машин, на которых не установлены агенты. Это может быть на самом деле хорошей техникой настройки cfagentна наборе существующих удаленных машин.

решение1

Вы можете передать скрипт и заставить его выполняться эфемерно, передав его по конвейеру и выполнив оболочку.

например

echo "ls -l; echo 'Hello World'" | ssh me@myserver /bin/bash

Естественно, эту "ls -l; echo 'Hello World'"часть можно заменить скриптом bash, сохраненным в файле на локальной машине.

например

cat script.sh | ssh me@myserver /bin/bash

Ваше здоровье!

решение2

Есть несколько способов сделать это.

1:

ssh user@remote_server 'bash -s' < localfile

2:

cat localfile  | ssh user@remote_server

3:

ssh user@remote_server "$(< localfile)"

Номер 3 — мой предпочтительный способ, он позволяет выполнять интерактивные команды, напримерsudo -S service nginx restart

(#1 и #2 будут использовать остальную часть скрипта в качестве входных данных для вопроса пароля, когда вы используете sudo -S.)

решение3

Я бы рекомендовал использовать Fabric Python для этой цели:

#!/usr/bin/python
# ~/fabfile.py

from fabric_api import *

env.hosts = ['host1', 'host2']
def deploy_script():
    put('your_script.sh', 'your_script.sh', mode=0755)
    sudo('./your_script.sh')

# from shell
$ fab deploy_script

Вы должны быть в состоянии использовать вышеизложенное, чтобы начать. Проконсультируйтесь с Fabric's greatдокументациядля выполнения всего остального. В качестве дополнения, вполне возможно написать свой скрипт целиком в Fabric — копирование не требуется, однако следует отметить, что для изменения скрипта на всех машинах вам нужно будет только отредактировать локальную копию и повторно развернуть. Кроме того, с использованием API, немного большим, чем просто базовое, вы можете изменить скрипт на основе того, на каком хосте он в данный момент запущен и/или других переменных. Это своего рода Expect на Python.

решение4

Как объяснено вэтот ответвы можете использоватьхередок:

ssh user@host <<'ENDSSH'
#commands to run on remote host
ENDSSH

С heredoc нужно быть осторожнее, потому что он просто отправляет текст, но не ждет ответа. Это значит, что он не будет ждать выполнения ваших команд.

Связанный контент