我正在编写一个 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
Run Code Online (Sandbox Code Playgroud)
这第二个脚本是我试图让它工作的方式。我将通过 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
Run Code Online (Sandbox Code Playgroud)
这第三个脚本有效,但我认为不会在生产中使用。由于必须使用命令运行一堆 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
Run Code Online (Sandbox Code Playgroud)
那么有没有办法让脚本 2 工作呢?
更新:是的,我知道 test 是一个不好的名字,过度使用它是不好的,但这不是实际的代码,因为实际的代码要大得多,也更复杂。
您可能对函数部分是正确的,但我有很多程序可以使用 ssh user@ip 函数工作。我相信它可以工作,因为它可以扩展并且只需运行函数中的所有内容而无需执行 ssh 单个命令。
除了从函数取回值外,第二个脚本有效。当回显它而不是用户输入的值时它是空的。
您必须在远程机器上定义函数:
remote_hobby=$( ssh -t sysadmin@"${!name}" bash -c 'test2() { read -p "Hobby: " hobby; }; test2; echo "$hobby"' )
Run Code Online (Sandbox Code Playgroud)