通过SSH运行GNU screen,shell不是登录shell?

Gus*_*uss 15 shell login ssh gnu-screen

我在通过 SSH 访问的远程系统上使用 screen(有问题的命名终端会话管理器)来运行长时间运行的进程等。我最终开始使用命令直接附加到 screen 会话,而不是首先通过 SSH 登录,然后启动 screen:

ssh -t hostname screen -xRR
Run Code Online (Sandbox Code Playgroud)

的用途-xRR是附加到现有的屏幕会话(如果可用),否则只需创建一个新会话。问题是,当创建新会话时,它不会被创建为登录 shell:

$ shopt -q login_shell; echo $?
1
Run Code Online (Sandbox Code Playgroud)

因此,.profile与首先使用 SSH 登录然后运行相比,登录会话设置(运行和朋友)未完成,然后部分设置丢失screen- 在这种情况下,SSH 启动的 shell 是一个登录 shell,它设置正确,屏幕我猜继承了环境。

我尝试使用-l屏幕上的标志,该标志被记录为“登录模式”,但它没有帮助 - 我认为它只会更新诸如who.

知道如何让屏幕运行登录 shell 吗?

avi*_*iro 15

来自 GNU 的手册页screen

\n
\n

-s程序

\n

将默认 shell 设置为指定的程序,而不是环境变量中的值$SHELL/bin/sh如果未定义则为“”)。这也可以通过“ ” shell.screenrc 命令定义。

\n
\n

...

\n
\n

外壳命令

\n

设置用于创建新 shell 的命令。这会覆盖\n环境变量的值$SHELL。如果您\xe2\x80\x99d 喜欢\n运行一个 tty 增强器,该增强器期望执行 中指定的程序\n,这非常有用$SHELL如果命令以 \xe2\x80\x98-\xe2\x80\x99 字符开头,\nshell 将作为登录 shell 启动。当不作为登录 shell 启动时,典型的 shell 仅执行最少的\n初始化。~/.bashrc例如,除非它是登录 shell,否则Bash 不会\n读取您的信息。

\n

defshell目前是 .screenrc 命令的同义词shell

\n
\n

所以你有两个选择:

\n
    \n
  1. 运行以下命令以确保作为bash登录 shell 启动:

    \n
    ssh -t hostname screen -xRR -s -bash\n
    Run Code Online (Sandbox Code Playgroud)\n
  2. \n
  3. 如果您希望此行为成为默认行为,请将以下行添加到$HOME/.screenrc目标主机(或运行screen命令的任何位置)上的文件中:

    \n
    shell -bash\n
    Run Code Online (Sandbox Code Playgroud)\n
  4. \n
\n