首页 >科技周边 >IT业界 >理解 *NIX登录脚本

理解 *NIX登录脚本

Lisa Kudrow
Lisa Kudrow原创
2025-02-19 12:30:12574浏览

Understanding *NIX Login Scripts

理解 *NIX登录脚本

钥匙要点

    /etc /profile脚本,登录过程中所有shells读取的 /etc /profile脚本用于设置$路径和$ ps1,以及source /etc/bash.bashrc。
  • >单个bash用户帐户可以创建一个文件之一〜/.bash_profile,〜/.bash_login或〜/.profile可以来源,从而允许使用特定于用户的设置。
  • >
  • bash将同时读取/etc/bash.bashrc和〜/.bashrc,启动时是不是登录外壳的交互式外壳,但是debian从/etc/profile和〜/.profile登录脚本来源分别。
  • 〜/.xsessionrc是加载环境变量或运行一次仅适用于x sessions的一次性实用程序的理想场所,〜/.bash_logout在从交互式外壳中登录时会读取。 对于系统范围的环境变量,/etc/profile.d/somefile.sh是一个很好的选择,而对于可能会四处走动的个人目录位置,可使用。效率和会话灵活性。
  • >您是否曾经面临过需要设置环境变量或运行程序以更改外壳或桌面环境的方案,但不知道从?
  • 这是一个普遍情况。许多任务都需要环境变量才能正确运行,从运行Debian包装实用程序到管理IaaS以及两者之间的所有内容。
>有时,程序通常只需要运行一次,例如Xrandr命令。此外,程序偶尔期望将其注入外壳,例如RBENV,RVM或SITEPONT自己的Envswitch实用程序。

这些设置不应只是从任何地方加载。有时,在对最佳地点做出判断之前,应该考虑许多因素。

>让我们看一下Debian GNU/Linux Jessie安装上存在的一些常见选择,并尝试使这一切都有意义。

/etc/profile

默认情况下,debian提供 /etc /profile,它立即用于设置$路径(用于声明命令搜索路径)。

>

>为方便起见,root用户(用户ID 0)获取针对其他所有人定义的不同路径。这是因为系统二进制(SBIN)位置是理想保留的,用于系统管理或必须作为root运行的程序。 root省略了游戏路径,因为除非绝对必要

下一步, /etc /profile处理$ PS1的设置,该设置用于设置主提示字符串。除非外壳是bash,否则定义的默认值为“ $”(或root的'#')。如果外壳是bash,/etc/bash.bashrc将被采购以处理(除其他方面)。我们将很快讨论/etc/bash.bashrc。

>因此,在这一点上,我们可以在登录过程中被所有shell读取 /etc /profile(即通过登录命令)读取。而不是使用更高效的bash内置变量$ {uid}来确定用户ID, /etc /profile调用ID命令。除了定义精美的外壳提示,而不是定义特定于BASH的配置,因为Bash支持BackSlash escaped的特殊字符,例如U(username)和H(主机名),许多其他外壳都不会。 /etc/profile应该尝试符合posix,以便与用户可能为自己安装的任何外壳兼容。

>

> debian gnu/linux通常是用Dash预装的,Dash是一个基本的外壳,仅旨在实现POSIX(和某些伯克利)扩展。如果我们修改 /etc /profile(先制作备份!)以使PS1 ='$'行设置不同的值并模拟dash登录(通过dash -l命令),我们可以看到dash使用我们定义的提示。但是,如果我们不读取没有-l参数的dash命令,则未读取 /etc /profile,dash降回默认值(顺便说一句,这是原始ps1值在我们修改之前的内容)。

关于 /etc /profile的最后一个有趣的事情是以下片段:>

换句话说,匹配/Etc/profile.d/j.sh glob的任何可读的内容都是可匹配的。这很重要,因为它表明直接需要直接需要编辑 /etc /profile(因此还原您之前做出的备份!)。上面定义的任何变量都可以在单独的文件中覆盖。这样做的一个好处是,它允许系统升级可以自动添加 /etc /profile的更改,因为Debian的APT软件包管理系统通常不会触及修改的配置文件。
<span>if [ "<span><span>`id -u`</span>"</span> -eq 0 ]; then
</span>    <span><span>PATH</span>="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
</span><span>else
</span>    <span><span>PATH</span>="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
</span><span>fi
</span><span>export PATH</span>
>

〜/.bash_profile,〜/.bash_login和〜/.profile

> /etc /profile的一个潜在问题是它位于系统范围的路径中。这意味着那里的变化会影响系统上的所有用户。在个人计算机上,这似乎不是一个问题,但是改变它需要根特权。由于这些原因,每个bash用户帐户都可以创建一个文件〜/.bash_profile,〜/.bash_login或〜/.profile要采购 - 并且在任何时都使用第一个文件(以列出的顺序搜索)。剩下的文件被忽略。其他外壳(例如破折号)支持类似的东西,但仅查看〜/.profile。这允许用户为BASH特定情况创建.bash_profile,如果她有时会切换到dash或其他某些外壳作为登录外壳(例如通过CHSH -S dash命令),则可以保留〜/.profile用于那用例。

>需要牢记这一点的重要性。默认的Debian Skeleton目录(/etc/Skel,用于容纳要复制到新用户帐户的文件和目录Home Directories)包含一个.profile文件,但不包括.bash_profile或.bash_login文件。另外,Debian使用Bash作为默认用户外壳。因此,许多用户习惯于将其bash登录外壳设置放在.profile中。

>

>我已经看到了诸如RVM之类的项目的安装说明,请指示用户创建.bash_profile文件,但这很危险,因为它可能会破坏用户的外壳环境!即使用户没有修改。这将不再起作用。一个可能提高安全性的选项是在创建用户帐户之前,将.bash_profile作为符号链接添加到.bashrc in /etc /skel。

如果我们查看Debian Jessie的默认脚本。

这与我们在 /etc /profile中看到的内容相似,其中 /etc /bash.bashrc(如果发现,壳)为bash。下一节将讨论这一点的意义。
<span>if [ "<span><span>`id -u`</span>"</span> -eq 0 ]; then
</span>    <span><span>PATH</span>="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
</span><span>else
</span>    <span><span>PATH</span>="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
</span><span>fi
</span><span>export PATH</span>
>

/etc/bash.bashrc和〜/.bashrc 启动时,Bash将以该顺序读取/etc/bash.bashrc和〜/.bashrc,但前提)。这是Bash Shell的标准行为。但是,debian分别从/etc/profile和〜/.profile登录脚本来源。这有效地改变了行为,使得 /eTC /bash.bashrc和.bashrc(如果存在)在启动bash shell时总是调用,无论是否是登录外壳。不要指望这种行为在不同的分布中相同。

.bashrc是添加命令别名的好地方。实际上,有些人有很多别名,他们更喜欢将它们保存在单独的文件中。 Debian的默认.bashrc寻找〜/.bash_aliases并在文件存在的情况下来源,因此请随时将所有bash别名保留在此处。 .bashrc也是用户覆盖外壳变量(例如$ ps1或$ histsize(如果需要保留的命令记录))的最佳场所。 Debian的默认.bashrc长100行,但很简单,并且评论得很好。顾名思义,预期不预计Bashrc将通过非式壳壳来提供。

>

〜/.xsession和〜/.xsessionrc

如果您是GNU/Linux桌面用户,可以通过显示管理器本地登录(而不是通过Getty登录程序),/etc/profile和〜/.profile无法正常工作。一些显示经理会错误地直接源自这些文件(例如GNOME显示器管理器),但其他DMS(例如LightDM)则没有。幸运的是,您还有其他选择。

>启动X窗口系统会话(无论使用虚拟终端中使用显示管理器或StartX)时,将执行/etc/x11/xsession shell脚本。这基本上是登录外壳使用的 /etc /profile的等效词,仅用于x,而不是来源而不是直接执行。它也更加复杂。类似于/etc/profile.d,/etc/etc/x11/xsession sources脚本下的脚本中的/etc/profile的方式类似。此目录中的所有脚本都以一个数字开始,因此脚本将按编号顺序加载。> debian Jessie在其中包含一个名为40x11-Common_xsessionrc的文件。它所做的只是检查〜/.xsessionrc是否可读,并(如果是)来源。这使得〜/.xsessionRC成为加载环境变量或仅适用于X会话的启动时(例如Xrandr或Xmodmap)的一次性实用程序的理想场所。您也可以将其用于源/etc/profile和〜/.。如果您愿意的话,因此您的会话管理器也会继承所指定的任何环境变量(如果还没有)。请注意,默认情况下不存在.xsessionrc,因此您必须创建它。

>

如果我们继续浏览/etc/x11/xsession中的文件,我们会找到50x11-common_determine-startup,将会话管理器确定为 加载。如果存在〜/.xsession文件并且是可执行文件,则将作为99x11-Common_start的一部分保存和执行。由于〜/.xsession是为了运行会话管理器,因此X会话将注销,此脚本终止时,您将返回显示器登录屏幕。

fike〜/.xsessionrc,〜/.xsession默认不存在,因此,如果需要,您必须创建一个。您可能会创建一个简单的.xsession脚本,该脚本如下:

>

> X-Session-Manager默认为通过Update-Alternatives命令配置的任何内容。这样,您可以通过SAIS,/usr/bin/startxfce4(切换到XFCE)来替换X-Session-Manager,可以轻松地将Sessair Manager从系统范围的默认设置中移开,而其他用户帐户将完全不受影响。

当然,许多显示经理提供了直接从登录屏幕中选择通用会话经理的能力,因此通常不需要此文件。但是,Xsessess提供了很大的灵活性,您可以在此处调用任何程序,而不仅仅是会话经理。例如,您可以在此处循环中调用Chromium或IceWeasel,而是在此处实现基本的售货亭模式设置。>

〜/.bash_logout

>我们以前介绍了用户运行交互式bash登录外壳时读取的文件,但是如果您要在登录时要运行程序怎么办?对于那个用例,〜/.bash_logout是您的朋友。 Debian中包含的默认值仅用于清除屏幕(我认为从安全角度来看很重要),但是可以将一些想象力用于其他目的,例如,在您之前显示提醒几秒钟之前远离机器。

>主要限制因素是.bash_logout仅在从交互式外壳中登录时读取。

其他选项

涵盖了您可用的最常见选项。可能存在其他选项,具体取决于您的安装(例如 /etc /环境),但我不认为它们可能存在于其他平台上,并且很少需要触摸这些。

>示例

那么,您应该在哪里放置整个系统的环境变量?如果您希望一个环境变量影响每个用户,/etc/profile.d/somefile.sh是一个很好的选择。但是,这假设您使用的是登录管理器,该管理器来源 /etc /profile。如果没有,您可以(作为管理员)将脚本添加到/etc/x11/xsession.d/ inocer/etc/profile。

>如果您希望脚本找到个人目录位置并将其添加到您的路径中,则需要考虑该目录是否会四处移动。如果将代码添加到.profile中,则用户将需要注销并再次进入路径以反映用户会话期间目录更改的路径。相反,如果您将代码添加到.bashrc,则意味着每次用户打开XTERM时执行代码 - 如果执行超过半秒钟左右,则可能不是理想的。因此,这是权衡权衡取舍的问题。

>

>如果您只想为您的个人登录会话变量一个环境变量怎么办?如果仅涉及X会话,则可以将其添加到〜/.xsessionrc。这具有一个优势,通常将用于通过X Session Manager启动的所有程序,因为它是在启动X Session Manager之前设置的,因此已继承。例如,某些图形驱动程序可以通过运行

来禁用Vsync

因此,将.xsessionrc放置在所有程序中。

但是,如果将该行添加到.bashrc中,则只有通过XTERM启动的程序会受到影响;通过窗口管理器启动器启动的程序将正常运行。您可以将其添加到.xsessionrc中的.profile和source .profile,但是即使您的X服务器不运行,您也不必要导出环境变量。
<span>if [ "<span><span>`id -u`</span>"</span> -eq 0 ]; then
</span>    <span><span>PATH</span>="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
</span><span>else
</span>    <span><span>PATH</span>="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
</span><span>fi
</span><span>export PATH</span>
>

希望您现在可以更好地了解登录和注销脚本如何在Debian GNU/Linux系统上使用。如果您为这些登录和注销脚本创建或遇到了任何特别有趣或创意的用途,以及您如何处理它,请让我们知道。

>。

在本系列中,我将讨论dotfile管理选项。

>

经常询问有关NIX登录脚本的问题(常见问题解答)

> NIX登录脚本在系统配置中的重要性是什么?它们是当用户登录到NIX系统时会自动运行的脚本。这些脚本用于设置用户的环境,包括设置环境变量,定义函数和运行其他脚本。这允许在不同的会话甚至不同的机器上建立一致且可重现的环境。它还提供了一种方法来自动化需要在登录时执行的任务,节省时间并降低了错误的可能性。

>如何创建NIX登录脚本?脚本涉及编写一个用户登录时执行的shell脚本。此脚本通常放置在用户的主目录中,并命名为.nix-profile。该脚本可以包含您要在登录时运行的任何命令,例如设置环境变量或启动服务。创建脚本后,您可以通过运行命令CHMOD x .nix-profile。通过在脚本开头添加SET -X完成。这将导致外壳在执行每个命令之前打印它,这可以帮助您确定任何错误或意外行为。如果脚本在没有错误但没有产生预期结果的情况下运行,则可以在整个脚本中添加Echo语句,以打印变量或其他信息的值,以帮助您了解正在发生的事情。 NIX登录脚本要管理软件包?

是的,NIX登录脚本可用于管理软件包。 NIX具有功能强大的软件包管理系统,可让您以一致且可重复的方式安装,升级和删除软件包。您可以在登录时使用NIX登录脚本自动安装或更新软件包,以确保您的环境始终具有您需要的软件的最新版本。

>如何使用nix登录脚本设置环境变量?

>在nix登录脚本中设置环境变量与添加诸如export varname = value的行一样简单。这将把环境变量变量设置为登录会话持续时间的值值。您还可以使用“导出命令”使子过程可用。例如,导出路径= $ path/path/to/dir会添加/路径/dir到路径环境变量,在该目录中可执行可执行文件,而无需指定完整的路径。

>我使用NIX登录脚本运行服务?这可以通过将命令添加到启动所需服务的脚本中来完成。例如,您可以添加诸如SystemCtl启动ServiceName之类的行以启动SystemD服务。请注意,您将需要适当的权限来启动服务,因此这可能需要使用sudo或root。要使NIX登录脚本在登录时自动运行,您需要将其添加到Shell的启动文件中的适当位置。对于bash,这通常是主目录中的.bash_profile或.bashrc文件。您可以在开始新的bash session时在此文件中添加诸如源〜/.nix-profile之类的行以运行nix登录脚本。

我可以使用nix登录脚本来自定义我的shell提示吗? >

是的,您可以使用NIX登录脚本来自定义Shell提示。这可以通过在脚本中设置PS1环境变量来完成。例如,导出ps1 =“ u@h:w $”将设置提示以显示用户名,主机名和当前目录。

如何使用nix login脚本来管理我的路径?

通过NIX登录脚本管理路径

涉及将目录添加到路径环境变量。这可以通过诸如导出路径= $ path/path/to/dir之类的行完成,该行将/路径/to/dir添加到路径中。这使该目录中的可执行文件无需指定完整路径。您可以根据自己的意愿将尽可能多的目录添加到路径中,用结肠分开它们。

>我可以使用NIX登录脚本来自动化任务吗?需要在登录时执行的任务自动化。这可以包括从设置环境变量和启动服务到安装软件包和更新软件的任何内容。通过自动执行这些任务,您可以节省时间,并确保每次登录时都会始终执行它们。

以上是理解 *NIX登录脚本的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn