带有 ssh 的 Bash 脚本不返回变量值

带有 ssh 的 Bash 脚本不返回变量值

我正在编写一个 bash 脚本来帮助迁移 KVM 虚拟机,但我将使用虚拟代码来解释正在发生的事情。

我使用函数来分解在远程服务器上执行的任务,并从用户那里获取所需的信息,同时显示用户回答问题所需的信息。下面将有 3 个脚本,只是为了展示我用来弄清楚发生了什么的 3 种方法。

第一个不涉及任何 ssh 并且按其应有的方式工作

#!/bin/bash

getname()
{
echo -n "Name:  "
read name
}

gethobby()
{
echo -n "hobby:  "
read hobby
}

showresults()
{
echo "$name"
echo "$hobby"
}

getname
gethobby
showresults

第二个脚本是我试图让它工作的方式。我将通过 ssh 在远程服务器上运行一个函数,但变量的值无法从其他函数访问,就像我需要它们一样

#!/bin/bash
server1='10.1.1.153'

getname()
{
echo -n "Name:  "
read name
}

gethobby()
{
uptime
echo -n "hobby:  "
read hobby
}

showresults()
{
echo "$name"
echo "$hobby"
}

getname
echo -n "server: "
read sname
ssh -t sysadmin@"${!sname}" "$(typeset -f); gethobby"
showresults

第三个脚本可以工作,但我认为不会在生产中使用。由于必须使用命令运行一堆 ssh,所以到处都有断开线,这使得输出令人困惑。尽管使用这种方法,我可以从变量中访问我需要的值。

#!/bin/bash
server1='10.1.1.153'

getname()
{
    echo -n "Name:  "
    read name
}

gethobby()
{
    ssh -t sysadmin@"${!sname}" "$(typeset -f); uptime"
    echo -n "hobby:  "
    read hobby
}

showresults()
{
    echo "$name"
    echo "$hobby"
}

getname
echo -n "server: "
read sname
gethobby
showresults

那么有什么办法可以让脚本2工作呢?

更新:是的,我知道 test 是一个坏名字,使用它也不好,但这不是实际的代码,因为实际的代码更大、更复杂。

您对功能部分的看法可能是正确的,但我有很多程序可以与 ssh user@ip 功能一起使用。我相信它是有效的,因为它可以扩展并且只需运行函数内的所有内容,而无需执行 ssh 单独的命令。

第二个脚本除了不能从函数中获取值外,其他都正常工作。回显时,它是空的,而不是用户输入的值。

答案1

你必须定义该函数偏僻的机器:

remote_hobby=$( ssh -t sysadmin@"${!name}" bash -c 'test2() { read -p "Hobby: " hobby; }; test2; echo "$hobby"' )

相关内容