实例讲解screen命令高级用法

实例讲解screen命令高级用法

[root@zgao ~]# screen -h
用法: screen [-选项] [命令[参数]]
或者: screen -r [host.tty]

screen是我很早就在用的一个后台执行程序的命令,但是之前我一直停留在基本操作上,对于screen的高级用法以及操作都没有深入探究过,恰好前段时间在跑多个xray被动扫描时就用到了,虽然网上也有介绍的资料,但我觉得还不够详细,所以决定自己用实例演示并附上详细的截图。

screen命令的介绍:
简单来说可以看做Linux下一个后台执行程序的命令。经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,大家都知道ssh连接一旦断开,前台执行的命令就终止了,虽然可以nohup来后台运行,但是screen是最靠谱的。

先通过screen的-h选项看一下所有提供的选项,有些可能不常用到。

选项:
-4 仅将主机名解析为IPv4地址。
-6 仅将主机名解析为IPv6地址。
-a 将所有功能强制进入每个窗口的termcap。
-A-[r | R] 使所有窗口适应新的显示宽度和高度。
-c 文件读取配置文件,而不是’.screenrc’。
-d(-r)拆下其他运行屏幕(并在此处重新连接)。
-dmS 名称以守护程序形式启动:在分离模式下的屏幕会话。
-D(-r)分离并注销远程(并在此处重新连接)。
-D -RR 执行获取屏幕会话所需的任何操作。
-e xy 更改命令字符。
-f 流量控制打开,-fn =关闭,-fa =自动。
-h 行设置回滚历史记录缓冲区的大小。
-i 打开流控制时,中断输出会更快。
-l 登录模式打开(更新/ var / run / utmp),-ln =关闭。
-ls [match] 或 -list 不执行任何操作,仅在可能的匹配项中列出我们的SockDir。
-L 打开输出日志记录。
-m 忽略$ STY变量,创建一个新的屏幕会话。
-O 选择最佳输出,而不是精确的vt100仿真。
-p window如果存在命名窗口,请预先选择。
-q 安静启动。如果失败,则返回非零返回码。
-Q 命令将响应发送到查询过程的标准输出。
-r [会话] 重新附加到分离的屏幕进程。
-R 如果可能,请重新附加,否则开始新的会话。
-s shell 要执行而不是$ SHELL的Shell。
-S sockname将此会话命名为 .sockname,而不是<pid>.<tty>.<host>.
-t title 设置标题(窗口的名称)。
-T 术语将术语作为$ TERM用于Windows,而不是“屏幕”。
-U 告诉屏幕使用UTF-8编码。
-v 打印“屏幕版本4.01.00devel(GNU)06年5月2日”。
-wipe [match] 不执行任何操作,仅在可能的匹配上清除SockDir。
-x 附加到未分离的屏幕。 (多显示模式)。
-X 在指定会话中将作为屏幕命令执行。

首先从最简单的说起,直接新建一个screen,什么选项参数都不加。

没有加-S命名选项时,为默认的<pid>.<tty>.<host>的形式自动命名的。

加上 -S 命名,新建一个名为test的screen。-ls 选项则是显示当前已有的screen。

现在是在screen里面了,怎么退出来呢?

  • 如果是想结束掉当前screen,可以 Ctrl+d 的方式退出。
  • 如果是想detach当前screen,就是让他后台运行用 Ctrl+a+d,暂时离开当前session,每个 screen 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。
  • 如果用 Ctrl+a+z 则是当前session放到后台执行,用 shell 的 fg 命令则可回去。

目前我没有发现Ctrl+a+dCtrl+a+z的区别?感觉效果是一样的。

上面说了screen最简单的使用,但如果不想每次新起一个screen进去后再执行命令的话可以直接screen后面跟要执行的命令和参数即可。

但这个时候是输出到终端显示的,因为我们进入了这个screen里面,这个时候想让他后台运行按下Ctrl+a+d就能回到前台,但程序还在screen中继续执行。但一旦程序结束就会退出当前screen,比如按下Ctrl+c。

那么我要是想直接让他后台直接,连screen也不想进去怎么办呢?

可以用 -dmS 名称 命令 以守护程序形式启动:在分离模式下的屏幕会话。

这样是不是就方便很多了呢?但是这样也许还不能满足我们的需要,因为有的时候程序的一些输出信息是没有被保存的,但恰好又是我们需要的怎么办呢?

我们可以加上 -L 选项,也就是打开输出日志记录,screenlog保存到当前路径下。

通过 -s 选项指定screen的shell,没有指定的时候默认是当前环境下的shell。比如我们当前是bash,但是在screen中想使用sh。

上面提到过程序结束就会screen就会终止。比如执行的命令有报错。

这个就是很多人懵逼的地方,却不知为何screen没有跑起来。

赞赏

微信赞赏支付宝赞赏

Zgao

愿有一日,安全圈的师傅们都能用上Zgao写的工具。