当我通过 ssh 进入 ubuntu 机器时,我使用的是什么类型的 shell

当我通过 ssh 进入 ubuntu 机器时,我使用的是什么类型的 shell

我继续阅读有关交互式、非交互式、登录和非登录 shell 的文章。

(这是在读取 .bash* 文件的上下文中)。

我不明白每种类型的 shell 是什么,所以让我们从基础的开始。

如果我从我的 Mac 通过 ssh 连接到我的 ubuntu 机器,会启动什么类型的 shell?

答案1

如果你通过 SSH 进入你的 Ubuntu 机器,你会得到一个交互式登录 shell。区别如下:

  • 交互式与非交互式:任何可以在提示符下输入的 shell 都是交互式的。事实上,许多脚本会测试$PS1保存提示字符串的变量,以确定它们是否是交互式的。如果 shell 正在执行 shell 脚本,则它是非交互式的。

    因此,如果您这样做ssh yourbox.example.com,您将获得一个交互式 shell(假设为默认设置),而如果您这样做ssh yourbox.example.com mighty_shellscript.sh,您将得到一个非交互式 shell,并且您的 SSH 会话将在脚本终止时终止。

  • 登录与非登录:当您从控制台或远程(例如 SSH)登录时,或者当您将选项传递-l给 时bash,您将获得登录 shell。否则(例如当您打开终端窗口时),您将获得非登录 shell。

    要测试某个 shell 是否为登录 shell,请检查其命令名是否-bashbash

    ps -ef | grep [b]ash
    

答案2

您将获得一个交互式登录 shell。但不要认为这是理所当然的,请自行检查。

这告诉你你有一个登录 shell(来自man bash):

# shopt | grep login
login_shell     on

这说明你有一个交互式 shell,请查找i(来自man bash):

# echo $-
himBH

您获得的交互式登录 shell 已读取/etc/profile和 之一~/.bash_profile~/.bash_login如下~/.profile所述man bash

当 bash 被调用为 交互式登录外壳或者使用 --login 选项作为非交互式 shell,如果文件 /etc/profile 存在,它首先从该文件读取并执行命令。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,然后从第一个存在且可读的文件中读取并执行命令。 启动 shell 时可以使用 --noprofile 选项来抑制这种行为。

答案3

SSH(1)手册页说,

如果命令被指定,它将在远程主机上执行,而不是在登录 shell 上执行。

当用户的身份被服务器接受后,服务器要么执行给定的命令,要么登录到机器并为用户提供远程机器上的普通 shell。

这些告诉我你获取的 shell 是一个登录 shell。

答案4

尝试这个命令。

[max@localhost ~]$ echo $SHELL
/bin/bash

您之所以得到这个输出是因为您的 shell 类型存储在这个变量中SHELL

要了解您的环境变量,请输入此命令

[max@localhost ~]$ 环境
HOSTNAME=localhost.localdomain
外壳=/bin/bash
历史记录=1000
用户=最大

在输入时echo $SHELL它将打印此处存储的任何值

每次启动时此值都会更新

相关内容