是否有可能是非交互式的登录外壳?


11

在解释此流程图时

在此处输入图片说明

我发现在男子bash中:

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

声明交互式登录外壳读取/etc/profile(不带--noprofile)

另外,非交互式外壳,选项为--loginread/etc/profile

这似乎留下了一些可能的登录外壳程序(其中以$0开头的-)可能是非交互的(运行脚本,可能像这样简单date)可能无法读取(源代码)/etc/profile

确认或否认这个想法:

首先,我尝试使用su -l --以第一个字符开头的登录shell,但是我无法使其变为非交互式(并能够提供测试以测试它)。

叫类似

$ bash -c 'date' -bash

不会报告为登录外壳程序(即使第一个字符是-)。

尝试一下以揭示细节:

   $ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash
      -bash hBc ||shopt -u login_shell||
      Fri Aug 19 06:32:31 EDT 2016

$0-作为第一个字符,没有i在价值(交互)$-,但它未报即一个login_shell(在-u)。在这种情况下,/ etc / profile没有被读取,但是我不确定这是正确的测试。


在此答案中还提到了“罕见的非交互式登录外壳” 但对这个问题不够具体。


这个家伙结论是,/etc/profile总是读。

阅读摘要表:交互式和非交互式登录shell均已阅读 /etc/profile


并且,如果此页面的示例正确:

Some examples

$ su bob                   # interactive non-login shell
$ su - bob                 # interactive login shell
$ exec su - bob            # interactive login shell
$ exec su - bob -c 'env'   # non-interactive login shell
$ ssh bob@example.com      # interactive login shell, `~/.profile`
$ ssh bob@example.com env  # non-interactive non-login shell, `~/.bashrc`

已读取exec su - bob -c 'env'报告的测试/etc/profile


简而言之:

是否可以使用非交互式登录外壳程序(未使用--login或-l调用)?

如果为true,是否正在读取/etc/profile文件?

如果以上都是正确的话,我们必须得出结论:所有登录shell [交互式(或非交互式)]读取/ etc / profile(无--noprofile选项)。

注意:要检测到正在读取/ etc / profile,只需在文件的开头添加以下命令:

echo "'/etc/profile' is being read"

Answers:


2

非交互式登录外壳是不常见的,但有可能。如果您将第零个参数(通常是可执行文件的名称)设置为以a开头的字符串来启动外壳程序-,那么无论它是否是交互式的,它都是一个登录外壳程序。

$ ln -s /bin/bash ./-bash
$ echo 'shopt -p login_shell; echo $-' | HOME=/none PATH=.:$PATH -bash
shopt -s login_shell
hB

您的尝试bash -c date -bash没有用,因为它没有告诉shell是登录shell:第零个参数是bash,而不是-bash。bash启动后,它将变量设置$0-bash而不是第零个参数,但重要的是第零个参数。

您可以使用su -l或来运行非交互式登录外壳程序su -,但是您需要安排标准输入不成为终端,同时仍然可以被授权(不必键入密码,也不必将密码安排在开始时)输入)。使用sudo可能更容易:运行sudo true以获取状态凭据,然后在该凭据仍然有效的情况下运行echo 'shopt -p login_shell; echo $-' | sudo -i

另请参见登录外壳程序和非登录外壳程序之间的区别?


4

我看过图形登录环境可以:

exec "$SHELL" -l -c 'exec start-window-or-session-manager'

或等同于:

exec -a "-$SHELL" "$SHELL" <<EOF
exec start-window-or-session-manager
EOF

这样就可以读取并应用会话初始化文件(例如,~/.profile对于类似Bourne的shell(以及其中的对应shell /etc))。

第一个不适用于所有外壳。-l有很多外壳程序支持它,但不是全部,并且在某些外壳程序(例如csh/ tcsh)上不能与一起使用-c。但是,所有外壳程序argv[0]-可以理解存在的第一个字符,因为这是login用来告诉外壳程序它们是登录外壳程序的原因。

在第二种情况下,该外壳的标准输入不是tty设备(<<通过临时的常规文件或取决于外壳的管道来实现)以外的东西,因此外壳不是交互式的(当人类进行交互时,交互的定义是用它)。


第一个是使用该--login选项。对于第二个,如果我这样做了exec -a "-bash" "bash" <<<"shopt -p login_shell; echo $0 $-"(用C qoutes编码),$'/etc/profile read\nshopt -s login_shell\nbash himBH'那么它是登录名,但它是交互式的。我们需要登录和非交互式。我想念的是什么?

@sorontar with <<<"$-"$-由于双引号引起了调用外壳的扩展。被调用的外壳程序不是交互式的,因为它的标准输入不是tty。
斯特凡Chazelas

啊,是的,您是正确的,先生。但是,要纠正错误,我们可以执行以下操作:exec -a "-bash" "bash" <<\EOF shopt -p login_shell; echo $0 $- EOF获得此确认:$'/etc/profile read stdin: is not a tty shopt -s login_shell -bash hB'因此,是的,可以使用非交互式登录外壳,并且该外壳仍显示为/etc/profile。我们是否应该得出结论,所有登录shell都可读/etc/profile

ksh非常清楚地表明它是一个非交互式的登录shell,请尝试exec -a "-ksh" "ksh" <<\EOF echo $0; set -o EOF,:)。

1
@sorontar,我想您可以期望大多数shell实现在被称为登录shell时读取其会话初始化文件。它们取决于外壳实现和版本。在的情况下bash,启动文件处理是非常混乱的IMO,您会发现某些系统对其进行了修补,以使其行为更加合理,从而增加了更多变化。
斯特凡Chazelas

3

是的,可以使用非交互式登录外壳

$ head -1 /etc/profile
echo PROFILE BEING READ

$ echo echo hello | su -
PROFILE BEING READ
stdin: is not a tty
hello

$

类似于以下简化:su -c 'echo hello' -。其中,以测试我们所需要的,应该写成:su -c 'echo $0 $-; shopt -p login_shell' -得到这个确认的回答(在C引号编码): $'/etc/profile read \n -su hBc \n shopt -s login_shell'。这证实了登录非交互式外壳已被盗用,并且在此过程中读取了/ etc / profile。谢谢。

0

是否可以使用非交互式登录外壳程序(未使用--login或-l调用)?

是。

$ (exec -a '-' bash -c 'shopt -q login_shell && echo login shell')

但是,请注意,/etc/profile除非提供了--login参数,否则将不会用于非交互式登录外壳。

调用非交互式登录shell的常见用法是:

$ su - someuser -c somecommand

但这会遭受/etc/profile无法执行的事实。

可以更改此行为,但是它涉及在编译时通过取消注释config-top.h中的选项来自定义Bash源代码:

/* Define this to make non-interactive shells begun with argv[0][0] == '-'
run the startup files when not in posix mode. */
/* #define NON_INTERACTIVE_LOGIN_SHELLS */

当我研究此su异常时,我发现其他外壳(包括zsh并且dash没有此差异)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.