Подтвердить что ты не робот

Shell script: выполнить функцию из script поверх ssh

Есть ли какой-нибудь умный способ запустить локальную функцию Bash на удаленном хосте по ssh?

Например:

#!/bin/bash
#Definition of the function
f () {  ls -l; }

#I want to use the function locally
f

#Execution of the function on the remote machine.
ssh [email protected] f

#Reuse of the same function on another machine.
ssh [email protected] f

Да, я знаю, что это не сработает, но есть ли способ достичь этого?

4b9b3361

Ответ 1

Вы можете использовать команду typeset, чтобы ваши функции были доступны на удаленном компьютере с помощью ssh. В зависимости от того, как вы хотите запустить удаленный script, есть несколько вариантов.

#!/bin/bash
# Define your function
myfn () {  ls -l; }

Чтобы использовать функцию на удаленных хостах:

typeset -f myfn | ssh [email protected] "$(cat); myfn"
typeset -f myfn | ssh [email protected] "$(cat); myfn"

Еще лучше, зачем беспокоиться о трубе:

ssh [email protected] "$(typeset -f myfn); myfn"

Или вы можете использовать HEREDOC:

ssh [email protected] << EOF
    $(typeset -f myfn)
    myfn
EOF

Если вы хотите отправить все функции, определенные в script, а не только myfn, просто используйте typeset -f так:

ssh [email protected] "$(typeset -f); myfn"

Объяснение

typeset -f myfn отобразит определение myfn.

cat получит определение функции в виде текста, а $() выполнит ее в текущей оболочке, которая станет определенной функцией в удаленной оболочке. Наконец, функция может быть выполнена.

Последний код поместит определение функций inline перед выполнением ssh.

Ответ 2

Я лично не знаю правильного ответа на ваш вопрос, но у меня есть множество сценариев установки, которые просто копируют себя с помощью ssh.

Попросите команду скопировать файл, загрузить функции файла, запустить функции файла, а затем удалить файл.

ssh [email protected] "scp [email protected]:/myFile ; . myFile ; f ; rm Myfile"

Ответ 3

Другой способ:

#!/bin/bash
# Definition of the function
foo () {  ls -l; }

# Use the function locally
foo

# Execution of the function on the remote machine.
ssh [email protected] "$(declare -f foo);foo"

declare -f foo напечатать определение функции