很高兴在这里为您写下。我对此进行了大量搜索,但尚未找到解决方案。我想做的事情比较简单。
我的工作站环境中有一个警告本地 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 中可用。