screen是持久型虚拟终端的重要工具。对于长时间运行的重要运维指令,需要放在screen中去执行,以排除远程终端的各种连接因素对于执行指令期间的种种影响。
在自动化过程中,对于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
阅读(607) | 评论(0) | 转发(0) |