bash 如何知道它是如何被调用的?

bash 如何知道它是如何被调用的?

我已经安装jailkitUbuntu 12.04设置了用户的 shell /bin/bash- 但是当它被调用时,它运行/etc/bash.bashrc而不是/etc/profile

如果您以前没有使用过,jailkit那么它的要点如下:

  1. 系统根目录的“监狱”版本在某处创建,例如 /home/jail
  2. 被监禁的用户主目录被移动到该文件夹​​内,例如 /home/jail/home/testuser
  3. 相关配置文件复制到/home/jail/etc/ - 包括有限的/etc/passwd
  4. 将您想要允许访问的程序复制到相应的目录,例如/bin/bash
  5. 当被监禁的用户登录时,他们会被 chroot 到 /etc/jail/ 并且看不到上面的任何文件

所以我有一个who 有这样的testuser条目:/etc/passwd

testuser:x:1002:1003::/home/jail/./home/testuser:/usr/sbin/jk_chrootsh

该文件中/home/jail/etc/passwd有一个条目,例如:

testuser:1001:1003::/home/testuser:/bin/bash

我已经阅读过bash(1),所以我认为问题是 bash 认为它没有被作为登录 shell 调用:

当 bash 作为交互式登录 shell 或带有 --login 选项的非交互式 shell 被调用时,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。

我知道它bash实际上是被调用的,/usr/sbin/jk_chrootsh但我不明白如何bash确定它是什么类型的 shell,以及它应该运行哪组启动文件。

我想看看是否可以解决这个问题 - 但我不明白:

bash 如何知道它是如何被调用的?

ps:我也研究过,但login(1)运气不佳。

答案1

通常 bash 知道它是一个登录 shell,因为当登录程序调用它时,它告诉 bash 它的名称是-bash。该名称位于argv[0]第 0 个命令行参数中,这是用户调用程序的传统方式。最初的连字符是告诉 shell 它是登录 shell 的约定。如果您向 Bash 传递选项--login或,Bash 也可以充当登录 shell -l。看登录 Shell 和非登录 Shell 之间的区别?更多细节。

从 Jailkit 2.16 开始,jk_chrootsh从各种源读取要调用的 shell 的绝对路径,并将此路径作为 传递argv[0],并将其自己的命令行参数向下传递到该 shell。在jk_chrootsh本身用于 的正常用例中/etc/passwd,无法传递诸如 之类的参数-l。由于绝对路径不以 开头-,因此除了使用微小的中间程序之外,无法调用jk_chrootsh登录 shell。

#include <unistd.h>
int main () {
    execl("/bin/bash", "-bash", NULL);
    return 127;
}

我本来希望jk_chrootsh有一种调用登录 shell 的简单方法。我建议提出功能请求。

答案2

loginargv[0]调用以 . 开头的用户的登录命令/shell -。 shell 检查它们argv[0]以确定它们是否被作为登录 shell 调用。

正如@slm所说,它在手册的“调用”部分中明确指定bash

此外,还有一些 shell,如cshtcshkshzshyashbash并且 Almquist shell 的某些变体支持-l启用该login模式的选项,而无需与第一个参数混合。不使用它login,但如果您想从难以使用任意argv[0].我见过图形登录管理器使用它。

答案3

看看bash 手册页。他们讨论了如何在那里调用它的差异。该部分称为召唤。调用它的两种主要方式是作为登录 shell ( bash -l) 和作为交互式 shell ( bash -i)。

看一下其他 Unix 和 Linux 问答,标题为:登录 Shell 和非登录 Shell 之间的区别?。它几乎完全涵盖了您所询问的内容。

相关内容