有效的屏幕会话名称

有效的屏幕会话名称

使用 GNU screen(版本 4),为什么以下代码运行得很好:

$ screen -S some-name

但是,如果我尝试在会话名称中包含斜杠 ( /),则会出现有关多用户支持的错误。

$ screen -S some/name
Must run suid root for multiuser support.

如果我尝试从屏幕内设置会话名称:

$ screen
C-a :sessionname some/name

我收到以下错误:

: bad session name 'some/name'

因此显然 a/对于会话名称来说是无效字符。看着屏幕的手册页,我没有看到关于 的无效或保留字符sessionname

'-S 会话名称'

将新会话的名称设置为 sessionname。此选项可用于为会话指定一个有意义的名称来代替默认的 tty.host 后缀。该名称标识 screen -list 和 screen -r 命令的会话。此选项相当于 sessionname 命令(请参阅会话名称)。

8.5 会话名称 — 命令:sessionname [名称]

(无)重命名当前会话。请注意,对于 screen -list,名称显示时前面带有进程 ID。如果省略参数名称,则显示此会话的名称。注意:$STY 环境变量仍然反映旧名称。这可能会导致混乱。默认值由 tty 和主机名构成。

另外,会话名称中的 unmatched'"抱怨不匹配的引号,这似乎与语法有关。例如,:sessionname 'test"'给出test"名称。和^A^B等产生控制字符。

会话名称的有效语法或字符是什么?

答案1

为屏幕会话指定名称的目的是让您可以通过指定名称来-S操作该会话(例如使用)。screen -r ...

查看-r选项下的手册页:

-r [pid.tty.host]
-r sessionowner/[pid.tty.host]
恢复分离的屏幕会话。不能指定其他选项(除了与 -d/-D 的组合),但可能需要 [pid.]tty.host 的可选前缀来区分多个分离的屏幕会话。第二种形式用于连接到以多用户模式运行的另一个用户的屏幕会话。这表明 screen 应在另一个用户的目录中查找会话。这需要 setuid-root。

因此带有字符的会话名称/被解释为owner/name。 (这可以在该-S选项下更好地记录。)

screen -S $USER/name

这相当于:

screen -S name

在使用屏幕版本 4.01.00 进行的一些快速实验中,我没有发现会话名称中禁止使用任何其他特殊字符。所有以下内容:

screen -S 'foo bar'
screen -S 'foo"bar'
screen -S "foo'bar"
screen -S 'foo\bar'
screen -S "foo'bar^Xbaz"

对我来说工作正常。

在最后一个中,^X实际上是一个字面Ctrl-X字符。screen -ls从字面上显示它;我必须做screen -ls | cat -A才能看到它。我可以通过指定它们的名称来恢复所有这些会话:

screen -dr 'foo bar'

$STY等等,并且每个会话中的值都是正确的。

(我不建议使用控制字符,因为我希望这是显而易见的原因。)

相关内容