AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 879364
Accepted
d a i s y
d a i s y
Asked: 2017-02-04 02:06:21 +0800 CST2017-02-04 02:06:21 +0800 CST 2017-02-04 02:06:21 +0800 CST

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

  • 772

我试图区分这四个术语login、non-login、interactive 和 non-interactive:

  • 交互式 - 登录外壳
  • 交互式 - 非登录 shell
  • 非交互 - 登录 shell
  • 非交互式 - 非登录外壳

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

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

bash
  • 5 5 个回答
  • 53995 Views

5 个回答

  • Voted
  1. Best Answer
    terdon
    2017-02-04T03:47:42+08:002017-02-04T03:47:42+08:00

    您似乎唯一真正的误解是关于什么构成了非交互式登录 shell。

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

    • 交互式登录 shell:例如,您可以通过ssh. Ctrl或者,您可以访问本地机器 ( ++ Alt)上的 ttyF1并在那里登录。

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

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

    • 非交互式登录shell:这是非常罕见的,你不太可能遇到它。一种启动方式是echo command | ssh server. 当ssh在没有命令的情况下启动时(ssh而不是在远程 shell 上ssh command运行command),它会启动一个登录 shell。如果 的stdin不是sshtty,它会启动一个非交互式 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
      
    • 这是登录外壳吗?

      没有可移植的方法来检查这一点,但是对于 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
      

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

    ## 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
    $ bash -c '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
    
    • 86
  2. muru
    2017-02-04T05:45:34+08:002017-02-04T05:45:34+08:00

    从本质上讲,shell 是否登录、是否交互都很重要,原因只有一个:

    初始化文件和默认选项设置取决于 shell 是否登录和交互。

    相应地,shell 是否登录或交互仅取决于使用的调用- 确切的命令名称和选项。

    这两个属性在其他方面是正交的——shell 是否登录与确定它是否是交互式的无关。

    如果其中任何一个为真,Bash 将启动一个登录 shell:

    • argv[0],它被调用的命令的名称,以-
    • 选项已-l指定

    类似地,如果其中任何一个为真,bash 将启动一个交互式 shell:

    • 它没有指定要执行的文件(即命令不是bash some/file)或要运行的命令字符串(bash -c 'foo')(实际情况有点复杂,请参阅手册)
    • 选项已-i指定

    值得注意的是(并且自相矛盾),后者意味着bash -ic 'foo'启动一个交互式外壳。

    因此,以下启动了一个登录的交互式 shell,即使它没有任何交互性,并且调用与登录无关:

    bash -lic true
    

    通过控制台或 GUI 登录会启动登录 shell(或者可能不会),这完全是使用适当调用的登录过程的效果。

    条件和效果在bash 手册的 Startup Files 部分中有详细描述。


    一个主要的混淆来源是“登录”外壳还有另一个常见的含义:

    用户的登录 shell 是在该用户的passwd条目中定义的 shell(可能来自/etc/passwd、LDAP 或其他来源)。

    程序、SSH 等将login这个 shell 作为登录shell 启动,这在答案的其余部分意味着 --通常在命令名称中带有前导。如果你想特别混淆,你可以说:

    一些登录进程将用户的登录 shell 作为登录 shell 启动。

    请注意,GUI 登录启动登录 shell 纯粹是因为开发人员认为它很方便 - LightDM 在登录时运行一个脚本,该脚本显然不是交互式的,并且当然不依赖于用户的登录 shell(在第二种意义上)。但是,不要依赖显示管理器启动登录 shell - 并非所有人都这样做,并且在 Wayland 和 GNOME 上,登录过程根本不使用 shell 脚本。

    • 10
  3. George Udosen
    2017-02-04T02:20:24+08:002017-02-04T02:20:24+08:00

    登录外壳:

    当我们登录会话时,在我们的用户 ID 下执行的第一个进程。登录过程告诉 shell 像登录 shell 一样使用约定:传递参数 0,通常是 shell 可执行文件的名称,前面带有“-”字符

    交互式外壳:

    从 tty 上的用户输入读取命令。除其他外,这样的 shell 在激活时读取启动文件,显示提示,并默认启用作业控制。用户可以与外壳交互。运行脚本的 shell 始终是非交互式 shell。

    简单地说:交互式 shell 需要用户输入,而非交互式 shell 由脚本运行,不需要用户输入。

    • 4
  4. Sathish
    2021-01-04T00:02:19+08:002021-01-04T00:02:19+08:00

    接受的答案中缺少一类外壳(非交互式,带有 hBc 选项的登录外壳)。与带有 hBs 选项的选项不同,它通常用于在 ssh 会话中执行命令。看看,比较 4 和 5。我把它和其他人一起包括在内。

    # Combination of login and interactive shells
    
    #1. Interactive, login shell: himBHs
    {
     bash --login
     echo $-
     shopt login_shell 
     logout    # use CTRL-D   : Note the difference here between 1 and 2
    }                                                       
    #2. Interactive, no-login shell: regular terminal: himBHs
    {
     bash   
     echo $-
     shopt login_shell
     exit     # use CTRL-D   : Note the difference here between 1 and 2
    }
    #3. Interactive, no-login shell: executing commands from standard input - scripts: himBHs
    {
    cat <<-EOF > myfile && bash -s < myfile         
    echo $-
    shopt login_shell
    EOF
    }
    #4. Non-interactive, login shell  - takes commands from standard input - pipes: hBs
    echo 'echo $-; shopt login_shell' | ssh localhost   
    #5. Non-interactive, login shell  - executes commands : hBc
    ssh localhost  'echo $-; shopt login_shell'         
    #6. Non-interactive, no-login shell : hBc
    bash -c 'echo $-; shopt login_shell'                
    

    什么是登录 Shell?

    它在登录会话期间按以下顺序从第一个可用文件(如果存在)读取并执行命令:

    1. /etc/profile
    2. ~/.bash_profile,
    3. ~/.bash_login,和
    4. ~/.profile

    它在注销期间按以下顺序读取并执行所有文件(如果存在)的命令:

    1. ~/.bash_logout 和
    2. /etc/bash.bash_logout

    注意:调用登录文件(仅第一个可用文件)和注销文件(所有文件)的区别。

        echo 'echo "Logging out ... $(date)"' >> ~/.bash_logout
        echo 'echo "Logging out from /etc/bash.bash_logout... $(date)"' | sudo tee -a /etc/bash.bash_logout 
        bash --login
        Ctrl-D    # logs out
    

    注意:~/.bashrc在登录 shell 会话期间执行文件命令时总是会出现混淆。通常,~/.bashrc文件中的命令不应在登录 shell期间执行。但是,如果发生这种情况,那是因为~/.bash_profile文件中包含~/.bashrc文件。验证您的~/.bash_profile文件。这是基于 Fedora 的 Linux 发行版中的常见行为。

    什么是免登录外壳?

    它从用户特定的设置文件中读取并执行命令:~/.bashrc

    什么是非交互式会话?

    BASH_ENV它从变量中读取并执行命令。它也是一种控制非交互式会话行为的方法。

    echo "HELLO=WORLD" > ~/myrc
    BASH_ENV=~/myrc bash -c 'echo $BASH_ENV; echo $HELLO'
    

    注意: BASH_ENV必须包含 shell 脚本文件的完整路径。

    注意: ssh 远程非交互式 shell 会话不会读取BASH_ENV. 相反,它读取~/.bashrc远程系统中远程用户的文件。

    注意: ssh远程会话不会从登录 shell (~/.bash_profile) 中提到的文件执行命令。

    这将不起作用:

    BASH_ENV=~/myrc ssh localhost 'echo $BASH_ENV; echo $HELLO'
    
    ssh remoteuser@localhost  'echo $HELLO'
    

    这将起作用:因为,.bashrc属于假定为远程用户的当前用户,并且在此示例中假定远程系统为 localhost。

    echo 'HELLO=WORLD' >> ~/.bashrc
    ssh localhost  'echo $HELLO'
    

    如何控制登录shell的行为?

    1. 在登录 shell 中使用--noprofile选项禁用从上述文件中读取命令。

      echo "HELLO=WORLD1" >> ~/.bash_profile
      bash --login
      echo $HELLO
      bash --login --noprofile
      echo $HELLO
      

    如何控制 no-login shell 的行为?

    1. 使用--rcfile选项指定用户特定的 rc 文件
    2. 在 no-login shell 中使用--norc选项禁用从上述文件中读取命令
    • 1
  5. SantaXL
    2019-10-07T12:13:15+08:002019-10-07T12:13:15+08:00

    我想提一下,您可以通过以下方式启动交互式登录 shell:

    1. 执行sudo /bin/login并输入您的凭据
    2. 执行exec -l /bin/bash
    3. 执行su -
    4. 和上面提到的答案一样,使用 ssh 并登录到远程机器

    此外,您可以通过键入检查(在 bash 中)shell 是否登录echo $0,如果输出以 dash 开头-,则它是登录 shell。

    • 0

相关问题

  • 同时复制到两个位置

  • 如何在 shell 脚本中创建选择菜单?

  • 从 bash 迁移到 zsh [关闭]

  • bashrc 还是 bash_profile?

  • 备份 bash 脚本未压缩其 tarball

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve