2015-08-12 3 views
2

Мне нужно вызвать код на большом количестве хостов через ssh.Методы передачи в heredocs

Я попытался использовать так называемый heredocs.

function verifyFiles { 
    ... 
} 

... 

ssh [email protected]$server <<-SSH 
    cd $DIRECTORY 
    verifyFiles 
    createSum 
    copyFiles 
SSH 

ssh [email protected] <<-SSH 
    cd $DIRECTORY 
    verifyFiles 
    verifySums 
SSH 
... 

К сожалению, используемые функции этого способа не известны на стороне сервера.

Есть ли элегантный способ использования этих функций без вставки их в каждый heredoc?

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

PS2. Конечно, мне не нужно использовать heredocs, если есть лучший способ вызвать этот код.

+0

Пожалуйста, найдите минутку, чтобы подумать о том, как это должно работать. Вы определили функцию на своей локальной машине, но собираетесь ее удаленно выполнить. – hek2mgl

+0

Конечно, я сделал. Я понимаю, почему он не может работать таким образом. Я просто понятия не имею, как достичь своей цели элегантный и короткий путь, не повторяя код. – aerion

+0

Кажется, я неправильно читал, вам нужен способ шаблона кода, а не текст, поэтому мой предыдущий комментарий не подходит –

ответ

1

Если у вас есть локальная функция fooX удаленно выполнять на каждом hostX, можно определить и выполнить его с помощью ssh на соответствующем хосте, как это:

#!/bin/bash 

function foo1() { 
    echo foo 
} 

function foo2() { 
    echo f0o 
} 

function remotefn() { 
    # echo the function definition: 
    type "$1" | tail -n +2 
    # echo the function call: 
    echo "$1" 
} 

while read user host fn 
do 
    # remotely execute function definition and the function itself: 
    remotefn "$fn" | ssh "$user"@"$host" 
done <<END 
user1 host1 foo1 
user2 host2 foo2 
END 

Обратите внимание, как Heredoc после цикла гибко отображает функции для пользователей и хостов. ssh будет считывать и выполнять каждое определение функции и вызов функции, предоставляемый remotefn на соответствующем хосте.

0

Поскольку здесь-документы проходят различные расширения, вы можете достичь своей цели с подстановки параметров вместо вызова функции:

VERIFYFILES='ls; df' 

ssh [email protected]$server <<-SSH 
    cd $DIRECTORY 
    $VERIFYFILES 
SSH 
+0

Это ломается, когда функции нуждаются в доступе к переменным или параметрам, хотя, к сожалению, это довольно ограниченное использование. – tripleee

+0

Достаточно честный. Но код OP не делает, и я всегда буду идти на низкотехнологичное, не-ракетное решение, если оно есть. :-) – Jens

1

Как насчет этого?

funs=' 
    foo() { echo "foo"; } 
    bar() { local a; for a in "[email protected]"; do echo "$a"; done; } 
' 
# eval "$funs" # if you want the functions locally as well 
ssh [email protected]$server1 <<-____HERE 
    cd $DIRECTORY 
    $funs 
    foo && bar some args 
____HERE 

Не особенно счастливое решение, но я считаю, что оно удовлетворяет вашим требованиям.

+0

Не очень элегантное решение, потому что функции хранятся в форме строки. Но, хм ... все написано только один раз, и это работает. – aerion

+0

После того, как я подумал, что я «непринятый», возможно, есть лучший способ дистанционно использовать предопределенные функции на многих хостах. – aerion

+0

У вас может быть файл, который вы «scp', а затем источник, но на самом деле он ничего не покупает, кроме случаев, когда вам нужно более сложное цитирование в функциях (в этом случае их использование в виде строк станет громоздким и/или небезопасно). – tripleee

Смежные вопросы