Laravel Envoy经堡垒机SSH到私有Web服务器输出拆分多行的解决办法
问题根因
碎行是你在SSH命令中添加了-tt强制分配交互伪终端导致的:原写法是先开启SSH交互会话,再把/home/ubuntu/deploy.sh作为终端输入逐字符发送,伪终端会回显每个输入的字符,Envoy逐段捕获输出后就变成了拆分的细碎行,同时还会输出MOTD欢迎信息、命令提示符等多余内容。
解决方案
方案1:直接远程传递命令(推荐)
不要分开执行SSH登录和命令输入,直接把要执行的脚本作为SSH参数传递,不需要分配伪终端,自然不会触发逐字符回显:
修改Envoy.blade.php代码如下:
@task('deploy:code', ['on' => 'web']) ssh ubuntu@10.0.2.15 -p 22 "/home/ubuntu/deploy.sh" @endtask
方案2:屏蔽多余输出
如果不需要保留MOTD、系统更新提示等无关信息,可以给SSH添加静默参数:
@task('deploy:code', ['on' => 'web']) ssh -q -o LogLevel=ERROR ubuntu@10.0.2.15 -p 22 "/home/ubuntu/deploy.sh" @endtask
-q开启静默模式,屏蔽常规提示、警告输出-o LogLevel=ERROR仅输出错误级别的日志,进一步过滤无关内容
方案3:兼容需要伪终端的场景
如果后续部署脚本需要伪终端支持(比如执行sudo操作、交互命令),保留-tt参数的同时把命令合并到SSH调用中即可:
@task('deploy:code', ['on' => 'web']) ssh ubuntu@10.0.2.15 -p 22 -tt "/home/ubuntu/deploy.sh" @endtask
这种方式也不会出现命令逐字符回显的碎行问题。
内容的提问来源于stack exchange,提问作者Kingsley
相关产品推荐
相关产品推荐

