我已经安装jailkit
并Ubuntu 12.04
设置了用户的 shell /bin/bash
- 但是当它被调用时,它运行/etc/bash.bashrc
而不是/etc/profile
如果您以前没有使用过,jailkit
那么它的要点如下:
- 系统根目录的“监狱”版本在某处创建,例如 /home/jail
- 被监禁的用户主目录被移动到该文件夹内,例如 /home/jail/home/testuser
- 相关配置文件复制到/home/jail/etc/ - 包括有限的/etc/passwd
- 将您想要允许访问的程序复制到相应的目录,例如/bin/bash
- 当被监禁的用户登录时,他们会被 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
login
argv[0]
调用以 . 开头的用户的登录命令/shell -
。 shell 检查它们argv[0]
以确定它们是否被作为登录 shell 调用。
正如@slm所说,它在手册的“调用”部分中明确指定bash
。
此外,还有一些 shell,如csh
、tcsh
、ksh
、zsh
、yash
,bash
并且 Almquist shell 的某些变体支持-l
启用该login
模式的选项,而无需与第一个参数混合。不使用它login
,但如果您想从难以使用任意argv[0]
.我见过图形登录管理器使用它。
答案3
看看bash 手册页。他们讨论了如何在那里调用它的差异。该部分称为召唤。调用它的两种主要方式是作为登录 shell ( bash -l
) 和作为交互式 shell ( bash -i
)。
看一下其他 Unix 和 Linux 问答,标题为:登录 Shell 和非登录 Shell 之间的区别?。它几乎完全涵盖了您所询问的内容。