diff --git a/man/po/de.po b/man/po/de.po index 85ecadfe..6ae36dcc 100644 --- a/man/po/de.po +++ b/man/po/de.po @@ -1005,10 +1005,10 @@ msgstr "" #: usermod.8.xml:327(para) chsh.1.xml:123(para) msgid "" -"The name of the user's new login shell. Setting this field to blank causes " +"The path of the user's new login shell. Setting this field to blank causes " "the system to select the default login shell." msgstr "" -"Der Name der neuen Anmelde-Shell des Benutzers. Falls dieses Feld leer " +"Der Pfad der neuen Anmelde-Shell des Benutzers. Falls dieses Feld leer " "gelassen wird, verwendet das System die Standard-Anmelde-Shell." #: usermod.8.xml:334(term) useradd.8.xml:471(term) diff --git a/man/usermod.8.xml b/man/usermod.8.xml index a1d0efd8..d2600e18 100644 --- a/man/usermod.8.xml +++ b/man/usermod.8.xml @@ -353,7 +353,7 @@ - The name of the user's new login shell. Setting this field to + The path of the user's new login shell. Setting this field to blank causes the system to select the default login shell. diff --git a/src/usermod.c b/src/usermod.c index ef430296..3ba011c2 100644 --- a/src/usermod.c +++ b/src/usermod.c @@ -1032,7 +1032,7 @@ static void grp_update (void) static void process_flags (int argc, char **argv) { const struct group *grp; - + struct stat st; bool anyflag = false; { @@ -1180,12 +1180,25 @@ static void process_flags (int argc, char **argv) case 'P': /* no-op, handled in process_prefix_flag () */ break; case 's': - if (!VALID (optarg)) { + if ( ( !VALID (optarg) ) + || ( ('\0' != optarg[0]) + && ('/' != optarg[0]) + && ('*' != optarg[0]) )) { fprintf (stderr, - _("%s: invalid field '%s'\n"), + _("%s: invalid shell '%s'\n"), Prog, optarg); exit (E_BAD_ARG); } + if ( '\0' != optarg[0] + && '*' != optarg[0] + && strcmp(optarg, "/sbin/nologin") != 0 + && ( stat(optarg, &st) != 0 + || S_ISDIR(st.st_mode) + || access(optarg, X_OK) != 0)) { + fprintf (stderr, + _("%s: Warning: missing or non-executable shell '%s'\n"), + Prog, optarg); + } user_newshell = optarg; sflg = true; break;