【问题标题】:How to run function in remote server using ssh and expect?如何使用 ssh 在远程服务器中运行功能并期望?
【发布时间】:2020-03-30 02:45:50
【问题描述】:

我需要通过 SSH 在远程服务器上运行一个函数。我正在使用期望自动登录到远程服务器。在远程机器上,我可以运行命令、本地脚本,但功能不起作用。我得到“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/expect 在远程机器上运行函数?

【问题讨论】:

  • export 不能跨 ssh 工作。
  • @pynexj 我使用 export 使 bash 变量在 heredoc expect 中可用。 ippassssh 中都能很好地解释,但问题在于函数 foo
  • 您没有导出函数的定义。使用 export -f 虽然它不能跨 ssh 工作。

标签: bash expect


【解决方案1】:

在将整个函数存储在一个变量中(作为字符串)然后导出它之后工作。

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."

该解决方案运行良好,但对我自己来说似乎很愚蠢。希望有人能提供更好的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 2019-06-22
    • 2021-05-09
    • 2013-10-14
    相关资源
    最近更新 更多