Linux - 以另一个用户身份创建屏幕

Linux - 以另一个用户身份创建屏幕

我正在尝试在我的服务器(CentOS 5.11)上创建一个新screen服务器,但是为了安全起见,我不想用我的用户来启动它,而是宁愿使用另一个具有受限权限的用户。

因此,在了解了屏幕内脚本这看起来很容易:

  1. sudo su - <user> bash
  2. script /dev/null
  3. screen -c .screenrc -d -m -S testN ping google.com
  4. exit

一切运行正常。我甚至可以使用screen -x <user>/testN(供 3 或 4 名机器用户使用)访问它。因此,一行中的所有内容应该是...

sudo su - <user> bash -c 'script -c "screen -c .screenrc -d -m -S testN ping google.com; exit;" /dev/null'

但是(现在)由于某种原因,当我这样做时sudo su - <user> bash -c 'screen -ls'屏幕坏了,我无法像以前一样连接该屏幕。

屏幕上显示:24120.testN (死机???) 使用“screen -wipe”删除死机屏幕。

有人遇到过类似的问题吗?任何关于更简单方法的想法都会受到欢迎。

我的.screenrc只是一个将屏幕设置为可供其他用户访问的配置,似乎与问题没有任何关系。

答案1

这是一个有趣的竞争条件。设置屏幕会话时,屏幕会分叉。父进程退出,子进程设置会话,运行命令等等。但是,在您的命令中,在父进程退出后,其整个祖先链都已完成并退出。在此过程中,控制终端关闭,这会SIGHUP向前台进程组发送:唯一的进程是子屏幕进程。由于它还没有时间设置其信号处理,因此SIGHUP执行的默认处理程序:进程退出。

子进程很可能总会输掉这场竞赛,因为它首先花时间进行多次文件系统访问来设置通信套接字,所有这些都是退出父母进程级联可以运行的中断点。

好消息是,如果您尝试启动它只是为了以交互方式连接到其他用户的会话,那么您使用的几乎所有命令行都是不必要的(“脚本”命令没有任何内容 - 您链接的问题提到了非特定的“问题”,但除非您有其中之一,否则不要对它进行货物崇拜;您也不需要“su - ”的东西,它设置的任何内容都不是初始屏幕过程所必需的,并且所有关心的内容都需要通过屏幕进行设置)。

sudo -u $OTHERUSER screen -c /path/to/screenrc -d -m -S testN ping google.com

相关内容