使用 GNU screen(第 4 版),为什么以下内容运行得很好:
$ screen -S some-name
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试/
在会话名称中使用斜杠 ( ),则会出现有关多用户支持的错误。
$ screen -S some/name
Must run suid root for multiuser support.
Run Code Online (Sandbox Code Playgroud)
如果我尝试从屏幕内设置会话名称:
$ screen
C-a :sessionname some/name
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
: bad session name 'some/name'
Run Code Online (Sandbox Code Playgroud)
所以显然 a/
是会话名称的无效字符。查看 screen的手册页,我看不到任何关于以下内容的无效或保留字符sessionname
:
'-S 会话名称'
将新会话的名称设置为 sessionname。此选项可用于为会话指定一个有意义的名称来代替默认的 tty.host 后缀。此名称标识 screen -list 和 screen -r 命令的会话。此选项等效于 sessionname 命令(请参阅会话名称)。
8.5 会话名称——命令:sessionname [name]
(无)重命名当前会话。请注意,对于 screen -list,名称显示时带有进程 ID。如果省略参数名称,则显示此会话的名称。注意: $STY 环境变量仍然反映旧名称。这可能会导致混淆。默认值由 tty 和主机名构成。
此外,unmatched'
和"
在会话名称中抱怨不匹配的引号,这似乎与语法有关。例如,:sessionname 'test"'
给出test"
作为名称。和^A
、^B
等产生控制字符。
会话名称的有效语法或字符是什么?
为 screen 会话分配名称的目的-S
是,您可以screen -r ...
通过指定其名称来对该会话进行操作(例如 with )。
查看-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
Run Code Online (Sandbox Code Playgroud)
这相当于:
screen -S name
Run Code Online (Sandbox Code Playgroud)
在屏幕版本 4.01.00 的一些快速实验中,我没有发现会话名称中禁止使用的任何其他特殊字符。以下所有内容:
screen -S 'foo bar'
screen -S 'foo"bar'
screen -S "foo'bar"
screen -S 'foo\bar'
screen -S "foo'bar^Xbaz"
Run Code Online (Sandbox Code Playgroud)
为我正确工作。
在最后一个中,^X
实际上是一个字面Ctrl-X字符。screen -ls
从字面上看;我必须这样做screen -ls | cat -A
才能看到它。我能够通过指定它们的名称来恢复所有这些会话:
screen -dr 'foo bar'
Run Code Online (Sandbox Code Playgroud)
等等,并且$STY
每个会话中的值是正确的。
(我不建议使用控制字符,因为我希望这是显而易见的原因。)