The existing code scans through programs
to find an acceptable
shell to start; _program
is the shell that is configured for
the session (line 456). The first shell to be found from that
list, is assigned to exec
and we'll run that shell.
If the shell found wasn't the one configured (e.g. one of the
other ones from the list) then a warning is printed, but we carry on.
However, if the shell found is the last one in the list
(i.e. /bin/sh
) then a warning is printed and the shell does
not start.
If the configured shell is /bin/sh
this obviously breaks down:
it is found (as the first one in the list!) but still equals the
last one; the warning is printed and nothing runs.
It is unclear why /bin/sh
is not allowed as a shell:
it exists, it's an executable, and it's an interactive shell.
Curiously, configuring the shell as sh
for the session runs
/bin/sh
in the end, but just tricks the logic here:
-
checkProgram("sh")
returnssh
as string, - so the comparison against
/bin/sh
fails, - and we can run
sh
.. which is/bin/sh
.
There's no good reason to forbid /bin/sh
, so change the check to
only fail if no shell was found at all (exec
stayed empty)
or if the found shell behaves weirdly (is not equal to itself).