BASH:使用交互式 shell 在远程主机中声明本地函数

BASH:使用交互式 shell 在远程主机中声明本地函数

很高兴在这里为您写下。我对此进行了大量搜索,但尚未找到解决方案。我想做的事情比较简单。

我的工作站环境中有一个警告本地 bash 函数。

function caveat(){
  echo "function main caveat executing in $HOSTNAME"

  function caveat_a(){
    echo "function caveat_a executing in $HOSTNAME"
  }

  function caveat_b(){
    echo "function caveat_b executing in $HOSTNAME"
  }
}

我想通过 SSH 连接到远程主机(在交互式 shell 中),以便在那里执行一些惰性的系统管理任务。当我需要执行caveat_a或caveat_b函数时,我希望能够在远程主机中调用它们。

我的研究表明,可以声明一个本地函数可远程使用,然后直接执行它......而且它对我来说效果很好。但我需要的是声明并陷入交互式 shell。

最后一次尝试是在行末尾包含“bash --login”,如下所示:

username@localhost ~ $ caveat
function main caveat executing in localhost
username@localhost ~ $ caveat_a
function caveat_a executing in localhost
username@localhost ~ $ caveat_b
function caveat_b executing in localhost
username@localhost ~ $
username@localhost ~ $ ssh username@remote_host -t "$(declare -f caveat); caveat; caveat_a; bash --login"
Are you sure you want to continue connecting (yes/no)? yes
username@remote_host's password: 
function main caveat executing in remote_host
function caveat_a executing in remote_host
username@remote_host ~ $ #nice, it executed those caveat functions as echoed above

..这样它与我交互..所以我可以在那里执行其他命令..但是当我按下时'caveat<TAB><TAB>'我的警告还没有在那里声明。

我想我错过了一些东西。预先感谢您的所有帮助和回答。

如果可能的话,最好使用尽可能简单的普通解决方案(没有预期,没有其他二进制文件)。

谢谢

答案1

尝试这个:

ssh -t user@host "$(declare -f caveat); export -f caveat; exec bash -li"

感谢@Scott 的出色建议。

需要 ssh选项-t才能允许交互式 shell 完全访问终端的功能。

exec bash -li启动交互式登录 shell。由于该函数已导出,因此它将在这个新 shell 中可用。

相关内容