Differences between version 3 and predecessor to the previous major change of HowToPath.
Other diffs: Previous Revision, Previous Author, or view the Annotated Edit History
Newer page: | version 3 | Last edited on Tuesday, October 26, 2004 1:37:12 am | by StuartYeates | Revert |
Older page: | version 2 | Last edited on Friday, June 7, 2002 1:07:18 am | by perry | Revert |
@@ -1,1252 +1 @@
-
-
-
-PATH HOWTO
-
-
-
-----
-
-!!!PATH HOWTO
-
-!!Esa Turtiainen etu@dna.fiv0.4, 15 November 1997
-
-
-
-
-!!1. Introduction
-
-
-
-
-!!2. Copyright
-
-
-
-
-!!3. General
-
-
-
-
-!!4. Init
-
-
-
-
-!!5. Login
-
-
-
-
-!!6. Shells
-
-
-*6.1 bash
-
-*6.2 tcsh
-
-
-
-
-
-!!7. Changing user ID
-
-
-*7.1 su
-
-*7.2 sudo
-
-
-
-
-
-!!8. Network servers
-
-
-*8.1 inetd
-
-*8.2 rsh
-
-*8.3 rlogin
-
-*8.4 telnet
-
-*8.5 ssh
-
-
-
-
-
-!!9. XFree86
-
-
-*9.1 XDM
-
-*9.2 xterm -ls
-
-*9.3 Window manager menus and buttons
-
-
-
-
-
-!!10. Delayed commands cron and at
-
-
-*10.1 cron
-
-*10.2 at
-
-
-
-
-
-!!11. Some examples
-
-
-*11.1 magicfilter
-
-*11.2 Printing from X applications
-
-
-
-
-
-!!12. Security concerns
-
-
-
-
-!!13. How to debug problems?
-
-
-
-
-!!14. Some strategies to get the same path for all the users
-
-
-
-
-!!15. Acknowledgements
-----
-
-!!1. Introduction
-
-
-
-
-
-This document describes common tricks and problems with Unix / Linux
-environment variables, especially with PATH variable. PATH is a list
-of directories where commands are looked for. The details apply for
-Debian Linux 1.3 distribution.
-
-
-Note! This document is in beta release status. Please send comments
-and corrections.
-
-
-
-
-
-
-----
-
-!!2. Copyright
-
-
-
-
-
-
-
-
-This documentation is free documentation; you can redistribute it
-and/or modify it under the terms of the GNU General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-
-This documentation is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
-
-
-You should have received a copy of the GNU General Public License
-along with this documentation; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-
-
-
-
-
-----
-
-!!3. General
-
-
-
-
-
-All the Unix processes contain an "environment". This is a list of
-variables that contain name and value, both just strings that can
-contain most characters. All Unix processes have a parent process -
-the process that created this process as child. Child processes
-inherit environment from parent process. They can make some
-modifications to the environment before passing it in turn to their
-child processes.
-
-
-One important environment variable is PATH, a list of directories
-separated by colons (':'). These directories are searched through to
-find commands. If you try to invoke command 'foo', all the
-directories in PATH (in that order) are searched for an executable
-file 'foo' (one with x-bit on). If a file is found, it is executed.
-
-
-In this howto, I use term 'command' to refer executable program that
-is meant to be called with short names, using the path mechanism.
-
-
-In Linux, even the low level operating system calls to start
-processes (the exec family of calls) searches through directories in
-the PATH variable: you can use the path mechanism anywhere where you
-try to execute a command. If exec operating system call gets a file
-name that does not contain '/', it evaluates the PATH environment
-variable. Even if there is no variable PATH in the environment, at
-least directories /bin and /usr/bin are looked for suitable commands.
-
-
-In sh you use export command to set environment, in csh you use setenv
-command. For example:
-
-
-sh:
-
-
-PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:.
-
-
-csh:
-
-
-setenv PATH /usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:.
-
-
-
-
-C-programs can use setenv() library call to change environment. Perl
-has environment in an associative array %ENV, you can set PATH as
-$ENV{PATH}="/bin".
-
-
-env command is the basic way of asking the current environment
-variables. It can be used to modify it as well.
-
-
-More information of the basic environment mechanism can be found from
-manual pages 'environ', 'execl', 'setenv', info file 'env' and
-documentation of shells.
-
-
-When Linux boots up, the first normal process that starts is the init
-process. It is a special process because it does not have parent.
-However, it is the ancestor of all the other processes. Init
-environment will remain as environment of all the processes if they do
-not touch it explicitly. Most processes do touch.
-
-
-Init starts a group of processes. File /etc/inittab tells what
-processes the system starts. These processes work in the environment
-that is directly inherited from init - typically they are processes
-like 'getty', the program that writes 'login:' to console. If you
-start PPP connections
here, you must remember that you are working in
-the init environment. The system initialization is often a script
-that is started here. In Debian 1.3 initialization script
-/etc/init.d/rc and it calls other initialization scripts in turn.
-
-
-The system contains many running servers (daemons) that may or may not
-use the default environment. Most servers are started from the
-initialization scripts and thus they have the init environment.
-
-
-When user logs in to the system, the environment is affected by the
-settings that are compiled into the programs, system wide
-initialization scripts and user initialization scripts. This is
-pretty complicated and the current situation is not completely
-satisfactory. It is totally different if user logs in from text
-console, XDM or from network.
-
-
-
-
-
-
-----
-
-!!4. Init
-
-
-
-
-
-Init is a parent process for all the other processes of the
-system. Other processes inherit environment of the init process and
-the path is the init path in the rare case that no other path is set.
-
-
-The 'init path' is fixed in the source of the init program and it is:
-
-
-
-
-
-/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin
-
-
-
-
-Note that init path does not contain /usr/local/bin.
-
-
-All the programs that are started from /etc/inittab work in init
-environment, especially system initialization scripts in /etc/init.d
-(Debian 1.3).
-
-
-Everything that is started from system initialization scripts has init
-environment as default environment. For example, syslogd, kerneld,
-pppd (when started from startup), gpm and most importantly lpd and
-inetd have init environment and they do not change it.
-
-
-A group of programs are started from startup scripts but the PATH
-environment variable is explicitly set in the startup script.
-Examples are: atd, sendmail, apache and squid.
-
-
-There are other programs that are started from boot scripts but they
-change the path completely. One such example is cron.
-
-
-
-
-
-
-----
-
-!!5. Login
-
-
-
-
-
-In text console there is a getty program waiting for user login. It
-writes 'login:' and other messages. It is working in init
-environment. When getty gets user to log in to the system, it invokes
-the 'login' program. This program sets the user environment and
-invokes the shell.
-
-
-Login program sets path as defined in /usr/include/paths.h. This
-'login path' is different for root users and other users.
-
-
-for common users (_PATH_DEFPATH):
-
-
-/usr/local/bin:/usr/bin:/bin:.
-
-
-for root (_PATH_DEFPATH_ROOT):
-
-
-/sbin:/bin:/usr/sbin:/usr/bin
-
-
-
-
-Common user's path does not contain any sbin directories. However, it
-contains the current directory, '.', which is considered dangerous for
-the root user. Not even /usr/local/bin is available for the root user.
-
-
-Login path is often overwritten by shell initialization. However, it
-is possible to use other programs in /etc/passwd as user shells. For
-example, I have used the following line to start PPP when I log in
-using special user name. In this case, the pppd has exactly login
-path.
-
-
-
-
-
-etu-ppp:viYabVlxPwzDl:1000:1000:Esa Turtiainen, PPP:/:/usr/sbin/pppd
-
-
-
-
-
-
-
-
-----
-
-!!6. Shells
-
-
-
-
-
-Often user processes are children processes of the shell mentioned in
-/etc/passwd for this user. Initialization files of shells often modify
-path.
-
-
-In login, the name of the shell is preceded with '-', for example bash
-is called as '-bash'. This signals to the shell that it is a 'login'
-shell. In this case, the shell executes the 'login' initialization
-files. Otherwise some lighter initialization is performed.
-Additionally, the shell checks if it is interactive - are the commands
-coming from file or interactive tty. This modifies the shell
-initialization so that a non-interactive non-login shell is
-initialized very lightly - bash do not execute any initialization file
-in this case!
-
-
-
-
-
-
-
-!!6.1 bash
-
-
-
-
-
-
-As a normal login shell, bash 'sources' system-wide file /etc/profile,
-where the system environment and path can be set for bash
-users. However, it is not run when the system interprets the shell as
-non-interactive. The most important case is in rsh, where remote
-command is executed in the neighboring machine. The /etc/profile is
-not run and the path is inherited from rsh daemon.
-
-
-bash receives command line arguments -login and -i that can be used to
-set the shell as a login shell or interactive shell respectively.
-
-
-The user can overwrite values set in /etc/profile by creating a file
-~/.bash_profile, ~/.bash_login or ~/.profile. Note
-that just the first one of these is executed thus differing of the
-logic of csh initialization. ~/.bash_login is not executed
-specially for login shells and if .bash_profile exists, it is not
-executed at all!
-
-
-If bash is used with name sh instead of the name bash, it emulates
-original Bourne shell initialization: it sources just files
-/etc/profile and ~/.profile and just for login shells.
-
-
-
-
-
-
-
-!!6.2 tcsh
-
-
-
-
-
-
-As a login shell tcsh executes the following files in this order:
-
-
-
-
-
-*/etc/csh.cshrc
-*
-
-*/etc/csh.login
-*
-
-*~/.tcshrc
-*
-
-*~/.cshrc (if .tcshrc is not found)
-*
-
-*~/.history
-*
-
-*~/.login
-*
-
-*~/.cshdirs
-*
-
-
-
-tcsh can be compiled to execute login scripts before cshrc scripts. Beware!
-
-
-Non-interactive shells execute just the *cshrc scripts. *login scripts
-can be used to set the path just once in the login.
-
-
-
-
-
-
-----
-
-!!7. Changing user ID
-
-
-
-
-
-
-
-
-
-
-!!7.1 su
-
-
-
-
-
-
-Command su sets a new user id to use. If no user id is given, root is
-used.
-
-
-Normally su invokes a subshell with a different user id. With
-argument '-' (more recent synonyms -l or --login) su invokes shell
-like login shell. However, it does not use login program to do this
-but uses a yet another built-in path for login 'simulation' (term used
-in the source code). It is:
-
-
-for normal users
-
-
-/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:.
-
-
-for root user
-
-
-/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin/X11:/usr/local/sbin:/usr/local/bin
-
-
-
-
-su makes many quite subtle environment changes as well.
-
-
-
-
-
-
-
-!!7.2 sudo
-
-
-
-
-
-
-There is a group of commands that make use of super user commands
-safer. They allow better logging, user-based restrictions and usage
-of individual passwords. Most widely used is sudo.
-
-
-
-
-
-$ sudo env
-
-
-
-
-executes command env as super user (if it is configured to allow it).
-
-
-sudo command has again a different approach to path handling. It
-modifies the search path so that the current directory is always the
-last one. However, it does not modify PATH environment variable.
-'sudo env' and 'env' give the same value for PATH variable. Sudo adds
-just couple of environment variables like SUDO_USER.
-
-
-
-
-
-
-----
-
-!!8. Network servers
-
-
-
-
-
-
-
-
-Most network servers should not invoke subprocesses of any kind. For
-security reasons, their path should be minimal.
-
-
-An important exception is all the services that allow logging in to the
-system from network. This section describes what is the environment
-in these cases. If the command is executed in the remote machine with
-rsh it gets different path than if it is executed with ssh.
-Similarly, logging in with rlogin, Telnet or ssh is different.
-
-
-
-
-
-
-
-!!8.1 inetd
-
-
-
-
-
-
-Most network servers do not have process of their own waiting for
-requests all the time. This work is delegated to an Internet super
-server called inetd. Inetd listens for all the defined network ports
-and starts the appropriate server when there is an incoming request.
-This behaviour is defined in /etc/inetd.conf.
-
-
-inetd is started from system startup scripts. It inherits just path
-of init process. It does not modify it and all the servers started
-from inetd has init path. An example of such a server is imapd, the
-server of IMAP post office protocol.
-
-
-Other examples of inetd processes are telnetd, rlogind, talkd, ftp,
-popd, many http servers and so on.
-
-
-Often usage of inetd is still complicated by using a separate tcpd
-program to start the real server. It is a program that makes
-additional security checks before starting the real application. It
-does not affect the path (not verified).
-
-
-
-
-
-
-
-!!8.2 rsh
-
-
-
-
-
-
-rsh daemon sets the path from _PATH_DEFPATH (/usr/include/paths.h)
-that is the same path that login program uses for normal users. Root
-will get the same path than the normal user.
-
-
-Actually, rshd executes the command it gets with the command line:
-
-
-
-
-
-shell -c command-line
-
-
-
-
-and shell is not a login shell. It is desirable that all the shells
-mentioned in /etc/passwd support -c option to give on the command
-line.
-
-
-
-
-
-
-
-!!8.3 rlogin
-
-
-
-
-
-
-Rlogin is invokes login to make the real login procedure. If you login
-with rlogin, you get the same path than in login. Most other ways to
-log in to a Linux computer do not use login. Note the difference with
-rsh.
-
-
-The login command actually used is
-
-
-
-
-
-login -p -h host-name user-name
-
-
-
-
--p preserves the environment except the variables HOME, PATH, SHELL,
-TERM, MAIL and LOGNAME. -h tells the remote host name for logging.
-
-
-
-
-
-
-
-!!8.4 telnet
-
-
-
-
-
-
-Telnet is similar than rlogin. It uses the login program and the
-command line to invoke it in a similar way.
-
-
-
-
-
-
-
-!!8.5 ssh
-
-
-
-
-
-
-ssh has a path setting of it's own. It has a fixed path where it adds
-the directory where ssh is. Often this means that /usr/bin is in the
-path twice:
-
-
-
-
-
-/usr/local/bin:/usr/bin:/bin:.:/usr/bin
-
-
-
-
-The path does not contain /usr/X11/bin and shell invoked by ssh
-command is not a login shell. Thus
-
-
-
-
-
-ssh remotehost xterm
-
-
-
-
-never works and anything in /etc/profile or /etc/csh.cshrc can change
-this. You must always use explicit path /usr/bin/X11/xterm.
-
-
-ssh searches environment variables of form VAR=VALUE from file
-/etc/environment. Unfortunately this causes some problems with
-XFree86.
-
-
-
-
-
-
-----
-
-!!9. XFree86
-
-
-
-
-
-
-
-!!9.1 XDM
-
-
-
-
-
-
-XDM is the most common way to log in to a graphical terminal. It a bit
-looks like login but it is internally totally different.
-
-
-In directory /etc/X11/xdm there are configuration files that are
-executed on different login phases. Xstartup (and Xstartup_0 specially
-for screen ) contains commands to be run after the user has logged in
-(commands are run as user root).
-
-
-The path that is set for users is in /etc/X11/xdm/xdm-config. There
-are lines:
-
-
-
-
-
-!DisplayManager*userPath: /usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games
-!DisplayManager*systemPath: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11
-
-
-
-
-That will be a default path for normal and root users respectively. It
-is very important that /usr/bin/X11 is available for X users. If X
-user logs in to another machine to start and X client application, he
-should get /usr/bin/X11 to his path even he don't seem to come
-directly from X terminal.
-
-
-After running Xstartup the XDM runs /etc/X11/Xsession that is run as
-the final user. Local configuration is meant to be done in
-/etc/environment that is sourced (included) from Xsession if available
-(Xsession is run with /bin/sh and thus /etc/environment must be a sh
-file). This clashes with ssh that supposes that /etc/environment is a
-file that contains just lines of form VAR=VALUE.
-
-
-
-
-
-
-
-!!9.2 xterm -ls
-
-
-
-
-
-
-By default the path for all the commands invoked from X window manager
-menus is the path inherited from XDM. To use something different it
-must be set explicitly. To start a terminal emulator with a path that
-is "normal" some special option must be used. In xterm the option -ls
-(login shell) must be used to get a login shell with path specified in
-shell login initialization files.
-
-
-
-
-
-
-
-!!9.3 Window manager menus and buttons
-
-
-
-
-
-
-Window manager inherits environment of XDM. All the programs started
-by the window manager inherit the environment of the window manager.
-
-
-User shell environment does not affect the programs that are started
-from window manager buttons and menus. For example, if program is
-started from 'xterm -ls', it has the default environment of login
-shell but if it is started from menu, it has just environment of the
-window manager.
-
-
-
-
-
-
-----
-
-!!10. Delayed commands cron and at
-
-
-
-
-
-
-
-!!10.1 cron
-
-
-
-
-
-
-Cron is a command that executes commands periodically as specified in
-/etc/crontab and user-defined crontabs. In Debian 1.3 there is a
-standard mechanism to execute commands in /etc/cron.daily,
-/etc/cron.weekly and /etc/cron.monthly.
-
-
-Cron is started from boot scripts but it seems to change it's PATH to
-a pretty strange one:
-
-
-
-
-
-/usr/bin:/binn:/sbin:/bin:/usr/sbin:/usr/bin
-
-
-
-
-THIS IS LIKELY A BUG IN CRON. This is the init path where there is
-/usr/bin:/bin written over the beginning without terminating ! This
-bug does not exist in all the systems.
-
-
-In crontab there can be PATH definition. In Debian 1.3 there is
-the following default line in the beginning of /etc/crontab:
-
-
-
-
-
-PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
-
-
-
-
-Because of this, the PATH of crond program is never used in user
-programs. All the scripts in /etc/cron.* directories get this path by
-default. This path is used even if a program is executed as non-root.
-
-
-
-
-
-
-
-!!10.2 at
-
-
-
-
-
-
-at is a command that can be used to run a one-time program at specific
-time.
-
-
-atd is run using init path. However, the user programs are always run
-in the user environment using sh command. Therefore the usual shell
-overwrites apply. Look the chapter on bash.
-
-
-
-
-
-
-----
-
-!!11. Some examples
-
-
-
-
-
-
-
-
-
-
-!!11.1 magicfilter
-
-
-
-
-
-
-magicfilter is a common tool to manipulate files for printer. It
-analyzes the type of the file to be printed and invokes a filter
-script to make appropriate pretty-printing. These scripts are invoked
-from lpd that is started from /etc/init.d/lpd that is started from
-init. Thus, the path is that of init. That does not contain
-/usr/bin/X11!
-
-
-You might want to insert printing of PDF files to magicfilter. It is
-possible to do this by using /usr/bin/X11/xpdf. Now you must remember
-to insert full directory path to the file name because magicfilter
-would not find it otherwise. Most programs used in magicfilter do not
-need full path, because they are on /bin or /usr/bin.
-
-
-
-
-
-
-
-!!11.2 Printing from X applications
-
-
-
-
-
-
-
-
-
-You may use PRINTER environment variable to show what is the printer
-that you are using. However, you may notice that in some cases in X
-applications it is sometimes lost.
-
-
-You must remember that if the X session is started from XDM, the
-window manager has never evaluated your shell login scripts. All the
-X applications that you have started from xterm have your PRINTER
-variable. However, if the same application is started from menu or
-window manager button, it does not contain your PRINTER variable.
-
-
-In some cases this can be inherited to an even lower layer: for
-example a Netscape helper application can have or have not your
-PRINTER definition.
-
-
-
-
-
-
-----
-
-!!12. Security concerns
-
-
-
-
-
-The path is sometimes a big security problem. It is a very common way
-to hack into a system using some mistakes in path settings. It is
-easy to make Trojan horse attacks if hacker gets root or other users
-to execute his versions of commands.
-
-
-A common mistake in the past (?) was to keep '.' in the root's path.
-Malicious hacker makes program 'ls' in his home directory. If root
-makes
-
-
-
-
-
-# cd ~hacker
-# ls
-
-
-
-
-he executes ls command of hacker's.
-
-
-Indirectly, this same applies to all the programs that are executed as
-root. Any of the important daemon processes should never execute
-anything that some other user can write into. In some systems,
-/usr/local/bin is allowed to contain programs with less strict
-security screening - it is just removed from the path of the root
-user. However, if it is known that some daemon executes 'foo' using
-path '/usr/local/bin/:...', it may be possible to cheat daemon to
-execute '/usr/local/bin/foo' instead of '/bin/foo'. Likely anybody
-who can write to '/usr/local/bin' is able to break into the system.
-
-
-It is very important to consider in what order the directories are in
-the path. If /usr/local/bin is before /bin, it is a security risk -
-if it is after, it is not possible to overwrite command /bin/foo with
-some localized modification in /usr/local/bin/foo.
-
-
-In Linux it should be remembered that the path evaluation is done in
-the operating system call level. Everywhere where an executable file
-path is given you can give a short name that is searched at least from
-/bin and /usr/bin - likely from many other places as well.
-
-
-
-
-
-
-----
-
-!!13. How to debug problems?
-
-
-
-
-
-The basic command to read environment is /usr/bin/env.
-
-
-It is possible to use /proc directory to find out path of any program.
-First you must know the process number - use ps command to get that.
-For example, if xterm is process number 1088, you can find it's
-environment with command
-
-
-
-
-
-# more /proc/1088/environ
-
-
-
-
-This does not work with daemon processes like xdm. To access
-environment of system processes or other user processes, root access
-is required.
-
-
-To debug Netscape, you can create a script /tmp/test:
-
-
-
-
-
-$ cat > /tmp/test
-#!/bin/sh
-/usr/bin/env > /tmp/env
-^d
-$ chmod +x /tmp/test
-
-
-
-
-Then set some helper application, for example !RealAudio,
-audio/x-pn-realaudio to call program "/tmp/test". When you try to
-browse some !RealAudio link (something from
-http://www.realaudio.com/showcase), Netscape calls the dummy program
-that stores environment to /tmp/env.
-
-
-
-
-
-
-----
-
-!!14. Some strategies to get the same path for all the users
-
-
-
-
-
-The most important settings is possible to set in the global shell
-initialization files for login shells: /etc/csh.login for tcsh and
-/etc/profile for bash.
-
-
-Exceptions that do not get the right path from these files are rsh
-commands, ssh commands, menu items from X window manager that do not
-explicitly start login shell, commands invoked from inittab, cron
-jobs, daemons jobs like magic filters started from lprd, WWW CGI
-scripts, and so on.
-
-
-If the path is set in /etc/csh.cshrc, the path is right even when rsh
-or ssh execute command in remote machine with account using
-tcsh/csh. However, it is not possible to set path if account uses
-bash/sh.
-
-
-It is possible to combine path setting to one file, for example to a
-file /etc/environment-common. There we write:
-
-
-
-
-
-${EXPORT}PATH${EQ}/bin:/usr/bin:/sbin:/usr/sbin:/usr/bin/X11:/usr/local/bin:/usr/games:.
-
-
-
-
-This can be used from /etc/csh.login (for tcsh and csh)
-
-
-
-
-
-set EQ=" " set EXPORT="setenv " source /etc/environment-common
-
-
-
-
-And from /etc/profile (for bash, doesn't work for ordinary sh)
-
-
-
-
-
-EQ='=' EXPORT="export " . /etc/environment-common
-
-
-
-
-And from /etc/environment (for XDM)
-
-
-
-
-
-EQ="=" EXPORT="export " . /etc/environment-common
-
-
-
-
-This strategy works mostly but ssh will complain of the lines in
-/etc/environment (and defined environment variables EQ and
-EXPORT). And still, rsh commands executed with bash won't get this
-path.
-
-
-
-
-
-
-----
-
-!!15. Acknowledgements
-
-
-
-
-
-One reason to start writing this document was the big frustration of
-Ari Mujunen. Juha Takala gave some valuable comments
.
-
-
-
-
-
-
-----
+Describe [HowToPath]
here.