screen会话变成linux执行器

680阅读 0评论2021-12-11 zenith518
分类:LINUX

screen是持久型虚拟终端的重要工具。对于长时间运行的重要运维指令,需要放在screen中去执行,以排除远程终端的各种连接因素对于执行指令期间的种种影响。
在自动化过程中,对于screen会话的远程控制管理又成为自动化编排重点。
这里记录一下对于screen 远程管理的特点和用法,重点是程管理screen会话。
screen 主要参与自动化,最重要的功能就是 -X 选项,但是不幸的是官方manual并没有详细介绍这种方法。

screen会话远程创建

点击(此处)折叠或打开

  1. createScreenWithName() {
  2.     screenname=$1
  3.     passwd=aaaa
  4.     someserver=1.1.1.1
  5.     sshpass -p $passwd ssh $someSSHOptions $someserver screen -dmS $screenname -L bash
  6. }

screen会话远程命令发送(效果类似异步命令)

点击(此处)折叠或打开

  1. SendCommandWithScreenName() {
  2.     screenname=$1
  3.     shift
  4.     cmdstr="$*"
  5.     sshpass -p $passwd ssh $someSSHOptions -t $ctrlserver "screen -DRS $screenname -X stuff \"$cmdstr\"$(echo -ne '\015')"
  6. }

需要注意的是 -X stuff,  这个应该是screen的固定用法。man中只提到stuff是命令。但没有完整解释。从其部分解释的理解来看,应该就是current input buffer, 所以真正的command string\r需要作为sub-command 跟在input buffer的后面。

screen 会话远程终结

点击(此处)折叠或打开

  1. sendCommandWithScreenName ansible exit

这样实现后,screen突然变成了一个带状态的异步执行器。需要执行的指令的时候,向screen的命名会话发送一条/多条指令即可,通过其执行日志,可以获得执行的stdout/stderr信息。为后续自动化编排带来了更多的自由想象空间。


带状态的含义是: 比如我需要先进入某个目录,或设置某个环境变量, 然后再执行重要的指令。
这种场景可以远程发送多条指令,给一个同名的screen 会话,这样前后执行环境都会受到影响。以确保执行指令的环境一致性。

2019/10/15
上一篇:excel vba Like模糊匹配
下一篇:在一个VBA主项目中调用其他VBA库项目的类库