jbg: Which shell does doas -s
execute, the calling user's or the target user's? And what does it set the $SHELL
environment variable to?
GPT-4: The doas -s
command is used to execute a shell with elevated privileges. When you run this command, it will execute the target user's shell, typically the root user's shell. The target user's shell is determined by their entry in the /etc/passwd
file.
The $SHELL
environment variable will be set to the target user's default shell as specified in the /etc/passwd
file. For example, if the target user's default shell is /bin/bash
, the $SHELL
variable will be set to /bin/bash
during the doas -s
session. Keep in mind that the actual behavior may vary slightly depending on the implementation of doas and the operating system you are using.
jbg: Your first paragraph is incorrect, it actually executes the shell in the calling user's SHELL
environment variable or /etc/passwd
entry.
GPT-4: You are correct, I apologize for the confusion in my initial response. When you run doas -s
, it will indeed execute the calling user's shell, not the target user's shell. The calling user's shell is determined by their $SHELL
environment variable or their entry in the /etc/passwd
file.
The $SHELL
environment variable will remain set to the calling user's default shell during the doas -s
session.
jbg: Now, your second paragraph is incorrect. It actually sets $SHELL
according to the target user's /etc/passwd
entry.
GPT-4: I apologize for the confusion in my previous responses. You are correct, when you run doas -s
, it executes the calling user's shell. However, the $SHELL
environment variable will be set to the target user's default shell as specified in the /etc/passwd
file during the doas -s
session. To summarize, doas -s
performs the following:
- Executes the calling user's shell, determined by their
$SHELL
environment variable or their entry in the/etc/passwd
file. - Sets the
$SHELL
environment variable to the target user's default shell as specified in the/etc/passwd
file during thedoas -s
session.
I hope this clears up the confusion.
jbg: Thanks. Can you tell me why the $SHELL
environment variable is set to the target user's default shell, even though it executes the caller's shell?
GPT-4: Setting the $SHELL
environment variable to the target user's default shell during a doas -s
session is a design choice made to maintain consistency with the target user's environment. The rationale behind this choice is as follows:
- When you run a command with
doas
, you typically want to perform actions as the target user, often with elevated privileges. By setting the$SHELL
environment variable to the target user's default shell, any scripts or programs that rely on the$SHELL
variable will use the target user's preferred shell, ensuring that the environment is consistent with the target user's configuration. - It is possible that the target user's shell has specific configurations or behavior that are important for the execution of certain tasks. By setting the
$SHELL
variable to the target user's default shell, you ensure that these configurations or behaviors are taken into account when running commands, scripts, or programs that depend on the$SHELL
variable.
Despite this design choice, it's important to note that the actual shell being executed is still the calling user's shell, as specified by their $SHELL
environment variable or their entry in the /etc/passwd
file. This means that the calling user's shell configurations and settings will be applied during the doas -s
session. However, any command, script, or program that relies on the $SHELL environment variable during the session will use the target user's shell, as set in the $SHELL
variable.
jbg: Is there a standard that specifies this behaviour?
GPT-4: There isn't a specific standard that dictates this behavior for doas
like there is for sudo
with the POSIX standard. The doas
command is a relatively new utility compared to sudo
, and its implementation can vary depending on the platform or the specific version of the doas
tool being used.
The behavior I described earlier is based on the common implementation found in OpenBSD's doas
, which is one of the most widely used and well-known implementations of the command. Other implementations of doas
, like the portable version opendoas
, may have slight differences in behavior. However, since there isn't a specific standard that mandates this behavior, it is crucial to refer to the documentation for the specific implementation being used to understand its nuances and expected behavior.
jbg: Sorry, I mean is there a standard that specifies the behaviour that $SHELL
should be the default shell of the user, regardless of what shell is currently executing?
GPT-4: Apologies for the confusion. There isn't a formal standard that explicitly dictates that the $SHELL
environment variable should be set to the user's default shell, regardless of the shell that is currently executing. However, it is a widely accepted convention followed by many Unix-like operating systems and utilities.
In practice, the $SHELL
environment variable is often set to the user's default shell, as specified in the /etc/passwd
file, during login or when a new shell session is started. This convention is followed to ensure consistency in user environments, allowing scripts and programs that rely on the $SHELL
variable to operate correctly.
While there isn't a specific standard that mandates this behavior, it is a common practice that has become an informal convention in the Unix and Unix-like operating system ecosystem. Nonetheless, it's essential to be aware that actual behavior may vary across different systems and tools, so it's always recommended to consult the relevant documentation for the specific implementation being used.
jbg: It's actually standardised in POSIX, The Open Group Base Specifications section 8.3
GPT-4: You are correct, and I apologize for my earlier oversight. The behavior of the $SHELL
environment variable is indeed standardized in POSIX, The Open Group Base Specifications.
According to section 8.3 of the POSIX.1-2017 standard (Environment Variables):
SHELL: This variable shall represent a pathname of the user's preferred command language interpreter. If this interpreter does not conform to the Shell Command Language in the Shell and Utilities volume of POSIX.1-2017, utilities may behave differently from those described in POSIX.1-2017.
This standard ensures that the $SHELL
environment variable is set to the user's preferred shell, which is typically the default shell specified in the /etc/passwd
file. As a result, scripts and programs that rely on the $SHELL
variable can expect consistent behavior across compliant systems.
Thank you for pointing this out, and I apologize for the confusion in my previous responses.