diff --git a/usr.sbin/jexec/jexec.8 b/usr.sbin/jexec/jexec.8 --- a/usr.sbin/jexec/jexec.8 +++ b/usr.sbin/jexec/jexec.8 @@ -23,7 +23,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd March 5, 2025 +.Dd January 11, 2026 .Dt JEXEC 8 .Os .Sh NAME @@ -33,6 +33,7 @@ .Nm .Op Fl l .Op Fl d Ar working-directory +.Op Oo Fl e Ar name Ns = Ns Ar value Oc ... .Op Fl u Ar username | Fl U Ar username .Ar jail Op Ar command ... .Sh DESCRIPTION @@ -66,6 +67,16 @@ and absent the .Fl d option, commands are run from that (possibly jailed) user's directory. +.It Fl e Ar name Ns = Ns Ar value +Set environment variables. +.Pp +This parameter allows arbitrary environment variables that are available to the process +to be executed inside of the jail, overwriting any previously defined environment variables, +such as those specified by the +.Fl l +parameter. +.Pp +This option can be set multiple times. .It Fl u Ar username The user name from host environment as whom the .Ar command diff --git a/usr.sbin/jexec/jexec.c b/usr.sbin/jexec/jexec.c --- a/usr.sbin/jexec/jexec.c +++ b/usr.sbin/jexec/jexec.c @@ -59,21 +59,29 @@ int jid; login_cap_t *lcap = NULL; int ch, clean, dflag, uflag, Uflag; + int env_argc = argc; + char **env_argv = argv; char *cleanenv; const struct passwd *pwd = NULL; const char *username, *shell, *term; const char *workdir; + const char *jexec_args = "d:e:lnu:U:"; ch = clean = dflag = uflag = Uflag = 0; username = NULL; workdir = "/"; - while ((ch = getopt(argc, argv, "d:lnu:U:")) != -1) { + while ((ch = getopt(argc, argv, jexec_args)) != -1) { switch (ch) { case 'd': workdir = optarg; dflag = 1; break; + case 'e': + /* Used later. */ + if (strchr(optarg, '=') == NULL) + errx(1, "%s: Invalid environment variable.", optarg); + break; case 'l': clean = 1; break; @@ -140,6 +148,19 @@ endpwent(); } + optreset = 1; + optind = 1; + + /* Custom environment */ + while ((ch = getopt(env_argc, env_argv, jexec_args)) != -1) { + switch (ch) { + case 'e': + if (putenv(optarg) == -1) + err(1, "putenv"); + break; + } + } + /* Run the specified command, or the shell */ if (argc > 1) { if (execvp(argv[1], argv + 1) < 0) @@ -192,7 +213,7 @@ { fprintf(stderr, "%s\n", - "usage: jexec [-l] [-d working-directory] [-u username | -U username] jail\n" - " [command ...]"); + "usage: jexec [-l] [-d working-directory] [[-e name=value] ...]\n" + " [-u username | -U username] jail [command ...]"); exit(1); }