通过SSH执行screen命令,是否无法正确捕获其返回码?
问题:通过SSH调用screen并捕获命令返回码写入磁盘
我正在编写Python程序,需要通过SSH触发长时间运行的程序,决定使用screen工具,后续要获取程序的运行结果。研究中遇到的核心问题是shell变量展开:双引号会提前展开$?,不符合预期。
我的需求:
- 必须通过SSH运行screen命令
- 必须将screen命令的返回码写入磁盘
我认为这个需求可能无法实现,原因在于此处必然存在两层引号处理:一层用于初始SSH命令,另一层用于screen启动后的命令。
以下是我的测试示例:
测试1:SSH调用带双层bash -c的screen命令
$ ssh -t me@remote bash -c 'screen -d -m -L -Logfile ~/screenlog bash -c "$(exit 1); echo $? >> ~/screenlog.test"' Connection to localhost closed.
在远程虚拟机中查看结果:
me@remote:~# cat screenlog.test 0
测试2:手动在远程运行screen命令验证预期
me@remote:~# screen -d -m -L -Logfile ~/screenlog bash -c '$(exit 1); echo $? >> ~/screenlog.test' me@remote:~# cat screenlog.test 0 1
测试3:移除screen后的bash -c层
有人可能会问,为什么screen命令后还要用bash -c?我尝试移除该层引号与bash -c:
$ ssh -t me@remote 'screen -d -m -L -Logfile ~/screenlog $(exit 1); echo $? >> ~/screenlog.test' Connection to localhost closed.
查看结果:
me@remote:~# cat screenlog.test 0 1 0
我推测bash -c对于准确捕获返回码是必要的。
既然SSH与bash -c的两层引号处理都是必须的,但仅有单引号和双引号两种引号类型,是否意味着通过SSH运行screen命令时,必然无法获取返回码?
有人建议转义引号,我尝试了以下命令,但未成功写入文件,执行出现问题:
$ ssh -t me@remote 'screen -d -m -L -Logfile ~/screenlog bash -c \"$(exit 1); echo $? >> ~/screenlog.test\"'
内容的提问来源于stack exchange,提问作者notacorn
相关产品推荐
相关产品推荐

