咨询:SSH远程执行指定脚本后保持与目标主机连接的可行性及实现方法
当然可行!你完全可以做到执行完远程脚本后仍保持与host2的SSH连接,下面分享几个实用的解决方案:
方法1:在远程命令后追加交互式Shell
原来的命令执行完脚本就直接退出,是因为SSH在完成指定命令后就会终止连接。我们只需要在脚本执行命令后,额外启动一个交互式Shell即可:
var=ntpcz ssh host2 "/oracle/remote/xyz.sh $var; exec bash"
这里的exec bash会替换当前的进程为bash(如果你的默认Shell是zsh等其他类型,替换成对应的exec zsh即可),脚本执行完成后就会自动进入host2的交互Shell,直到你主动输入exit才会断开连接。
方法2:使用-t参数强制分配伪终端
如果遇到追加Shell后无法正常交互(比如无法使用上下键调用历史命令、无法打开交互式编辑器),可以加上SSH的-t参数强制分配伪终端,让后续的Shell交互更完整:
var=ntpcz ssh -t host2 "/oracle/remote/xyz.sh $var; exec bash"
这个参数在需要交互操作的场景下特别有用,能模拟本地终端的体验。
方法3:将脚本加入远程Shell的初始化配置(适合固定场景)
如果你需要每次连接host2都自动执行这个脚本,还可以把执行命令添加到远程用户的Shell初始化文件中(比如~/.bashrc或~/.profile),但要注意只在交互式Shell中执行,避免影响非交互场景:
在host2上编辑~/.bashrc,添加以下内容:
# 仅在交互式Shell中执行脚本 if [[ $- == *i* ]]; then /oracle/remote/xyz.sh ntpcz fi
之后你直接执行ssh host2,连接后脚本会自动执行,执行完成后保持交互式Shell连接。不过这个方法更适合脚本参数固定的场景,如果var是动态变化的,还是前两种方法更灵活。
补充说明
你之前的命令执行完就断开,本质是因为SSH的工作机制:当你指定远程命令时,SSH会在该命令执行结束后立即关闭连接。而上面的方法都是在脚本执行完成后,启动一个持续运行的交互式Shell进程,让SSH保持连接直到你主动终止这个Shell。
内容的提问来源于stack exchange,提问作者sarat

