在自动化过程中,对于screen会话的远程控制管理又成为自动化编排重点。
这里记录一下对于screen 远程管理的特点和用法,重点是远程管理screen会话。
screen 主要参与自动化,最重要的功能就是 -X 选项,但是不幸的是官方manual并没有详细介绍这种方法。
screen会话远程创建
点击(此处)折叠或打开
- createScreenWithName() {
-
screenname=$1
- passwd=aaaa
- someserver=1.1.1.1
- sshpass -p $passwd ssh $someSSHOptions $someserver screen -dmS $screenname -L bash
- }
screen会话远程命令发送(效果类似异步命令)
点击(此处)折叠或打开
-
SendCommandWithScreenName() {
- screenname=$1
- shift
-
cmdstr="$*"
- sshpass -p $passwd ssh $someSSHOptions -t $ctrlserver "screen -DRS $screenname -X stuff \"$cmdstr\"$(echo -ne '\015')"
- }
需要注意的是 -X stuff, 这个应该是screen的固定用法。man中只提到stuff是命令。但没有完整解释。从其部分解释的理解来看,应该就是current input buffer, 所以真正的command string\r需要作为sub-command 跟在input buffer的后面。
screen 会话远程终结
点击(此处)折叠或打开
- sendCommandWithScreenName ansible exit
这样实现后,screen突然变成了一个带状态的异步执行器。需要执行的指令的时候,向screen的命名会话发送一条/多条指令即可,通过其执行日志,可以获得执行的stdout/stderr信息。为后续自动化编排带来了更多的自由想象空间。
带状态的含义是: 比如我需要先进入某个目录,或设置某个环境变量, 然后再执行重要的指令。
这种场景可以远程发送多条指令,给一个同名的screen 会话,这样前后执行环境都会受到影响。以确保执行指令的环境一致性。
2019/10/15