Как запустить функцию на удаленном сервере, используя s sh и ожидать? - PullRequest
0 голосов
/ 29 марта 2020

Мне нужно запустить функцию на удаленном сервере через S SH. Я использую ожидаю, чтобы автоматизировать вход на удаленный сервер. На удаленной машине я могу запустить команду, локальные скрипты, но функция не работает. Я получаю "bash: foo: команда не найдена". Возможно, определение функции не отправляется на удаленный сервер так же, как отправляется команда. Вот мой сценарий:

#!/bin/bash

foo(){ ls -la; }    # to run in remote machine

cmd="ls -la"
func="foo"

ip='1.2.3.4'
pass='abcd'

export ip pass cmd func

    /usr/bin/expect <(cat <<-'EOF'
    set timeout 60

    # spawn ssh -t $::env(ip) "ls -la"          # Working
    # spawn ssh -t $::env(ip) $::env(cmd)       # Working
    # spawn ssh -t $::env(ip) $::env(func)      # Not working; bash: foo: command not found
    # spawn ssh -t $::env(ip) "$(typeset -f $::env(func)); $::env(func)"    # Not working
        expect {
            "yes/no" {
                send "yes\r"
                exp_continue
            }
            "*assword*" { send "$::env(pass)\r" }
        }
        interact
    EOF
    )

echo -e "\nDone."

Возможно ли запустить функцию на удаленном компьютере, используя ssh / Ожидается?

1 Ответ

0 голосов
/ 29 марта 2020

Работает после сохранения всей функции в переменной (в виде строки) и последующего ее экспорта.

func='foo(){
    hostname;
    ls -la;
    date; }'

Используя typeset Я могу выполнить эту функцию на удаленном хосте через ssh. Поскольку определение функции не было доступно внутри expect, оно не сработало.

Вот мой полный сценарий:

#!/bin/bash

func='foo(){
    hostname;
    ls -la;
    date; }'

ip='1.2.3.4'
pass='abcd'

export func ip pass

    /usr/bin/expect <(cat <<-'EOF'
    set timeout 60

    spawn ssh $::env(ip) "$::env(func); foo"

        expect {
            "yes/no" {
                send "yes\r"
                exp_continue
            }
            "*assword*" { send "$::env(pass)\r" }
        }

        interact

    EOF
    )

echo -e "\nDone."

Решение отлично работает, но мне кажется глупым. Надеясь, что кто-то может дать лучшую альтернативу.

...