>  기사  >  백엔드 개발  >  Linux/Unix 로그인 스크립트

Linux/Unix 로그인 스크립트

伊谢尔伦
伊谢尔伦원래의
2017-02-03 15:38:391269검색

환경 변수를 설정해야 하거나 쉘 또는 데스크탑 환경을 설정하기 위해 프로그램을 실행해야 할 때 이러한 시나리오를 접한 적이 있는지 모르겠지만 가장 편리한 위치가 어디인지 모르겠습니다. 설정하세요.

Debian의 패키지 관리자부터 Iaas 관리까지 몇 가지 일반적인 상황이 있으며, 많은 작업이 제대로 실행되기 위해서는 환경 변수를 설정해야 합니다.

경우에 따라 xrandr 명령과 같이 프로그램은 일반적으로 처음 로그인할 때 한 번만 실행하면 됩니다.

또한 rbenv, rvn 또는 SitePoint의 자체 envswith 프로그램과 같은 프로그램이 때때로 셸에 삽입됩니다.

Debian GNU/Linux Jessie 설치에 나타나는 몇 가지 일반적인 옵션을 살펴보고 모든 것을 이해해 봅시다.

/etc/profile

기본적으로 데비안은 /etc/profile 파일을 제공합니다. 이 파일은 $PATH 변수를 설정하는 데 사용됩니다($PATH는 일반적으로 검색 경로를 선언하는 데 사용됩니다). 명령)을 즉시 적용할 수 있습니다. 아래 코드는 /etc/profile의 일부입니다.

if [ "`id -u`" -eq 0 ]; then
    PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
    PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH

편의상 루트 사용자(ID 0)의 경로는 다른 사용자와 다릅니다. 이는 시스템 바이너리 디렉터리(sbin 디렉터리)의 위치가 전통적으로 루트로 실행되어야 하는 시스템 관리 프로그램이나 프로그램용으로 예약되어 있기 때문입니다. 루트 사용자는 꼭 필요한 경우가 아니면 게임 프로그램을 실행할 수 없으므로 게임 경로는 생략합니다.

다음으로 /etc/profile은 $PS1 변수의 설정을 처리합니다. $PS1 변수는 기본 프롬프트 문자열(즉, 사용자가 로그인할 때 표시되는 문자)을 설정하는 데 사용됩니다. 시스템 쉘이 Bash라는 점을 제외하면 시스템 $PS1 변수는 기본적으로 $로 설정됩니다(루트 사용자의 기본값은 #입니다). 시스템의 쉘이 Bash를 사용하는 경우 /etc/bash.bashrc 파일은 $PS 변수를 대체하여 기본 프롬프트 문자열을 처리합니다(특별한 상황 제외). 나중에 /etc/bash.bashrc에 대해 간략하게 설명하겠습니다.

이 시점에서 로그인하는 동안 모든 쉘이 /etc/profile을 읽는다는 것을 추론할 수 있습니다(예: login 명령 사용). /etc/profile은 보다 효율적인 Bash 내장 변수 ${UID}를 사용하는 대신 id 명령을 호출하여 사용자 ID를 읽습니다. Bash는 다른 많은 쉘에서는 정의하지 않는 u(사용자 이름) 및 h(호스트 이름)와 같은 백슬래시 이스케이프 특수 문자를 지원하기 때문에 멋진 쉘 프롬프트를 정의하는 대신 소스별 구성을 사용합니다. /etc/profile은 사용자가 직접 설치할 수 있는 모든 쉘과 호환되도록 POSIX 규격을 준수해야 합니다.

Debian GNU/linux에는 일반적으로 POSIX(및 일부 Berkeley) 확장 기능만 구현하도록 설계된 기본 셸인 Dash가 사전 설치되어 있습니다. /etc/profile을 수정하여(수정하기 전에 백업) PS1='$ ' 행에 다른 값을 설정한 다음 Dash 로그인을 시뮬레이션하면(dash -l 명령을 통해) Dash가 맞춤형 힌트. 그러나 -l 매개변수 없이 dash 명령을 호출하면 dash는 /etc/profile을 읽지 않습니다. 이때 Dash는 기본값을 사용합니다(이는 현재 PS1의 값이 수정 전의 값임을 의미합니다).

/etc/profile에 대한 마지막 흥미로운 점은 다음 코드 조각입니다.

if [ -d /etc/profile.d ]; then
    for i in /etc/profile.d/*.sh; do
        if [ -r $i ]; then
            . $i
        fi
    done
    unset i
fi

즉, /etc/profile.d/*.sh와 일치하는 읽을 수 있는 모든 항목은 가변 소스. 이는 /etc/profile을 직접 편집하는 것이 실제로 필요하지 않음을 보여주기 때문에 매우 중요합니다(따라서 이전 백업을 복원하십시오). 위에 정의된 모든 변수는 별도의 파일에서 구성한 다음 /etc/profile의 설정을 재정의할 수 있습니다. 이것의 장점은 시스템이 업그레이드될 때 해당 변경 사항이 /etc/profile 파일에 자동으로 추가될 수 있다는 것입니다. 데비안의 Apt 패키지 관리 시스템은 일반적으로 기본 구성 파일을 수정하지 않기 때문입니다.

~/.bash_profile, ~/.bash_login 및 ~/.profile

/etc/profile의 잠재적인 문제는 시스템 전체 경로에 있다는 것입니다. 이는 이를 수정하면 이 시스템의 모든 사용자에게 영향을 미친다는 것을 의미합니다. 개인용 컴퓨터에서는 이것이 큰 문제가 아닐 수도 있지만 수정하려면 루트 권한이 필요합니다. 이러한 이유로 각 개별 Bash 사용자 계정은 Bash 구성 파일의 소스로 ~/.bash_profile, ~/.bash_login 및 ~/.profil 파일을 생성할 수 있습니다. 나열된 순서대로 발견된 첫 번째 파일이 구성 파일로 사용되고 나머지는 무시됩니다.

Dash와 같은 다른 셸도 비슷한 기능을 지원하지만 ~/.profile 파일만 찾습니다. 이를 통해 사용자는 어느 시점에서 로그인 셸로 Dash 또는 다른 셸로 전환해야 하는 경우(예: chsh -s dash 명령을 통해) Bash 관련 사용 사례에 대해 별도의 .bash_profile 파일을 구성할 수 있습니다. ~/.profile은 이러한 쉘의 구성 파일로 유지될 수 있습니다.

需要牢记的一点是,默认的Debian框架目录(/etc/skel,用于存放要复制到新用户账户主目录的文件和目录)包含.profile文件,但不包含.bash_profile和.bash_login文件。此外Debian使用Bash作为默认的shell,因此,许多Debian用户习惯于将他们的Bash 登录shell设置放在.profile文件中。

我曾经看到过一些项目的安装说明,例如RVN,这个项目建议用户创建一个.bash_profile文件,但是这样做是非常危险的,根据上面提到的知识我们知道,这个会改变用户的shell环境。即使用户没有修改.profile文件,它也可能利用默认~/.profile功能,将~/bin添加到$PATH环境变量。一个可能提高安全性的选项是,在创建用户的账户之前,将.bash_profile作为.bash_rc的符号链接文件,放到/etc/skel目录中。

如果我们查看Debian Jessie的默认.profile脚本,我们可以看到下面的代码片段:

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

这和我们在/etc/profile里面看到的相似,如果shell是Bash,且发现了/etc/bash.bashrc文件,/etc/bash.bashrc文件就被当作Bash的配置文件。这一点的意义将在下一节讨论。

/etc/bash.bashrc 和 ~/.bashrc

启动的时候,Bash会同时读取/etc/bash.bashrc和~/.bashrc,但是只有在Bash Shell作为交互式Shell而不是登录Shell启动时(意味着通过xtem启动),会依照这种顺序,这是Bash Shell的标准行为。然而,Debian分别从 /etc/profile和~/.profile登录脚本中获取配置文件。这会显著地改变行为,使得/etc/bash.bashrc和.bashrc(如果它们存在)总是在Bash启动时调用,而不管是不是登录Shell。不要期待这种情况在不同地发行版中是一样的。

.bashrc是一个添加命令别名的好地方,实际上,一些用户拥有太多的别名,以至于他们宁愿将别名都放在一个单独的文件中去。Debian的默认.bashrc会查找.bash_alias,如果这个文件存在的话,会将它作为别名配置来源。所以你可以在这个文件中随意保存所有的Bash别名。如果用户愿意的话,.bashrc文件也是用户重写shell变量,例如$PS1或者$HISTSIZE的绝佳位置。Debian的默认.bashrc有超过100行,但是仍然可以非常清晰地阅读,且有良好地注释。见名知意,.bashrc不是其他非Bash shell的配置文件来源。

~/.xsession 和 ~/.xsessionrc

如果你是一个GNU/Linux桌面用户,通过显示管理器本地登录(而不是通过getty登录程序),则/etc/profile和~/.profile不会像预期的那样工作。一些显示管理器会直接将这些文件视为错误地配置文件,例如Gnome显示管理器。但一些其他的显示管理器,例如LightDm不会这样。幸运的是,你还有一些其他的选项。

当启动X Window系统会话时(不管是用显示管理或从虚拟终端启动startx),将会执行/etc/X11/Xsessionshell脚本。这基本上相当于登录shell调用/etc/profile。这个只对X Window生效,并且不是将其作为源配置文件,而是直接执行。但是它也相当复杂,类似于/etc/profile怎么从/etc/profile.d目录中的脚本读取配置,怎么从/etc/X11/Xsession.d/目录下的/etc/X11/Xsessions脚本中读取配置。在/etc/X11/Xsession.d目录下的所有脚本名称都以数字开头,因此所有的脚本都会按照数字顺序来读取。

Debian Jessie包含一个名叫40×11-common_xsessionrc的文件,这个文件做的工作就是检查~/.xsessionrc是不是可读的,如果是就用它作为配置文件的来源。这就使得~/.xsessions是一个加载环境变量或者运行一个一次性使用程序(例如xrandr或xmodmap)的完美位置(仅适用于X会话)。如果你希望的话,你同样可以将/etc/profile或~/.profile作为来源。那么任何指定的环境变量也都会被你的会话管理器继承(如果还没有继承的话)。请注意,默认情况下.xsessionrc是不存在的,需要你自己创建这个文件。

如果我们继续浏览/etc/X11/Xsession中的文件, 我们会发现50×11-common_determine-startup会决定加载哪个会话管理器。如果~/.xsessions文件存在而且是可执行的,它会被保存并且随后作为99×11-common_start的一部分执行,当~/.xsession用于运行会话管理器,X会话将会被注销。并且当这个脚本终止时,你会返回到显示管理器登录界面。

和~/.xsessionrc相似,~/.xsession默认也是不存在的,在你需要的时候你可以创建一个。你可能会创建一个类似下面给的简单的.xsession脚本

# Start our session manager of choice.
#
exec x-session-manager

其中x-session-manager默认设置为通过update-alternatives命令配置的任何内容,这样,你可以轻松地更改系统范围默认地会话管理器,只需要将x-session-manager替换为/usr/bin/startfce4(切换到XFCE),其他的用户账户将完全不受影响。

当然,许多显示管理器提供从登录界面直接选择公共会话管理器的能力,所以这个文件通常是不必要的。然而.xsession提供了更多地灵活性,你可以用任何程序调用这个文件,而不仅仅是会话管理器。例如,在这里你可以在while循环中调用chromium或者iceweasel,而不是执行基本的kiosk模式设置。

~/.bash_logout

我们前面介绍了当用户运行交互式Bash登录shell时读取的文件,但是如果你想在注销以后仍然运行程序该怎么办?对于这个用例,~/.bash_logout文件就非常方便了。在Debian中默认的配置仅用于清除屏幕(我认为从安全角度来说很重要),但是可以轻微地想象以下就知道能用于其他目的,例如,在你离开你的机器之前显示一个几秒钟的提醒。

主要的限制因素在于.bash_logout仅在注销交互式shell时读取,并且并不能假定它在注销X会话时会被加载。

其他选项

上面那些已经为你介绍了大部分的通用选项。其他的选项可能会存在,取决于你的安装环境(例如/etc/environment),但是我不认为他们可能在其他的平台上存在,并且极少有需要去接触它们。

示例

那么你应该在哪放置你的系统范围环境变量?如果你希望一个环境变量可以影响所有用户,/etc/profiled./someifle.sh会是一个好的选择。但是,这假设你是使用一个登录管理器以/etc/profile作为配置来源。如果不是这样,你可以(作为一个管理员)添加一个脚本到/etc/X11/Xsession.d/来替代/etc/profile作为配置来源。

如果你希望一个脚本可以找到一个私人目录路径,并且添加它到你的PATH中,你需要考虑这个目录是不是会移动很多东西,如果你向.profile添加代码来实现,用户需要注销然后再登录来更改用户会话期间的PATH。如果你将代码添加到.bashrc中,这意味着代码将在用户每次打开xterm时执行,如果执行大约半秒以上可能就不太理想。所以这是一个权衡取舍的问题。

如果你仅仅是为了你个人登录会话时的一个环境变量,且它只关心X会话,你可以将它添加到~/.xsessionrc中。这样做的优点是,它通常将可用于通过X会话管理器启动的所有程序,因为它在启动X会话管理器之前被设置,并且被继承。例如,某些图形驱动程序可以通过运行

export vblank_mode=0

来禁用vsync。 所以位于.xsessionrc中的变量会影响到所有的程序。

然而如果这一行被添加到.bashrc中,则只有通过xterm登录的程序会被影响。通过一个窗口管理器启动的程序照常运行。你可以把它添加到.profile,并且从.xessionrc作为.profile的来源。但是之后,当你的X服务没有在运行的时候,你就不需要导出环境变量。

希望你现在可以更好地了解了登录和注销脚本在Debian GNU/Linux系统上的工作原理。


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.