我正在编写一个 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"' )