«

【Ubuntu】openvt的所有选项

azurekiln 发布于 阅读:15 Linux操作系统基础


好的,那么现在要和大家讲的是open这个程序,这个在当前的Ubuntu 14.04发行版中等价于openvt,全称为open virtual terminal,意思为打开虚拟终端,能够帮助我们在新的虚拟终端上启动程序。

我们需要先清楚一个点,什么是虚拟终端,在当前有着图形化界面Ubuntu 系统中,其实背后还运行着多个全屏的、纯文本的终端界面,这些都是虚拟终端(也叫 TTY)。图形化界面的虚拟终端通常运行在TTY1和TTY7上。

那么为了避免干扰我们先来创建一个用户lcy666。

我们输入

sudo adduser lcy666

接下来我们授予新用户管理员权限:

sudo usermod -aG sudo lcy666

然后我们切换用户,我们输入

sudo -u lcy666 -i

然后输入密码,回车。

首先我们在用户的登录脚本添加一行打印,现在我们确定处于常规用户账户后,输入

nano ~/.profile

在最后一行输入

echo "This is login Shell"

然后Ctrl+O再按回车,再按Ctrl+X退出文本编辑器。

那么首先我们通过help选项来列出open的帮助文档,我们输入

open --help 

按回车。我们可以看到options这里除了最后两个有8个选项。那么这些选项在openvt中通常需要组合使用。

Options:
  -c, --console=NUM   use the given VT number; 
  -e, --exec          execute the command, without forking;
  -f, --force         force opening a VT without checking;
  -l, --login         make the command a login shell;
  -u, --user          figure out the owner of the current VT;
  -s, --switch        switch to the new VT;
  -w, --wait          wait for command to complete;
  -v, --verbose       print a message for each action;
  -V, --version       print program version and exit;
  -h, --help          output a brief help message.

我们先来看倒数第二个选项,这是一个打印当前open程序的版本号信息的功能。

我们输入

open --version
```    (2)

或者

open -V


然后回车运行,可以看到当前版本号为 1.15.5。

接下来我们看到第一个选项 use the given VT number 意思就是我们要指定在哪个编号的虚拟终端上运行命令。

第二个选项 execute the command, without forking 意思就是在不创建子进程的同时执行命令,forking就是创建子进程。

第三个选项 force opening a VT without checking 是不检查直接强制打开一个虚拟终端,就是比如我现在TTY8已经被打开的状态下,那么就需要通过添加 -f 这个选项来强制打开,否则就会报错。

那么第四个选项 make the command a login shell 直接翻译过来就是,让要执行的命令成为一个登录的Shell,比如我们执行的某一个脚本或者命令可能用到系统中哪个用户的环境变量,那么这个时候使用第四个选项 -l 进行登录后就会加载该用户的配置文件和环境变量。

第五个选项 figure out the owner of the current VT 是找出当前虚拟终端的所有者,通常会和上一个选项配合使用,从而确保使用正确的用户身份创建一个会话。

第六个选项 switch to the new VT 就是带有该选项的命令会在执行的时候立刻切换到新的虚拟终端去,让你能够看到程序的运行情况,如果没有带上这个选项则会在后台静默运行,你感知不到有任何变化。

第七个选项 wait for command to complete 是等待命令执行完毕,这也是一个非常重要的选项,在命令中添加这个选项后,当那个命令结束后,它会自动切回你原来的终端。可以确保一步操作执行完再执行下一步操作,以省去来回切换TTY的过程。

第八个选项 print a message for each action 是为每一个操作打印一条消息,在执行的过程它会将它执行的每一步骤详细告诉你,方便我们进行调试。

那么上面这些选项基本上都需要在管理员权限,我们在执行之前需要在命令的最前面添加sudo来提升到管理员权限。

我们现在先来启动一个最简单的bash Shell,并立刻切换到新的虚拟终端进行查看。我们指定TTY8的终端进行执行,我们输入 

```sudo open -c 8 -s -- bash ```    (4)

后回车,可以看到这里vt 8 is in use,说明TTY8已经被使用,这个时候我们可以选择指定其他TTY进行执行或者直接添加 -f 这个选项强制打开虚拟终端。

这里我们添加 -f 来强制打开终端,

```sudo open -c 8 -f -s -- bash ```    (5)

然后回车,这个时候我们可以看到已经成功进入新的文本虚拟终端,然后我们按快捷键 `Ctrl + Alt + F7 `即可切回图形化的界面。

接着我们在原来的命令添加 -l 选项,并指定TTY10,尝试回车运行。

```sudo open -c 10 -l -f -s -- bash```    (6)

可以看到,现在新的虚拟终端打印了我们刚才添加的This is login Shell,证明我们现在这个虚拟终端是有成功加载用户配置文件和用户环境变量的。

我们可以来对比一下去除-s选项后的命令执行会是怎么样的。

```sudo open -c 10 -l -f -- bash```

可以看到现在界面没有任何变化,但其实bash已经在后台启动。

然后我们现在再来添加一个 -v 选项来打印消息。

```sudo open -c 10 -l -f -v -- bash```    (7)

可以看到现在它把“打开第10个虚拟终端”这一个动作完整的陈述了出来。

接下来,我们再来创建一个示例脚本,用于打印一些信息。

cat << 'EOF' > test.sh

echo "Test Starting..."
echo "Now TTY: $(tty)"
echo "Now User: $(whoami)"
echo "Home Path: $HOME"
echo "waiting for 5 second..."

sleep 5
echo "$(date): Finished."
echo "End"
EOF



创建完成后,我们赋予该脚本文件可执行的权限。

```chmod +x test.sh```

然后我们可以先尝试直接在当前的图形终端运行该脚本。

我们输入

```./test.sh```

然后回车,可以看到脚本文件可以正常被运行。

接下来我们将原来的指令运行的bash改为 ./test.sh,同时带上 -s 切换选项。

```sudo open -c 10 -l -f -v -s -- ./test.sh```    (7)

我们可以看到脚本的内容在新的虚拟终端被完整执行。

然后我们通过`Ctrl+Alt+F7`回到图形界面的终端。

我们在原来的基础上添加一个 -w 等待选项,然后回车

```sudo open -c 10 -l -f -v -s -w -- ./test.sh```    (8)

我们可以看到,当脚本完整执行后,它会从虚拟终端退回到我们原来的终端,这就是 -w 等待选项的作用,直接省去了切换的步骤。

然后我们在原来的基础上添加一个 -e 选项,那么添加这个 -e 选项,上文我们说到就是在不创建子进程的同时执行命令。那么执行带 -e 的命令,我们需要在 open 之前 setsid ,这样就能保证在执行 `ioctl(TIOCSCTTY)` 前,进程已经是“新会话首领且无控制终端”,内核检查通过,终端附着成功。

那么我们先在原来命令的基础上尝试添加 -e 的选项,然后执行。

 ```sudo open -c 10 -l -f -v -s -w -e -- ./test.sh```    (9)

我们可以看到此时因为内核安全检查拒绝它对新终端的附着请求,报 “Operation not permitted”。

现在我们在 open 之前 添加 setsid,再次执行,此时可以看到脚本已经可以正常运行了。

 ```sudo setsid open -c 10 -l -f -v -s -w -e -- ./test.sh```    (9)

那么这行命令我们也会注意到 -w 在添加 -e 后该选项是失效的,这是因为当前的进程被替换成所要执行的脚本文件,并不存在子进程,所以open 也就无法等待pid,所以如果我们想要使用 -e 这个执行选项,那么就不能用 -w 这个等待选项。

至于最后 -u 这个选项,运行的环境有点苛刻,我们不能在图形终端上运行。首先我们以同样的操作再来创建一个测试用户testuserlcy。

我们输入 

```sudo adduser testuserlcy```

创建完成后授予权限。

```sudo usermod -aG sudo lcy666```

授予完成后我们将创建好的脚本文件复制到用户目录文件夹中。

我们输入

```sudo cp test.sh /home/testuserlcy/test.sh```

复制完成后,我们切换到新创建的测试用户。

```sudo -u testuserlcy -i```

一样的步骤,我们在用户的登录脚本添加一行打印,我们输入

```nano ~/.profile```

在最后一行输入

```echo "This is testuserlcy's Shell"```

然后Ctrl+O再按回车,再按Ctrl+X退出文本编辑器。

然后我们按`Ctrl+Alt+F3`切换到文本终端,在原来的基础上添加 `-u testuserlcy`,意味着打开的新的虚拟终端会以testuserlcy的用户进行登录,相当于具备testuser的环境。然后我们回车。

``` sudo open -c 10 -l -f -v -s -u testuserlcy -w -- ./test.sh```

可以看到完整的执行过程。

最后我们按`Ctrl+Alt+F7`切回图形终端,那么以上就是open这个二进制文件的所有选项的介绍。


扫描二维码,在手机上阅读
收藏
请先 登录 再评论