区分交互式登录和非交互式非登录shell

Modified on: Sat, 09 Jun 2018 08:24:53 +0800

我正在尝试区分这四个术语登录,非登录,交互式和非交互式

  • interactive - login shell
  • interactive - 非登录shell
  • 非交互式 - 登录shell
  • 非交互式 - 非登录shell

据我所知
交互式 - 非登录shell:启动系统,登录系统并打开终端和
非交互式 - 登录shell:telnet到系统并登录

但是交互式登录shell呢?
它是否登录系统,打开虚拟终端并登录?和
非交互式 - 非登录shell,是否在crontab中运行自动脚本?

作者:,d a i s y

最佳答案

您似乎唯一真正的误解是构成非交互式登录shell的内容。

简要介绍(有关详细信息,请参见此处),并附带示例:

  • 交互式登录shell:您可以通过例如ssh登录远程计算机。或者,您可以在本地计算机上删除tty( Ctrl + Alt + F1 )并登录。

  • 交互式非登录shell:打开一个新终端。

  • 非交互式非登录shell:运行脚本。所有脚本都在自己的子shell中运行,而且这个shell不是交互式的。它只会打开以执行脚本并在脚本完成后立即关闭。

  • 非交互式登录shell:这种情况非常罕见,而且您遇到它时也很难解决。启动一种方法是echo command | ssh server。在没有命令的情况下启动ssh时(所以ssh而不是ssh command将在远程shell上运行command )它启动一个登录shell。如果stdinssh不是tty,则启动非交互式shell。这就是为什么echo command | ssh server将启动一个非交互式登录shell。您也可以使用bash -l -c command启动一个。

如果您想玩这个,可以按如下方式测试各种类型的shell:

  • 这个shell是否具有交互性?

    检查$-变量的内容。对于交互式shell,它将包含i

    ## Normal shell, just running a command in a terminal: interacive
    $ echo $-
    himBHs
    ## Non interactive shell
    $ bash -c 'echo $-'
    hBc
    
  • 这是登录shell吗?

    否检查这个的便携方式但是,对于bash,你可以检查是否设置了login_shell选项:

    ## Normal shell, just running a command in a terminal: interacive
    $ shopt login_shell 
    login_shell     off
    ## Login shell; 
    $ ssh localhost
    $ shopt login_shell 
    login_shell     on
    

将所有这些放在一起,这是每种可能类型的shell之一:

## Interactive, non-login shell. Regular terminal
$ echo $-; shopt login_shell
himBHs
login_shell     off

## Interactive login shell
$ bash -l
$ echo $-; shopt login_shell
himBHs
login_shell     on

## Non-interactive, non-login shell
$ ssh localhost 'echo $-; shopt login_shell'
hBc
login_shell     off

## Non-interactive login shell
$ echo 'echo $-; shopt login_shell' | ssh localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
hBs
login_shell     on
作者:d a i s y,terdon

相关问答

添加新评论