使用 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
等等,并且每个会话中的值都是正确的。
(我不建议使用控制字符,因为我希望这是显而易见的原因。)