2.22.1-3: enable su(1) and runuser(1)
Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
parent
2adc0e74a6
commit
7443d56081
203
0200-su-add-group-and-supp-group-options.patch
Normal file
203
0200-su-add-group-and-supp-group-options.patch
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
From 6273784aa4f40121b3963b41df0986044eeaced0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Karel Zak <kzak@redhat.com>
|
||||||
|
Date: Tue, 28 Aug 2012 16:32:28 +0200
|
||||||
|
Subject: [PATCH 200/208] su: add --group and --supp-group options
|
||||||
|
|
||||||
|
These options allow to specify alternative groups. The command
|
||||||
|
su(1) has to be executed by root. The implementation is based on
|
||||||
|
Fedora runuser(1) command.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
# su --group=kzak --supp-group=uuidd -
|
||||||
|
# id
|
||||||
|
uid=0(root) gid=1000(kzak) groups=0(root),985(uuidd),1000(kzak)
|
||||||
|
|
||||||
|
non-root user:
|
||||||
|
|
||||||
|
$ su --group=kzak -
|
||||||
|
su: only root can specify alternative groups
|
||||||
|
|
||||||
|
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||||
|
---
|
||||||
|
login-utils/su.1 | 6 +++++
|
||||||
|
login-utils/su.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++----
|
||||||
|
2 files changed, 75 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/login-utils/su.1 b/login-utils/su.1
|
||||||
|
index 598cebd..59e1731 100644
|
||||||
|
--- a/login-utils/su.1
|
||||||
|
+++ b/login-utils/su.1
|
||||||
|
@@ -59,6 +59,12 @@ Pass
|
||||||
|
to the shell which may or may not be useful depending on the
|
||||||
|
shell.
|
||||||
|
.TP
|
||||||
|
+\fB\-g\fR, \fB\-\-group\fR=\fIgroup\fR\fR
|
||||||
|
+specify the primary group, this option is allowed for root user only
|
||||||
|
+.TP
|
||||||
|
+\fB\-G\fR, \fB\-\-supp-group\fR=\fIgroup\fR\fR
|
||||||
|
+specify a supplemental group, this option is allowed for root user only
|
||||||
|
+.TP
|
||||||
|
\fB\-\fR, \fB\-l\fR, \fB\-\-login\fR
|
||||||
|
Starts the shell as login shell with an environment similar to a real
|
||||||
|
login:
|
||||||
|
diff --git a/login-utils/su.c b/login-utils/su.c
|
||||||
|
index c6b8bce..f11c757 100644
|
||||||
|
--- a/login-utils/su.c
|
||||||
|
+++ b/login-utils/su.c
|
||||||
|
@@ -110,6 +110,8 @@ static struct option const longopts[] =
|
||||||
|
{"login", no_argument, NULL, 'l'},
|
||||||
|
{"preserve-environment", no_argument, NULL, 'p'},
|
||||||
|
{"shell", required_argument, NULL, 's'},
|
||||||
|
+ {"group", required_argument, NULL, 'g'},
|
||||||
|
+ {"supp-group", required_argument, NULL, 'G'},
|
||||||
|
{"help", no_argument, 0, 'h'},
|
||||||
|
{"version", no_argument, 0, 'V'},
|
||||||
|
{NULL, 0, NULL, 0}
|
||||||
|
@@ -424,11 +426,18 @@ modify_environment (const struct passwd *pw, const char *shell)
|
||||||
|
/* Become the user and group(s) specified by PW. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
-init_groups (const struct passwd *pw)
|
||||||
|
+init_groups (const struct passwd *pw, gid_t *groups, int num_groups)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
+
|
||||||
|
errno = 0;
|
||||||
|
- if (initgroups (pw->pw_name, pw->pw_gid) == -1)
|
||||||
|
+
|
||||||
|
+ if (num_groups)
|
||||||
|
+ retval = setgroups (num_groups, groups);
|
||||||
|
+ else
|
||||||
|
+ retval = initgroups (pw->pw_name, pw->pw_gid);
|
||||||
|
+
|
||||||
|
+ if (retval == -1)
|
||||||
|
{
|
||||||
|
cleanup_pam (PAM_ABORT);
|
||||||
|
err (EXIT_FAILURE, _("cannot set groups"));
|
||||||
|
@@ -535,6 +544,8 @@ usage (int status)
|
||||||
|
-c, --command <command> pass a single command to the shell with -c\n\
|
||||||
|
--session-command <command> pass a single command to the shell with -c\n\
|
||||||
|
and do not create a new session\n\
|
||||||
|
+ -g --group=group specify the primary group\n\
|
||||||
|
+ -G --supp-group=group specify a supplemental group\n\
|
||||||
|
-f, --fast pass -f to the shell (for csh or tcsh)\n\
|
||||||
|
-m, --preserve-environment do not reset environment variables\n\
|
||||||
|
-p same as -m\n\
|
||||||
|
@@ -556,6 +567,19 @@ void load_config(void)
|
||||||
|
logindefs_load_file(_PATH_LOGINDEFS);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * Returns 1 if the current user is not root
|
||||||
|
+ */
|
||||||
|
+static int
|
||||||
|
+evaluate_uid(void)
|
||||||
|
+{
|
||||||
|
+ uid_t ruid = getuid();
|
||||||
|
+ uid_t euid = geteuid();
|
||||||
|
+
|
||||||
|
+ /* if we're really root and aren't running setuid */
|
||||||
|
+ return (uid_t) 0 == ruid && ruid == euid ? 0 : 1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int
|
||||||
|
main (int argc, char **argv)
|
||||||
|
{
|
||||||
|
@@ -566,6 +590,11 @@ main (int argc, char **argv)
|
||||||
|
char *shell = NULL;
|
||||||
|
struct passwd *pw;
|
||||||
|
struct passwd pw_copy;
|
||||||
|
+ struct group *gr;
|
||||||
|
+ gid_t groups[NGROUPS_MAX];
|
||||||
|
+ int num_supp_groups = 0;
|
||||||
|
+ int use_gid = 0;
|
||||||
|
+ int restricted;
|
||||||
|
|
||||||
|
setlocale (LC_ALL, "");
|
||||||
|
bindtextdomain (PACKAGE, LOCALEDIR);
|
||||||
|
@@ -575,7 +604,7 @@ main (int argc, char **argv)
|
||||||
|
simulate_login = false;
|
||||||
|
change_environment = true;
|
||||||
|
|
||||||
|
- while ((optc = getopt_long (argc, argv, "c:flmps:hV", longopts, NULL)) != -1)
|
||||||
|
+ while ((optc = getopt_long (argc, argv, "c:fg:G:lmps:hV", longopts, NULL)) != -1)
|
||||||
|
{
|
||||||
|
switch (optc)
|
||||||
|
{
|
||||||
|
@@ -592,6 +621,26 @@ main (int argc, char **argv)
|
||||||
|
fast_startup = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
+ case 'g':
|
||||||
|
+ gr = getgrnam(optarg);
|
||||||
|
+ if (!gr)
|
||||||
|
+ errx(EXIT_FAILURE, _("group %s does not exist"), optarg);
|
||||||
|
+ use_gid = 1;
|
||||||
|
+ groups[0] = gr->gr_gid;
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ case 'G':
|
||||||
|
+ num_supp_groups++;
|
||||||
|
+ if (num_supp_groups >= NGROUPS_MAX)
|
||||||
|
+ errx(EXIT_FAILURE,
|
||||||
|
+ _("can't specify more than %d supplemental groups"),
|
||||||
|
+ NGROUPS_MAX - 1);
|
||||||
|
+ gr = getgrnam(optarg);
|
||||||
|
+ if (!gr)
|
||||||
|
+ errx(EXIT_FAILURE, _("group %s does not exist"), optarg);
|
||||||
|
+ groups[num_supp_groups] = gr->gr_gid;
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
case 'l':
|
||||||
|
simulate_login = true;
|
||||||
|
break;
|
||||||
|
@@ -617,6 +666,8 @@ main (int argc, char **argv)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ restricted = evaluate_uid ();
|
||||||
|
+
|
||||||
|
if (optind < argc && !strcmp (argv[optind], "-"))
|
||||||
|
{
|
||||||
|
simulate_login = true;
|
||||||
|
@@ -625,6 +676,9 @@ main (int argc, char **argv)
|
||||||
|
if (optind < argc)
|
||||||
|
new_user = argv[optind++];
|
||||||
|
|
||||||
|
+ if ((num_supp_groups || use_gid) && restricted)
|
||||||
|
+ errx(EXIT_FAILURE, _("only root can specify alternative groups"));
|
||||||
|
+
|
||||||
|
logindefs_load_defaults = load_config;
|
||||||
|
|
||||||
|
pw = getpwnam (new_user);
|
||||||
|
@@ -648,6 +702,17 @@ main (int argc, char **argv)
|
||||||
|
: DEFAULT_SHELL);
|
||||||
|
endpwent ();
|
||||||
|
|
||||||
|
+ if (num_supp_groups && !use_gid)
|
||||||
|
+ {
|
||||||
|
+ pw->pw_gid = groups[1];
|
||||||
|
+ memmove (groups, groups + 1, sizeof(gid_t) * num_supp_groups);
|
||||||
|
+ }
|
||||||
|
+ else if (use_gid)
|
||||||
|
+ {
|
||||||
|
+ pw->pw_gid = groups[0];
|
||||||
|
+ num_supp_groups++;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
authenticate (pw);
|
||||||
|
|
||||||
|
if (request_same_session || !command || !pw->pw_uid)
|
||||||
|
@@ -666,7 +731,7 @@ main (int argc, char **argv)
|
||||||
|
}
|
||||||
|
shell = xstrdup (shell ? shell : pw->pw_shell);
|
||||||
|
|
||||||
|
- init_groups (pw);
|
||||||
|
+ init_groups (pw, groups, num_supp_groups);
|
||||||
|
|
||||||
|
create_watching_parent ();
|
||||||
|
/* Now we're in the child. */
|
||||||
|
--
|
||||||
|
1.7.11.7
|
||||||
|
|
1576
0201-su-move-generic-su-code-to-su-common.c.patch
Normal file
1576
0201-su-move-generic-su-code-to-su-common.c.patch
Normal file
File diff suppressed because it is too large
Load Diff
450
0202-runuser-new-command-derived-from-su-1.patch
Normal file
450
0202-runuser-new-command-derived-from-su-1.patch
Normal file
@ -0,0 +1,450 @@
|
|||||||
|
From d8c2f623ab9d9e7da1490244cb8c77c3017545dc Mon Sep 17 00:00:00 2001
|
||||||
|
From: Karel Zak <kzak@redhat.com>
|
||||||
|
Date: Wed, 29 Aug 2012 17:34:26 +0200
|
||||||
|
Subject: [PATCH 202/208] runuser: new command (derived from su(1))
|
||||||
|
|
||||||
|
This command is based on su(1), the differences:
|
||||||
|
|
||||||
|
- based on Fedora runuser su(1) patch
|
||||||
|
- not installed with suid rights
|
||||||
|
- allowed for root users only
|
||||||
|
- don't ask for password
|
||||||
|
- uses PAM session, for example:
|
||||||
|
|
||||||
|
$ cat /etc/pam.d/runuser
|
||||||
|
auth sufficient pam_rootok.so
|
||||||
|
session optional pam_keyinit.so revoke
|
||||||
|
session required pam_limits.so
|
||||||
|
session required pam_unix.so
|
||||||
|
|
||||||
|
$ cat /etc/pam.d/runuser-l
|
||||||
|
auth include runuser
|
||||||
|
session optional pam_keyinit.so force revoke
|
||||||
|
session include runuser
|
||||||
|
|
||||||
|
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||||
|
---
|
||||||
|
.gitignore | 1 +
|
||||||
|
configure.ac | 9 ++
|
||||||
|
login-utils/Makemodule.am | 13 +++
|
||||||
|
login-utils/runuser.1 | 230 ++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
login-utils/runuser.c | 7 ++
|
||||||
|
login-utils/su-common.c | 51 ++++++++--
|
||||||
|
6 files changed, 303 insertions(+), 8 deletions(-)
|
||||||
|
create mode 100644 login-utils/runuser.1
|
||||||
|
create mode 100644 login-utils/runuser.c
|
||||||
|
|
||||||
|
#diff --git a/.gitignore b/.gitignore
|
||||||
|
#index fbc5636..5be008f 100644
|
||||||
|
#--- a/.gitignore
|
||||||
|
#+++ b/.gitignore
|
||||||
|
#@@ -138,6 +138,7 @@ tests/run.sh.trs
|
||||||
|
# /resizepart
|
||||||
|
# /rev
|
||||||
|
# /rtcwake
|
||||||
|
#+/runuser
|
||||||
|
# /sample-mkfs
|
||||||
|
# /sample-partitions
|
||||||
|
# /sample-superblocks
|
||||||
|
diff --git a/configure.ac b/configure.ac
|
||||||
|
index 87e85fa..83ef6ce 100644
|
||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -1149,6 +1149,15 @@ UL_REQUIRES_HAVE([su], [security_pam_misc_h], [PAM header file])
|
||||||
|
AM_CONDITIONAL(BUILD_SU, test "x$build_su" = xyes)
|
||||||
|
|
||||||
|
|
||||||
|
+AC_ARG_ENABLE([runuser],
|
||||||
|
+ AS_HELP_STRING([--disable-runuser], [do not build runuser]),
|
||||||
|
+ [], enable_runuser=yes
|
||||||
|
+)
|
||||||
|
+UL_BUILD_INIT([runuser])
|
||||||
|
+UL_REQUIRES_HAVE([runuser], [security_pam_misc_h], [PAM header file])
|
||||||
|
+AM_CONDITIONAL(BUILD_RUNUSER, test "x$build_runuser" = xyes)
|
||||||
|
+
|
||||||
|
+
|
||||||
|
AC_ARG_ENABLE([schedutils],
|
||||||
|
AS_HELP_STRING([--disable-schedutils], [do not build chrt, ionice, teskset]),
|
||||||
|
[], enable_schedutils=yes
|
||||||
|
diff --git a/login-utils/Makemodule.am b/login-utils/Makemodule.am
|
||||||
|
index b918f00..e26d9a7 100644
|
||||||
|
--- a/login-utils/Makemodule.am
|
||||||
|
+++ b/login-utils/Makemodule.am
|
||||||
|
@@ -93,6 +93,19 @@ su_LDADD = $(LDADD) -lpam -lpam_misc
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
+if BUILD_RUNUSER
|
||||||
|
+bin_PROGRAMS += runuser
|
||||||
|
+dist_man_MANS += login-utils/runuser.1
|
||||||
|
+runuser_SOURCES = \
|
||||||
|
+ login-utils/runuser.c \
|
||||||
|
+ login-utils/su-common.c \
|
||||||
|
+ login-utils/su-common.h \
|
||||||
|
+ login-utils/logindefs.c \
|
||||||
|
+ login-utils/logindefs.h
|
||||||
|
+runuser_LDADD = $(LDADD) -lpam -lpam_misc
|
||||||
|
+endif
|
||||||
|
+
|
||||||
|
+
|
||||||
|
if BUILD_NEWGRP
|
||||||
|
usrbin_exec_PROGRAMS += newgrp
|
||||||
|
dist_man_MANS += login-utils/newgrp.1
|
||||||
|
diff --git a/login-utils/runuser.1 b/login-utils/runuser.1
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..66ad1c4
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/login-utils/runuser.1
|
||||||
|
@@ -0,0 +1,230 @@
|
||||||
|
+.TH RUNUSER "1" "August 2012" "util-linux" "User Commands"
|
||||||
|
+.SH NAME
|
||||||
|
+runuser \- run a command with substitute user and group ID
|
||||||
|
+.SH SYNOPSIS
|
||||||
|
+.B runuser
|
||||||
|
+[options...] [\-] [user [args...]]
|
||||||
|
+.SH DESCRIPTION
|
||||||
|
+.B runuser
|
||||||
|
+allows to run commands with substitute user and group ID.
|
||||||
|
+The difference between the commands
|
||||||
|
+.B runuser
|
||||||
|
+and
|
||||||
|
+.B su
|
||||||
|
+is that
|
||||||
|
+.B runuser
|
||||||
|
+does not ask for password, because it may be executed by root user only.
|
||||||
|
+The command
|
||||||
|
+.B runuser
|
||||||
|
+does not have to be installed with suid permissions.
|
||||||
|
+.PP
|
||||||
|
+When called without arguments
|
||||||
|
+.B runuser
|
||||||
|
+defaults to running an interactive shell as
|
||||||
|
+.IR root .
|
||||||
|
+.PP
|
||||||
|
+For backward compatibility
|
||||||
|
+.B runuser
|
||||||
|
+defaults to not change the current directory and to only set the
|
||||||
|
+environment variables
|
||||||
|
+.B HOME
|
||||||
|
+and
|
||||||
|
+.B SHELL
|
||||||
|
+(plus
|
||||||
|
+.B USER
|
||||||
|
+and
|
||||||
|
+.B LOGNAME
|
||||||
|
+if the target
|
||||||
|
+.I user
|
||||||
|
+is not root). It is recommended to always use the
|
||||||
|
+.B \-\-login
|
||||||
|
+option (instead it's shortcut
|
||||||
|
+.BR \- )
|
||||||
|
+to avoid side effects caused by mixing environments.
|
||||||
|
+.PP
|
||||||
|
+This version of
|
||||||
|
+.B runuser
|
||||||
|
+uses PAM for session management.
|
||||||
|
+.SH OPTIONS
|
||||||
|
+.TP
|
||||||
|
+\fB\-c\fR \fIcommand\fR, \fB\-\-command\fR=\fIcommand\fR
|
||||||
|
+Pass
|
||||||
|
+.I command
|
||||||
|
+to the shell with the
|
||||||
|
+.B \-c
|
||||||
|
+option.
|
||||||
|
+.TP
|
||||||
|
+\fB\-\-session\-command\fR=\fIcommand\fR
|
||||||
|
+Same as
|
||||||
|
+.B \-c
|
||||||
|
+but do not create a new session (discouraged).
|
||||||
|
+.TP
|
||||||
|
+\fB\-f\fR, \fB\-\-fast\fR
|
||||||
|
+Pass
|
||||||
|
+.B \-f
|
||||||
|
+to the shell which may or may not be useful depending on the
|
||||||
|
+shell.
|
||||||
|
+.TP
|
||||||
|
+\fB\-g\fR, \fB\-\-group\fR=\fIgroup\fR\fR
|
||||||
|
+specify the primary group, this option is allowed for root user only
|
||||||
|
+.TP
|
||||||
|
+\fB\-G\fR, \fB\-\-supp-group\fR=\fIgroup\fR\fR
|
||||||
|
+specify a supplemental group, this option is allowed for root user only
|
||||||
|
+.TP
|
||||||
|
+\fB\-\fR, \fB\-l\fR, \fB\-\-login\fR
|
||||||
|
+Starts the shell as login shell with an environment similar to a real
|
||||||
|
+login:
|
||||||
|
+.RS 10
|
||||||
|
+.TP
|
||||||
|
+o
|
||||||
|
+clears all environment variables except for
|
||||||
|
+.B TERM
|
||||||
|
+.TP
|
||||||
|
+o
|
||||||
|
+initializes the environment variables
|
||||||
|
+.BR HOME ,
|
||||||
|
+.BR SHELL ,
|
||||||
|
+.BR USER ,
|
||||||
|
+.BR LOGNAME ,
|
||||||
|
+.B PATH
|
||||||
|
+.TP
|
||||||
|
+o
|
||||||
|
+changes to the target user's home directory
|
||||||
|
+.TP
|
||||||
|
+o
|
||||||
|
+sets argv[0] of the shell to
|
||||||
|
+.RB ' \- '
|
||||||
|
+in order to make the shell a login shell
|
||||||
|
+.RE
|
||||||
|
+.TP
|
||||||
|
+\fB\-m\fR, \fB\-p\fR, \fB\-\-preserve-environment\fR
|
||||||
|
+Preserves the whole environment, ie does not set
|
||||||
|
+.BR HOME ,
|
||||||
|
+.BR SHELL ,
|
||||||
|
+.B USER
|
||||||
|
+nor
|
||||||
|
+.BR LOGNAME .
|
||||||
|
+.TP
|
||||||
|
+\fB\-s\fR \fISHELL\fR, \fB\-\-shell\fR=\fISHELL\fR
|
||||||
|
+Runs the specified shell instead of the default. The shell to run is
|
||||||
|
+selected according to the following rules in order:
|
||||||
|
+.RS 10
|
||||||
|
+.TP
|
||||||
|
+o
|
||||||
|
+the shell specified with
|
||||||
|
+.B \-\-shell
|
||||||
|
+.TP
|
||||||
|
+o
|
||||||
|
+The shell specified in the environment variable
|
||||||
|
+.B SHELL
|
||||||
|
+if the
|
||||||
|
+.B \-\-preserve-environment
|
||||||
|
+option is used.
|
||||||
|
+.TP
|
||||||
|
+o
|
||||||
|
+the shell listed in the passwd entry of the target user
|
||||||
|
+.TP
|
||||||
|
+o
|
||||||
|
+/bin/sh
|
||||||
|
+.RE
|
||||||
|
+.IP
|
||||||
|
+If the target user has a restricted shell (i.e. not listed in
|
||||||
|
+/etc/shells) the
|
||||||
|
+.B \-\-shell
|
||||||
|
+option and the
|
||||||
|
+.B SHELL
|
||||||
|
+environment variables are ignored unless the calling user is root.
|
||||||
|
+.TP
|
||||||
|
+\fB\-\-help\fR
|
||||||
|
+Display help text and exit.
|
||||||
|
+.TP
|
||||||
|
+\fB\-\-version\fR
|
||||||
|
+Display version information and exit.
|
||||||
|
+.SH CONFIG FILES
|
||||||
|
+.B runuser
|
||||||
|
+reads the
|
||||||
|
+.I /etc/default/runuser
|
||||||
|
+and
|
||||||
|
+.I /etc/login.defs
|
||||||
|
+configuration files. The following configuration items are relevant
|
||||||
|
+for
|
||||||
|
+.BR runuser :
|
||||||
|
+.PP
|
||||||
|
+.B ENV_PATH
|
||||||
|
+(string)
|
||||||
|
+.RS 4
|
||||||
|
+Defines the PATH environment variable for a regular user. The
|
||||||
|
+default value is
|
||||||
|
+.IR /usr/local/bin:\:/bin:\:/usr/bin .
|
||||||
|
+.RE
|
||||||
|
+.PP
|
||||||
|
+.B ENV_ROOTPATH
|
||||||
|
+(string)
|
||||||
|
+.br
|
||||||
|
+.B ENV_SUPATH
|
||||||
|
+(string)
|
||||||
|
+.RS 4
|
||||||
|
+Defines the PATH environment variable for root. The default value is
|
||||||
|
+.IR /usr/local/sbin:\:/usr/local/bin:\:/sbin:\:/bin:\:/usr/sbin:\:/usr/bin .
|
||||||
|
+.RE
|
||||||
|
+.PP
|
||||||
|
+.B ALWAYS_SET_PATH
|
||||||
|
+(boolean)
|
||||||
|
+.RS 4
|
||||||
|
+If set to
|
||||||
|
+.I yes
|
||||||
|
+and \-\-login and \-\-preserve\-environment were not specified
|
||||||
|
+.B runuser
|
||||||
|
+initializes
|
||||||
|
+.BR PATH .
|
||||||
|
+.RE
|
||||||
|
+.SH EXIT STATUS
|
||||||
|
+.B runuser
|
||||||
|
+normally returns the exit status of the command it executed. If the
|
||||||
|
+command was killed by a signal,
|
||||||
|
+.B runuser
|
||||||
|
+returns the number of the signal plus 128.
|
||||||
|
+.PP
|
||||||
|
+Exit status generated by
|
||||||
|
+.B runuser
|
||||||
|
+itself:
|
||||||
|
+.RS 10
|
||||||
|
+.TP
|
||||||
|
+1
|
||||||
|
+Generic error before executing the requested command
|
||||||
|
+.TP
|
||||||
|
+126
|
||||||
|
+The requested command could not be executed
|
||||||
|
+.TP
|
||||||
|
+127
|
||||||
|
+The requested command could was not found
|
||||||
|
+.RE
|
||||||
|
+.SH FILES
|
||||||
|
+.PD 0
|
||||||
|
+.TP 17
|
||||||
|
+/etc/pam.d/runuser
|
||||||
|
+default PAM configuration file
|
||||||
|
+.TP
|
||||||
|
+/etc/pam.d/runuser-l
|
||||||
|
+PAM configuration file if \-\-login is specified
|
||||||
|
+.TP
|
||||||
|
+/etc/default/runuser
|
||||||
|
+runuser specific logindef config file
|
||||||
|
+.TP
|
||||||
|
+/etc/login.defs
|
||||||
|
+global logindef config file
|
||||||
|
+.PD 1
|
||||||
|
+.SH "SEE ALSO"
|
||||||
|
+.BR pam (8),
|
||||||
|
+.BR shells (5),
|
||||||
|
+.BR login.defs (5),
|
||||||
|
+.BR su (1)
|
||||||
|
+.SH AUTHOR
|
||||||
|
+Derived from coreutils' su which was based on an implemenation from
|
||||||
|
+David MacKenzie and Fedora runuser command from Dan Walsh.
|
||||||
|
+.SH AVAILABILITY
|
||||||
|
+The runuser command is part of the util-linux package and is
|
||||||
|
+available from
|
||||||
|
+.UR ftp://\:ftp.kernel.org\:/pub\:/linux\:/utils\:/util-linux/
|
||||||
|
+Linux Kernel Archive
|
||||||
|
+.UE .
|
||||||
|
diff --git a/login-utils/runuser.c b/login-utils/runuser.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..d4f37f4
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/login-utils/runuser.c
|
||||||
|
@@ -0,0 +1,7 @@
|
||||||
|
+
|
||||||
|
+#include "su-common.h"
|
||||||
|
+
|
||||||
|
+int main(int argc, char **argv)
|
||||||
|
+{
|
||||||
|
+ return su_main(argc, argv, RUNUSER_MODE);
|
||||||
|
+}
|
||||||
|
diff --git a/login-utils/su-common.c b/login-utils/su-common.c
|
||||||
|
index f1f46aa..770f455 100644
|
||||||
|
--- a/login-utils/su-common.c
|
||||||
|
+++ b/login-utils/su-common.c
|
||||||
|
@@ -65,8 +65,14 @@ enum
|
||||||
|
#include "env.h"
|
||||||
|
|
||||||
|
/* name of the pam configuration files. separate configs for su and su - */
|
||||||
|
-#define PAM_SERVICE_NAME "su"
|
||||||
|
-#define PAM_SERVICE_NAME_L "su-l"
|
||||||
|
+#define PAM_SRVNAME_SU "su"
|
||||||
|
+#define PAM_SRVNAME_SU_L "su-l"
|
||||||
|
+
|
||||||
|
+#define PAM_SRVNAME_RUNUSER "runuser"
|
||||||
|
+#define PAM_SRVNAME_RUNUSER_L "runuser-l"
|
||||||
|
+
|
||||||
|
+#define _PATH_LOGINDEFS_SU "/etc/defaults/su"
|
||||||
|
+#define _PATH_LOGINDEFS_RUNUSER "/etc/defaults/runuser"
|
||||||
|
|
||||||
|
#define is_pam_failure(_rc) ((_rc) != PAM_SUCCESS)
|
||||||
|
|
||||||
|
@@ -106,6 +112,8 @@ static bool _pam_cred_established;
|
||||||
|
static sig_atomic_t volatile caught_signal = false;
|
||||||
|
static pam_handle_t *pamh = NULL;
|
||||||
|
|
||||||
|
+static int restricted = 1; /* zero for root user */
|
||||||
|
+
|
||||||
|
static struct option const longopts[] =
|
||||||
|
{
|
||||||
|
{"command", required_argument, NULL, 'c'},
|
||||||
|
@@ -146,7 +154,8 @@ log_su (struct passwd const *pw, bool successful)
|
||||||
|
|
||||||
|
openlog (program_invocation_short_name, 0 , LOG_AUTH);
|
||||||
|
syslog (LOG_NOTICE, "%s(to %s) %s on %s",
|
||||||
|
- successful ? "" : "FAILED SU ",
|
||||||
|
+ successful ? "" :
|
||||||
|
+ su_mode == RUNUSER_MODE ? "FAILED RUNUSER " : "FAILED SU ",
|
||||||
|
new_user, old_user, tty);
|
||||||
|
closelog ();
|
||||||
|
}
|
||||||
|
@@ -315,11 +324,19 @@ static void
|
||||||
|
authenticate (const struct passwd *pw)
|
||||||
|
{
|
||||||
|
const struct passwd *lpw;
|
||||||
|
- const char *cp;
|
||||||
|
+ const char *cp, *srvname = NULL;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
- retval = pam_start (simulate_login ? PAM_SERVICE_NAME_L : PAM_SERVICE_NAME,
|
||||||
|
- pw->pw_name, &conv, &pamh);
|
||||||
|
+ switch (su_mode) {
|
||||||
|
+ case SU_MODE:
|
||||||
|
+ srvname = simulate_login ? PAM_SRVNAME_SU_L : PAM_SRVNAME_SU;
|
||||||
|
+ break;
|
||||||
|
+ case RUNUSER_MODE:
|
||||||
|
+ srvname = simulate_login ? PAM_SRVNAME_RUNUSER_L : PAM_SRVNAME_RUNUSER;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ retval = pam_start (srvname, pw->pw_name, &conv, &pamh);
|
||||||
|
if (is_pam_failure(retval))
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
@@ -344,6 +361,17 @@ authenticate (const struct passwd *pw)
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (su_mode == RUNUSER_MODE)
|
||||||
|
+ {
|
||||||
|
+ /*
|
||||||
|
+ * This is the only difference between runuser(1) and su(1). The command
|
||||||
|
+ * runuser(1) does not required authentication, because user is root.
|
||||||
|
+ */
|
||||||
|
+ if (restricted)
|
||||||
|
+ errx(EXIT_FAILURE, _("may not be used by non-root users"));
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
retval = pam_authenticate (pamh, 0);
|
||||||
|
if (is_pam_failure(retval))
|
||||||
|
goto done;
|
||||||
|
@@ -567,7 +595,15 @@ usage (int status)
|
||||||
|
static
|
||||||
|
void load_config(void)
|
||||||
|
{
|
||||||
|
- logindefs_load_file("/etc/default/su");
|
||||||
|
+ switch (su_mode) {
|
||||||
|
+ case SU_MODE:
|
||||||
|
+ logindefs_load_file(_PATH_LOGINDEFS_SU);
|
||||||
|
+ break;
|
||||||
|
+ case RUNUSER_MODE:
|
||||||
|
+ logindefs_load_file(_PATH_LOGINDEFS_RUNUSER);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
logindefs_load_file(_PATH_LOGINDEFS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -598,7 +634,6 @@ su_main (int argc, char **argv, int mode)
|
||||||
|
gid_t groups[NGROUPS_MAX];
|
||||||
|
int num_supp_groups = 0;
|
||||||
|
int use_gid = 0;
|
||||||
|
- int restricted;
|
||||||
|
|
||||||
|
setlocale (LC_ALL, "");
|
||||||
|
bindtextdomain (PACKAGE, LOCALEDIR);
|
||||||
|
--
|
||||||
|
1.7.11.7
|
||||||
|
|
@ -0,0 +1,68 @@
|
|||||||
|
From 8f33f59e72bef913068f9a80338f12d8d4434010 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Karel Zak <kzak@redhat.com>
|
||||||
|
Date: Wed, 5 Sep 2012 11:13:34 +0200
|
||||||
|
Subject: [PATCH 203/208] su: more robust getpwuid() for GNU Hurt [coreutils
|
||||||
|
71b7ddc]
|
||||||
|
|
||||||
|
Let's support GNU Hurd over-engineering where a process can exist
|
||||||
|
without UID and getuid() returns -1 and sets errno.
|
||||||
|
|
||||||
|
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||||
|
---
|
||||||
|
login-utils/su-common.c | 26 +++++++++++++++++++++++---
|
||||||
|
1 file changed, 23 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/login-utils/su-common.c b/login-utils/su-common.c
|
||||||
|
index 770f455..a253dda 100644
|
||||||
|
--- a/login-utils/su-common.c
|
||||||
|
+++ b/login-utils/su-common.c
|
||||||
|
@@ -129,6 +129,26 @@ static struct option const longopts[] =
|
||||||
|
{NULL, 0, NULL, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
+
|
||||||
|
+static struct passwd *
|
||||||
|
+current_getpwuid(void)
|
||||||
|
+{
|
||||||
|
+ uid_t ruid;
|
||||||
|
+
|
||||||
|
+ /* GNU Hurd implementation has an extension where a process can exist in a
|
||||||
|
+ * non-conforming environment, and thus be outside the realms of POSIX
|
||||||
|
+ * process identifiers; on this platform, getuid() fails with a status of
|
||||||
|
+ * (uid_t)(-1) and sets errno if a program is run from a non-conforming
|
||||||
|
+ * environment.
|
||||||
|
+ *
|
||||||
|
+ * http://austingroupbugs.net/view.php?id=511
|
||||||
|
+ */
|
||||||
|
+ errno = 0;
|
||||||
|
+ ruid = getuid ();
|
||||||
|
+
|
||||||
|
+ return errno == 0 ? getpwuid (ruid) : NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* Log the fact that someone has run su to the user given by PW;
|
||||||
|
if SUCCESSFUL is true, they gave the correct password, etc. */
|
||||||
|
|
||||||
|
@@ -145,8 +165,8 @@ log_su (struct passwd const *pw, bool successful)
|
||||||
|
{
|
||||||
|
/* getlogin can fail -- usually due to lack of utmp entry.
|
||||||
|
Resort to getpwuid. */
|
||||||
|
- struct passwd *pwd = getpwuid (getuid ());
|
||||||
|
- old_user = (pwd ? pwd->pw_name : "");
|
||||||
|
+ struct passwd *pwd = current_getpwuid();
|
||||||
|
+ old_user = pwd ? pwd->pw_name : "";
|
||||||
|
}
|
||||||
|
tty = ttyname (STDERR_FILENO);
|
||||||
|
if (!tty)
|
||||||
|
@@ -353,7 +373,7 @@ authenticate (const struct passwd *pw)
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
- lpw = getpwuid (getuid ());
|
||||||
|
+ lpw = current_getpwuid ();
|
||||||
|
if (lpw && lpw->pw_name)
|
||||||
|
{
|
||||||
|
retval = pam_set_item (pamh, PAM_RUSER, (const void *) lpw->pw_name);
|
||||||
|
--
|
||||||
|
1.7.11.7
|
||||||
|
|
33
0204-su-verify-writing-to-streams-was-successful.patch
Normal file
33
0204-su-verify-writing-to-streams-was-successful.patch
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
From 589e24a625c5e83805e95b917eaf3bf1be64369e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Karel Zak <kzak@redhat.com>
|
||||||
|
Date: Wed, 5 Sep 2012 11:21:07 +0200
|
||||||
|
Subject: [PATCH 204/208] su: verify writing to streams was successful
|
||||||
|
|
||||||
|
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||||
|
---
|
||||||
|
login-utils/su-common.c | 2 ++
|
||||||
|
1 file changed, 2 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/login-utils/su-common.c b/login-utils/su-common.c
|
||||||
|
index a253dda..1f97328 100644
|
||||||
|
--- a/login-utils/su-common.c
|
||||||
|
+++ b/login-utils/su-common.c
|
||||||
|
@@ -63,6 +63,7 @@ enum
|
||||||
|
#include "nls.h"
|
||||||
|
#include "pathnames.h"
|
||||||
|
#include "env.h"
|
||||||
|
+#include "closestream.h"
|
||||||
|
|
||||||
|
/* name of the pam configuration files. separate configs for su and su - */
|
||||||
|
#define PAM_SRVNAME_SU "su"
|
||||||
|
@@ -658,6 +659,7 @@ su_main (int argc, char **argv, int mode)
|
||||||
|
setlocale (LC_ALL, "");
|
||||||
|
bindtextdomain (PACKAGE, LOCALEDIR);
|
||||||
|
textdomain (PACKAGE);
|
||||||
|
+ atexit(close_stdout);
|
||||||
|
|
||||||
|
su_mode = mode;
|
||||||
|
fast_startup = false;
|
||||||
|
--
|
||||||
|
1.7.11.7
|
||||||
|
|
60
0205-su-move-long-options-to-main.patch
Normal file
60
0205-su-move-long-options-to-main.patch
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
From bea3752e9d048895b6750e2d0d8ce72fed20cef9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Karel Zak <kzak@redhat.com>
|
||||||
|
Date: Wed, 5 Sep 2012 11:26:20 +0200
|
||||||
|
Subject: [PATCH 205/208] su: move long options to main()
|
||||||
|
|
||||||
|
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||||
|
---
|
||||||
|
login-utils/su-common.c | 29 ++++++++++++++---------------
|
||||||
|
1 file changed, 14 insertions(+), 15 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/login-utils/su-common.c b/login-utils/su-common.c
|
||||||
|
index 1f97328..778738f 100644
|
||||||
|
--- a/login-utils/su-common.c
|
||||||
|
+++ b/login-utils/su-common.c
|
||||||
|
@@ -115,21 +115,6 @@ static pam_handle_t *pamh = NULL;
|
||||||
|
|
||||||
|
static int restricted = 1; /* zero for root user */
|
||||||
|
|
||||||
|
-static struct option const longopts[] =
|
||||||
|
-{
|
||||||
|
- {"command", required_argument, NULL, 'c'},
|
||||||
|
- {"session-command", required_argument, NULL, 'C'},
|
||||||
|
- {"fast", no_argument, NULL, 'f'},
|
||||||
|
- {"login", no_argument, NULL, 'l'},
|
||||||
|
- {"preserve-environment", no_argument, NULL, 'p'},
|
||||||
|
- {"shell", required_argument, NULL, 's'},
|
||||||
|
- {"group", required_argument, NULL, 'g'},
|
||||||
|
- {"supp-group", required_argument, NULL, 'G'},
|
||||||
|
- {"help", no_argument, 0, 'h'},
|
||||||
|
- {"version", no_argument, 0, 'V'},
|
||||||
|
- {NULL, 0, NULL, 0}
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
|
||||||
|
static struct passwd *
|
||||||
|
current_getpwuid(void)
|
||||||
|
@@ -656,6 +641,20 @@ su_main (int argc, char **argv, int mode)
|
||||||
|
int num_supp_groups = 0;
|
||||||
|
int use_gid = 0;
|
||||||
|
|
||||||
|
+ static const struct option longopts[] = {
|
||||||
|
+ {"command", required_argument, NULL, 'c'},
|
||||||
|
+ {"session-command", required_argument, NULL, 'C'},
|
||||||
|
+ {"fast", no_argument, NULL, 'f'},
|
||||||
|
+ {"login", no_argument, NULL, 'l'},
|
||||||
|
+ {"preserve-environment", no_argument, NULL, 'p'},
|
||||||
|
+ {"shell", required_argument, NULL, 's'},
|
||||||
|
+ {"group", required_argument, NULL, 'g'},
|
||||||
|
+ {"supp-group", required_argument, NULL, 'G'},
|
||||||
|
+ {"help", no_argument, 0, 'h'},
|
||||||
|
+ {"version", no_argument, 0, 'V'},
|
||||||
|
+ {NULL, 0, NULL, 0}
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
setlocale (LC_ALL, "");
|
||||||
|
bindtextdomain (PACKAGE, LOCALEDIR);
|
||||||
|
textdomain (PACKAGE);
|
||||||
|
--
|
||||||
|
1.7.11.7
|
||||||
|
|
@ -0,0 +1,40 @@
|
|||||||
|
From 1fe22a730b1a6595c6da9ea8cd58594337e66dc3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ondrej Oprala <ooprala@redhat.com>
|
||||||
|
Date: Tue, 11 Sep 2012 16:39:17 +0200
|
||||||
|
Subject: [PATCH 206/208] su: add segmentation fault reporting of the child
|
||||||
|
process
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
Child processes that ended with segmentation fault previously
|
||||||
|
indicated this with return status only. The report is now more
|
||||||
|
verbose if core dump is allowed.
|
||||||
|
|
||||||
|
Improved-by: Pádraig Brady <P@draigBrady.com>
|
||||||
|
Signed-off-by: Ondrej Oprala <ooprala@redhat.com>
|
||||||
|
---
|
||||||
|
login-utils/su-common.c | 7 ++++++-
|
||||||
|
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/login-utils/su-common.c b/login-utils/su-common.c
|
||||||
|
index 778738f..118e080 100644
|
||||||
|
--- a/login-utils/su-common.c
|
||||||
|
+++ b/login-utils/su-common.c
|
||||||
|
@@ -300,7 +300,12 @@ create_watching_parent (void)
|
||||||
|
}
|
||||||
|
if (pid != (pid_t)-1)
|
||||||
|
if (WIFSIGNALED (status))
|
||||||
|
- status = WTERMSIG (status) + 128;
|
||||||
|
+ {
|
||||||
|
+ status = WTERMSIG (status) + 128;
|
||||||
|
+ if (WCOREDUMP (status))
|
||||||
|
+ fprintf (stderr, _("%s (core dumped)\n"),
|
||||||
|
+ strsignal (WTERMSIG (status)));
|
||||||
|
+ }
|
||||||
|
else
|
||||||
|
status = WEXITSTATUS (status);
|
||||||
|
else
|
||||||
|
--
|
||||||
|
1.7.11.7
|
||||||
|
|
26
0207-su-fixed-a-typo-in-pam-error-message.patch
Normal file
26
0207-su-fixed-a-typo-in-pam-error-message.patch
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
From 2f3cb337e1cda9e897480f256453f369914380b3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vitezslav Cizek <vcizek@suse.cz>
|
||||||
|
Date: Mon, 1 Oct 2012 14:48:16 +0200
|
||||||
|
Subject: [PATCH 207/208] su: fixed a typo in pam error message
|
||||||
|
|
||||||
|
Signed-off-by: Vitezslav Cizek <vcizek@suse.cz>
|
||||||
|
---
|
||||||
|
login-utils/su-common.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/login-utils/su-common.c b/login-utils/su-common.c
|
||||||
|
index 118e080..ea6864e 100644
|
||||||
|
--- a/login-utils/su-common.c
|
||||||
|
+++ b/login-utils/su-common.c
|
||||||
|
@@ -223,7 +223,7 @@ create_watching_parent (void)
|
||||||
|
if (is_pam_failure(retval))
|
||||||
|
{
|
||||||
|
cleanup_pam (retval);
|
||||||
|
- errx (EXIT_FAILURE, _("cannot not open session: %s"),
|
||||||
|
+ errx (EXIT_FAILURE, _("cannot open session: %s"),
|
||||||
|
pam_strerror (pamh, retval));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
--
|
||||||
|
1.7.11.7
|
||||||
|
|
281
0208-runuser-add-u-to-not-execute-shell.patch
Normal file
281
0208-runuser-add-u-to-not-execute-shell.patch
Normal file
@ -0,0 +1,281 @@
|
|||||||
|
From f0c57c2b1129b17e68e54d08421d1f209f1b6c57 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Karel Zak <kzak@redhat.com>
|
||||||
|
Date: Thu, 13 Sep 2012 11:58:00 +0200
|
||||||
|
Subject: [PATCH 208/208] runuser: add -u to not execute shell
|
||||||
|
|
||||||
|
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||||
|
---
|
||||||
|
login-utils/runuser.1 | 20 ++++---
|
||||||
|
login-utils/su-common.c | 138 +++++++++++++++++++++++++++++++-----------------
|
||||||
|
login-utils/su.1 | 1 +
|
||||||
|
3 files changed, 105 insertions(+), 54 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/login-utils/runuser.1 b/login-utils/runuser.1
|
||||||
|
index 66ad1c4..4620165 100644
|
||||||
|
--- a/login-utils/runuser.1
|
||||||
|
+++ b/login-utils/runuser.1
|
||||||
|
@@ -3,10 +3,21 @@
|
||||||
|
runuser \- run a command with substitute user and group ID
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B runuser
|
||||||
|
-[options...] [\-] [user [args...]]
|
||||||
|
+[options] -u
|
||||||
|
+.IR user
|
||||||
|
+.IR "command " [ argument ...]
|
||||||
|
+.LP
|
||||||
|
+.B runuser
|
||||||
|
+[options] [-]
|
||||||
|
+[
|
||||||
|
+.IR "user " [ argument ...]
|
||||||
|
+]
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B runuser
|
||||||
|
allows to run commands with substitute user and group ID.
|
||||||
|
+If the option \fB\-u\fR not given, fallback to
|
||||||
|
+.B su
|
||||||
|
+compatible semantic and shell is executed.
|
||||||
|
The difference between the commands
|
||||||
|
.B runuser
|
||||||
|
and
|
||||||
|
@@ -36,12 +47,7 @@ and
|
||||||
|
.B LOGNAME
|
||||||
|
if the target
|
||||||
|
.I user
|
||||||
|
-is not root). It is recommended to always use the
|
||||||
|
-.B \-\-login
|
||||||
|
-option (instead it's shortcut
|
||||||
|
-.BR \- )
|
||||||
|
-to avoid side effects caused by mixing environments.
|
||||||
|
-.PP
|
||||||
|
+is not root).
|
||||||
|
This version of
|
||||||
|
.B runuser
|
||||||
|
uses PAM for session management.
|
||||||
|
diff --git a/login-utils/su-common.c b/login-utils/su-common.c
|
||||||
|
index ea6864e..4e1f6b2 100644
|
||||||
|
--- a/login-utils/su-common.c
|
||||||
|
+++ b/login-utils/su-common.c
|
||||||
|
@@ -439,7 +439,8 @@ modify_environment (const struct passwd *pw, const char *shell)
|
||||||
|
if (term)
|
||||||
|
xsetenv ("TERM", term, 1);
|
||||||
|
xsetenv ("HOME", pw->pw_dir, 1);
|
||||||
|
- xsetenv ("SHELL", shell, 1);
|
||||||
|
+ if (shell)
|
||||||
|
+ xsetenv ("SHELL", shell, 1);
|
||||||
|
xsetenv ("USER", pw->pw_name, 1);
|
||||||
|
xsetenv ("LOGNAME", pw->pw_name, 1);
|
||||||
|
set_path(pw);
|
||||||
|
@@ -451,7 +452,8 @@ modify_environment (const struct passwd *pw, const char *shell)
|
||||||
|
if (change_environment)
|
||||||
|
{
|
||||||
|
xsetenv ("HOME", pw->pw_dir, 1);
|
||||||
|
- xsetenv ("SHELL", shell, 1);
|
||||||
|
+ if (shell)
|
||||||
|
+ xsetenv ("SHELL", shell, 1);
|
||||||
|
if (getlogindefs_bool ("ALWAYS_SET_PATH", 0))
|
||||||
|
set_path(pw);
|
||||||
|
|
||||||
|
@@ -571,35 +573,47 @@ restricted_shell (const char *shell)
|
||||||
|
static void __attribute__((__noreturn__))
|
||||||
|
usage (int status)
|
||||||
|
{
|
||||||
|
- if (status != EXIT_SUCCESS)
|
||||||
|
- fprintf (stderr, _("Try `%s --help' for more information.\n"),
|
||||||
|
- program_invocation_short_name);
|
||||||
|
- else
|
||||||
|
- {
|
||||||
|
- fputs(USAGE_HEADER, stdout);
|
||||||
|
- printf (_(" %s [options] [-] [USER [arg]...]\n"), program_invocation_short_name);
|
||||||
|
- fputs (_("\n\
|
||||||
|
- Change the effective user id and group id to that of USER.\n\
|
||||||
|
- A mere - implies -l. If USER not given, assume root.\n"), stdout);
|
||||||
|
- fputs(USAGE_OPTIONS, stdout);
|
||||||
|
- fputs (_("\
|
||||||
|
- -, -l, --login make the shell a login shell\n\
|
||||||
|
- -c, --command <command> pass a single command to the shell with -c\n\
|
||||||
|
- --session-command <command> pass a single command to the shell with -c\n\
|
||||||
|
- and do not create a new session\n\
|
||||||
|
- -g --group=group specify the primary group\n\
|
||||||
|
- -G --supp-group=group specify a supplemental group\n\
|
||||||
|
- -f, --fast pass -f to the shell (for csh or tcsh)\n\
|
||||||
|
- -m, --preserve-environment do not reset environment variables\n\
|
||||||
|
- -p same as -m\n\
|
||||||
|
- -s, --shell <shell> run shell if /etc/shells allows it\n\
|
||||||
|
-"), stdout);
|
||||||
|
-
|
||||||
|
- fputs(USAGE_SEPARATOR, stdout);
|
||||||
|
- fputs(USAGE_HELP, stdout);
|
||||||
|
- fputs(USAGE_VERSION, stdout);
|
||||||
|
- printf(USAGE_MAN_TAIL("su(1)"));
|
||||||
|
- }
|
||||||
|
+ if (su_mode == RUNUSER_MODE) {
|
||||||
|
+ fputs(USAGE_HEADER, stdout);
|
||||||
|
+ printf (_(" %s [options] -u <USER> COMMAND\n"), program_invocation_short_name);
|
||||||
|
+ printf (_(" %s [options] [-] [USER [arg]...]\n"), program_invocation_short_name);
|
||||||
|
+ fputs (_("\n"
|
||||||
|
+ "Run COMMAND with the effective <user> id and group id. If -u not\n"
|
||||||
|
+ "given, fallback to su(1) compatible semantic and shell is executed.\n"
|
||||||
|
+ "The options -l, -c, -f, -s are mutually exclusive to -u.\n"), stdout);
|
||||||
|
+
|
||||||
|
+ fputs(USAGE_OPTIONS, stdout);
|
||||||
|
+
|
||||||
|
+ fputs (_(
|
||||||
|
+ " -u, --user <user> username\n"), stdout);
|
||||||
|
+
|
||||||
|
+ } else {
|
||||||
|
+ fputs(USAGE_HEADER, stdout);
|
||||||
|
+ printf (_(" %s [options] [-] [USER [arg]...]\n"), program_invocation_short_name);
|
||||||
|
+ fputs (_("\n"
|
||||||
|
+ "Change the effective user id and group id to that of USER.\n"
|
||||||
|
+ "A mere - implies -l. If USER not given, assume root.\n"), stdout);
|
||||||
|
+
|
||||||
|
+ fputs(USAGE_OPTIONS, stdout);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ fputs (_(
|
||||||
|
+ " -m, -p, --preserve-environment do not reset environment variables\n"
|
||||||
|
+ " -g, --group <group> specify the primary group\n"
|
||||||
|
+ " -G, --supp-group <group> specify a supplemental group\n\n"), stdout);
|
||||||
|
+
|
||||||
|
+ fputs (_(
|
||||||
|
+ " -, -l, --login make the shell a login shell\n"
|
||||||
|
+ " -c, --command <command> pass a single command to the shell with -c\n"
|
||||||
|
+ " --session-command <command> pass a single command to the shell with -c\n"
|
||||||
|
+ " and do not create a new session\n"
|
||||||
|
+ " -f, --fast pass -f to the shell (for csh or tcsh)\n"
|
||||||
|
+ " -s, --shell <shell> run shell if /etc/shells allows it\n"), stdout);
|
||||||
|
+
|
||||||
|
+ fputs(USAGE_SEPARATOR, stdout);
|
||||||
|
+ fputs(USAGE_HELP, stdout);
|
||||||
|
+ fputs(USAGE_VERSION, stdout);
|
||||||
|
+ printf(USAGE_MAN_TAIL(su_mode == SU_MODE ? "su(1)" : "runuser(1)"));
|
||||||
|
exit (status);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -635,7 +649,7 @@ int
|
||||||
|
su_main (int argc, char **argv, int mode)
|
||||||
|
{
|
||||||
|
int optc;
|
||||||
|
- const char *new_user = DEFAULT_USER;
|
||||||
|
+ const char *new_user = DEFAULT_USER, *runuser_user = NULL;
|
||||||
|
char *command = NULL;
|
||||||
|
int request_same_session = 0;
|
||||||
|
char *shell = NULL;
|
||||||
|
@@ -655,6 +669,7 @@ su_main (int argc, char **argv, int mode)
|
||||||
|
{"shell", required_argument, NULL, 's'},
|
||||||
|
{"group", required_argument, NULL, 'g'},
|
||||||
|
{"supp-group", required_argument, NULL, 'G'},
|
||||||
|
+ {"user", required_argument, NULL, 'u'}, /* runuser only */
|
||||||
|
{"help", no_argument, 0, 'h'},
|
||||||
|
{"version", no_argument, 0, 'V'},
|
||||||
|
{NULL, 0, NULL, 0}
|
||||||
|
@@ -670,7 +685,7 @@ su_main (int argc, char **argv, int mode)
|
||||||
|
simulate_login = false;
|
||||||
|
change_environment = true;
|
||||||
|
|
||||||
|
- while ((optc = getopt_long (argc, argv, "c:fg:G:lmps:hV", longopts, NULL)) != -1)
|
||||||
|
+ while ((optc = getopt_long (argc, argv, "+c:fg:G:lmps:u:hV", longopts, NULL)) != -1)
|
||||||
|
{
|
||||||
|
switch (optc)
|
||||||
|
{
|
||||||
|
@@ -720,6 +735,12 @@ su_main (int argc, char **argv, int mode)
|
||||||
|
shell = optarg;
|
||||||
|
break;
|
||||||
|
|
||||||
|
+ case 'u':
|
||||||
|
+ if (su_mode != RUNUSER_MODE)
|
||||||
|
+ usage (EXIT_FAILURE);
|
||||||
|
+ runuser_user = optarg;
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
case 'h':
|
||||||
|
usage(0);
|
||||||
|
|
||||||
|
@@ -739,8 +760,21 @@ su_main (int argc, char **argv, int mode)
|
||||||
|
simulate_login = true;
|
||||||
|
++optind;
|
||||||
|
}
|
||||||
|
- if (optind < argc)
|
||||||
|
+
|
||||||
|
+ /* if not "-u <user>" specified then fallback to classic su(1) */
|
||||||
|
+ if (!runuser_user && optind < argc)
|
||||||
|
new_user = argv[optind++];
|
||||||
|
+ else {
|
||||||
|
+ /* runuser -u <command> */
|
||||||
|
+ new_user = runuser_user;
|
||||||
|
+ if (shell || fast_startup || command || simulate_login) {
|
||||||
|
+ errx(EXIT_FAILURE,
|
||||||
|
+ _("options --{shell,fast,command,session-command,login} and "
|
||||||
|
+ "--user are mutually exclusive."));
|
||||||
|
+ }
|
||||||
|
+ if (optind == argc)
|
||||||
|
+ errx(EXIT_FAILURE, _("COMMAND not specified."));
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if ((num_supp_groups || use_gid) && restricted)
|
||||||
|
errx(EXIT_FAILURE, _("only root can specify alternative groups"));
|
||||||
|
@@ -784,18 +818,23 @@ su_main (int argc, char **argv, int mode)
|
||||||
|
if (request_same_session || !command || !pw->pw_uid)
|
||||||
|
same_session = 1;
|
||||||
|
|
||||||
|
- if (!shell && !change_environment)
|
||||||
|
- shell = getenv ("SHELL");
|
||||||
|
- if (shell && getuid () != 0 && restricted_shell (pw->pw_shell))
|
||||||
|
- {
|
||||||
|
- /* The user being su'd to has a nonstandard shell, and so is
|
||||||
|
- probably a uucp account or has restricted access. Don't
|
||||||
|
- compromise the account by allowing access with a standard
|
||||||
|
- shell. */
|
||||||
|
- warnx (_("using restricted shell %s"), pw->pw_shell);
|
||||||
|
- shell = NULL;
|
||||||
|
- }
|
||||||
|
- shell = xstrdup (shell ? shell : pw->pw_shell);
|
||||||
|
+ /* initialize shell variable only if "-u <user>" not specified */
|
||||||
|
+ if (runuser_user) {
|
||||||
|
+ shell = NULL;
|
||||||
|
+ } else {
|
||||||
|
+ if (!shell && !change_environment)
|
||||||
|
+ shell = getenv ("SHELL");
|
||||||
|
+ if (shell && getuid () != 0 && restricted_shell (pw->pw_shell))
|
||||||
|
+ {
|
||||||
|
+ /* The user being su'd to has a nonstandard shell, and so is
|
||||||
|
+ probably a uucp account or has restricted access. Don't
|
||||||
|
+ compromise the account by allowing access with a standard
|
||||||
|
+ shell. */
|
||||||
|
+ warnx (_("using restricted shell %s"), pw->pw_shell);
|
||||||
|
+ shell = NULL;
|
||||||
|
+ }
|
||||||
|
+ shell = xstrdup (shell ? shell : pw->pw_shell);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
init_groups (pw, groups, num_supp_groups);
|
||||||
|
|
||||||
|
@@ -814,7 +853,12 @@ su_main (int argc, char **argv, int mode)
|
||||||
|
if (simulate_login && chdir (pw->pw_dir) != 0)
|
||||||
|
warn (_("warning: cannot change directory to %s"), pw->pw_dir);
|
||||||
|
|
||||||
|
- run_shell (shell, command, argv + optind, max (0, argc - optind));
|
||||||
|
+ if (shell)
|
||||||
|
+ run_shell (shell, command, argv + optind, max (0, argc - optind));
|
||||||
|
+ else {
|
||||||
|
+ execvp(argv[optind], &argv[optind]);
|
||||||
|
+ err(EXIT_FAILURE, _("executing %s failed"), argv[optind]);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
// vim: sw=2 cinoptions=>4,n-2,{2,^-2,\:2,=2,g0,h2,p5,t0,+2,(0,u0,w1,m1
|
||||||
|
diff --git a/login-utils/su.1 b/login-utils/su.1
|
||||||
|
index 59e1731..c82b941 100644
|
||||||
|
--- a/login-utils/su.1
|
||||||
|
+++ b/login-utils/su.1
|
||||||
|
@@ -216,6 +216,7 @@ command specific logindef config file
|
||||||
|
global logindef config file
|
||||||
|
.PD 1
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
+.BR runuser (8),
|
||||||
|
.BR pam (8),
|
||||||
|
.BR shells (5),
|
||||||
|
.BR login.defs (5)
|
||||||
|
--
|
||||||
|
1.7.11.7
|
||||||
|
|
26
0209-build-sys-move-runuser-to-sbin-dir.patch
Normal file
26
0209-build-sys-move-runuser-to-sbin-dir.patch
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
From 69658513d00635048f5de76ed73f4a43a61d374d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Karel Zak <kzak@redhat.com>
|
||||||
|
Date: Thu, 1 Nov 2012 13:12:02 +0100
|
||||||
|
Subject: [PATCH] build-sys: move runuser to sbin dir
|
||||||
|
|
||||||
|
Signed-off-by: Karel Zak <kzak@redhat.com>
|
||||||
|
---
|
||||||
|
login-utils/Makemodule.am | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/login-utils/Makemodule.am b/login-utils/Makemodule.am
|
||||||
|
index e26d9a7..0d8e8b1 100644
|
||||||
|
--- a/login-utils/Makemodule.am
|
||||||
|
+++ b/login-utils/Makemodule.am
|
||||||
|
@@ -94,7 +94,7 @@ endif
|
||||||
|
|
||||||
|
|
||||||
|
if BUILD_RUNUSER
|
||||||
|
-bin_PROGRAMS += runuser
|
||||||
|
+sbin_PROGRAMS += runuser
|
||||||
|
dist_man_MANS += login-utils/runuser.1
|
||||||
|
runuser_SOURCES = \
|
||||||
|
login-utils/runuser.c \
|
||||||
|
--
|
||||||
|
1.7.11.7
|
||||||
|
|
4
util-linux-runuser-l.pamd
Normal file
4
util-linux-runuser-l.pamd
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#%PAM-1.0
|
||||||
|
auth include runuser
|
||||||
|
session optional pam_keyinit.so force revoke
|
||||||
|
session include runuser
|
5
util-linux-runuser.pamd
Normal file
5
util-linux-runuser.pamd
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
#%PAM-1.0
|
||||||
|
auth sufficient pam_rootok.so
|
||||||
|
session optional pam_keyinit.so revoke
|
||||||
|
session required pam_limits.so
|
||||||
|
session required pam_unix.so
|
6
util-linux-su-l.pamd
Normal file
6
util-linux-su-l.pamd
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#%PAM-1.0
|
||||||
|
auth include su
|
||||||
|
account include su
|
||||||
|
password include su
|
||||||
|
session optional pam_keyinit.so force revoke
|
||||||
|
session include su
|
14
util-linux-su.pamd
Normal file
14
util-linux-su.pamd
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#%PAM-1.0
|
||||||
|
auth sufficient pam_rootok.so
|
||||||
|
# Uncomment the following line to implicitly trust users in the "wheel" group.
|
||||||
|
#auth sufficient pam_wheel.so trust use_uid
|
||||||
|
# Uncomment the following line to require a user to be in the "wheel" group.
|
||||||
|
#auth required pam_wheel.so use_uid
|
||||||
|
auth include system-auth
|
||||||
|
auth include postlogin
|
||||||
|
account sufficient pam_succeed_if.so uid = 0 use_uid quiet
|
||||||
|
account include system-auth
|
||||||
|
password include system-auth
|
||||||
|
session include system-auth
|
||||||
|
session include postlogin
|
||||||
|
session optional pam_xauth.so
|
@ -2,7 +2,7 @@
|
|||||||
Summary: A collection of basic system utilities
|
Summary: A collection of basic system utilities
|
||||||
Name: util-linux
|
Name: util-linux
|
||||||
Version: 2.22.1
|
Version: 2.22.1
|
||||||
Release: 2%{?dist}
|
Release: 3%{?dist}
|
||||||
License: GPLv2 and GPLv2+ and GPLv3+ and LGPLv2+ and BSD with advertising and Public Domain
|
License: GPLv2 and GPLv2+ and GPLv3+ and LGPLv2+ and BSD with advertising and Public Domain
|
||||||
Group: System Environment/Base
|
Group: System Environment/Base
|
||||||
URL: http://en.wikipedia.org/wiki/Util-linux
|
URL: http://en.wikipedia.org/wiki/Util-linux
|
||||||
@ -24,6 +24,11 @@ BuildRequires: popt-devel
|
|||||||
BuildRequires: libutempter-devel
|
BuildRequires: libutempter-devel
|
||||||
Buildrequires: systemd-devel
|
Buildrequires: systemd-devel
|
||||||
|
|
||||||
|
# because backported su(1) and runuser(1) patches
|
||||||
|
BuildRequires: automake
|
||||||
|
BuildRequires: autoconf
|
||||||
|
BuildRequires: libtool
|
||||||
|
|
||||||
### Sources
|
### Sources
|
||||||
Source0: ftp://ftp.kernel.org/pub/linux/utils/util-linux/v2.22/util-linux-%{upstream_version}.tar.xz
|
Source0: ftp://ftp.kernel.org/pub/linux/utils/util-linux/v2.22/util-linux-%{upstream_version}.tar.xz
|
||||||
Source1: util-linux-login.pamd
|
Source1: util-linux-login.pamd
|
||||||
@ -33,8 +38,14 @@ Source4: util-linux-60-raw.rules
|
|||||||
Source8: nologin.c
|
Source8: nologin.c
|
||||||
Source9: nologin.8
|
Source9: nologin.8
|
||||||
Source11: http://downloads.sourceforge.net/floppyutil/floppy-%{floppyver}.tar.bz2
|
Source11: http://downloads.sourceforge.net/floppyutil/floppy-%{floppyver}.tar.bz2
|
||||||
|
Source12: util-linux-su.pamd
|
||||||
|
Source13: util-linux-su-l.pamd
|
||||||
|
Source14: util-linux-runuser.pamd
|
||||||
|
Source15: util-linux-runuser-l.pamd
|
||||||
|
|
||||||
### Obsoletes & Conflicts & Provides
|
### Obsoletes & Conflicts & Provides
|
||||||
|
# su(1) and runuser(1) merged into util-linux v2.22
|
||||||
|
Conflicts: coreutils < 8.20
|
||||||
# eject has been merged into util-linux v2.22
|
# eject has been merged into util-linux v2.22
|
||||||
Obsoletes: eject <= 2.1.5
|
Obsoletes: eject <= 2.1.5
|
||||||
Provides: eject = 2.1.6
|
Provides: eject = 2.1.6
|
||||||
@ -99,6 +110,20 @@ Patch109: 0009-fsck.cramfs-compile-with-DINCLUDE_FS_TESTS-for-make-.patch
|
|||||||
Patch110: 0010-login-fix-compiler-warning-Wunused-result.patch
|
Patch110: 0010-login-fix-compiler-warning-Wunused-result.patch
|
||||||
Patch111: 0011-misc-make-readlink-usage-more-robust.patch
|
Patch111: 0011-misc-make-readlink-usage-more-robust.patch
|
||||||
|
|
||||||
|
### Upstream patches from master branch (will be v2.23) for su(1) and new
|
||||||
|
### runuser(1) implementation. This is required for the recent coreutils where
|
||||||
|
### is no more su(1).
|
||||||
|
###
|
||||||
|
Patch200: 0200-su-add-group-and-supp-group-options.patch
|
||||||
|
Patch201: 0201-su-move-generic-su-code-to-su-common.c.patch
|
||||||
|
Patch202: 0202-runuser-new-command-derived-from-su-1.patch
|
||||||
|
Patch203: 0203-su-more-robust-getpwuid-for-GNU-Hurt-coreutils-71b7d.patch
|
||||||
|
Patch204: 0204-su-verify-writing-to-streams-was-successful.patch
|
||||||
|
Patch205: 0205-su-move-long-options-to-main.patch
|
||||||
|
Patch206: 0206-su-add-segmentation-fault-reporting-of-the-child-pro.patch
|
||||||
|
Patch207: 0207-su-fixed-a-typo-in-pam-error-message.patch
|
||||||
|
Patch208: 0208-runuser-add-u-to-not-execute-shell.patch
|
||||||
|
Patch209: 0209-build-sys-move-runuser-to-sbin-dir.patch
|
||||||
|
|
||||||
%description
|
%description
|
||||||
The util-linux package contains a large variety of low-level system
|
The util-linux package contains a large variety of low-level system
|
||||||
@ -228,9 +253,22 @@ cp %{SOURCE8} %{SOURCE9} .
|
|||||||
%patch110 -p1
|
%patch110 -p1
|
||||||
%patch111 -p1
|
%patch111 -p1
|
||||||
|
|
||||||
|
%patch200 -p1
|
||||||
|
%patch201 -p1
|
||||||
|
%patch202 -p1
|
||||||
|
%patch203 -p1
|
||||||
|
%patch204 -p1
|
||||||
|
%patch205 -p1
|
||||||
|
%patch206 -p1
|
||||||
|
%patch207 -p1
|
||||||
|
%patch208 -p1
|
||||||
|
%patch209 -p1
|
||||||
|
|
||||||
%build
|
%build
|
||||||
unset LINGUAS || :
|
unset LINGUAS || :
|
||||||
|
|
||||||
|
./autogen.sh
|
||||||
|
|
||||||
export CFLAGS="-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 $RPM_OPT_FLAGS"
|
export CFLAGS="-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 $RPM_OPT_FLAGS"
|
||||||
export SUID_CFLAGS="-fpie"
|
export SUID_CFLAGS="-fpie"
|
||||||
export SUID_LDFLAGS="-pie -Wl,-z,relro -Wl,-z,now"
|
export SUID_LDFLAGS="-pie -Wl,-z,relro -Wl,-z,now"
|
||||||
@ -242,7 +280,6 @@ export SUID_LDFLAGS="-pie -Wl,-z,relro -Wl,-z,now"
|
|||||||
--enable-chfn-chsh \
|
--enable-chfn-chsh \
|
||||||
--enable-write \
|
--enable-write \
|
||||||
--enable-raw \
|
--enable-raw \
|
||||||
--disable-su \
|
|
||||||
--with-udev \
|
--with-udev \
|
||||||
--with-selinux \
|
--with-selinux \
|
||||||
--with-audit \
|
--with-audit \
|
||||||
@ -327,6 +364,10 @@ chmod 755 ${RPM_BUILD_ROOT}%{_bindir}/sunhostid
|
|||||||
install -m 644 %{SOURCE2} ./remote
|
install -m 644 %{SOURCE2} ./remote
|
||||||
install -m 644 %{SOURCE3} ./chsh
|
install -m 644 %{SOURCE3} ./chsh
|
||||||
install -m 644 %{SOURCE3} ./chfn
|
install -m 644 %{SOURCE3} ./chfn
|
||||||
|
install -m 644 %{SOURCE12} ./su
|
||||||
|
install -m 644 %{SOURCE13} ./su-l
|
||||||
|
install -m 644 %{SOURCE14} ./runuser
|
||||||
|
install -m 644 %{SOURCE15} ./runuser-l
|
||||||
popd
|
popd
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -485,10 +526,15 @@ fi
|
|||||||
%config(noreplace) %{_sysconfdir}/pam.d/chsh
|
%config(noreplace) %{_sysconfdir}/pam.d/chsh
|
||||||
%config(noreplace) %{_sysconfdir}/pam.d/login
|
%config(noreplace) %{_sysconfdir}/pam.d/login
|
||||||
%config(noreplace) %{_sysconfdir}/pam.d/remote
|
%config(noreplace) %{_sysconfdir}/pam.d/remote
|
||||||
|
%config(noreplace) %{_sysconfdir}/pam.d/su
|
||||||
|
%config(noreplace) %{_sysconfdir}/pam.d/su-l
|
||||||
|
%config(noreplace) %{_sysconfdir}/pam.d/runuser
|
||||||
|
%config(noreplace) %{_sysconfdir}/pam.d/runuser-l
|
||||||
%config(noreplace) %{_prefix}/lib/udev/rules.d
|
%config(noreplace) %{_prefix}/lib/udev/rules.d
|
||||||
|
|
||||||
%attr(4755,root,root) %{_bindir}/mount
|
%attr(4755,root,root) %{_bindir}/mount
|
||||||
%attr(4755,root,root) %{_bindir}/umount
|
%attr(4755,root,root) %{_bindir}/umount
|
||||||
|
%attr(4755,root,root) %{_bindir}/su
|
||||||
%attr(755,root,root) %{_bindir}/login
|
%attr(755,root,root) %{_bindir}/login
|
||||||
%attr(4711,root,root) %{_bindir}/chfn
|
%attr(4711,root,root) %{_bindir}/chfn
|
||||||
%attr(4711,root,root) %{_bindir}/chsh
|
%attr(4711,root,root) %{_bindir}/chsh
|
||||||
@ -574,10 +620,12 @@ fi
|
|||||||
%{_mandir}/man1/rename.1*
|
%{_mandir}/man1/rename.1*
|
||||||
%{_mandir}/man1/renice.1*
|
%{_mandir}/man1/renice.1*
|
||||||
%{_mandir}/man1/rev.1*
|
%{_mandir}/man1/rev.1*
|
||||||
|
%{_mandir}/man1/runuser.1*
|
||||||
%{_mandir}/man1/script.1*
|
%{_mandir}/man1/script.1*
|
||||||
%{_mandir}/man1/scriptreplay.1*
|
%{_mandir}/man1/scriptreplay.1*
|
||||||
%{_mandir}/man1/setsid.1*
|
%{_mandir}/man1/setsid.1*
|
||||||
%{_mandir}/man1/setterm.1*
|
%{_mandir}/man1/setterm.1*
|
||||||
|
%{_mandir}/man1/su.1*
|
||||||
%{_mandir}/man1/tailf.1*
|
%{_mandir}/man1/tailf.1*
|
||||||
%{_mandir}/man1/taskset.1*
|
%{_mandir}/man1/taskset.1*
|
||||||
%{_mandir}/man1/ul.1*
|
%{_mandir}/man1/ul.1*
|
||||||
@ -653,6 +701,7 @@ fi
|
|||||||
%{_sbindir}/readprofile
|
%{_sbindir}/readprofile
|
||||||
%{_sbindir}/resizepart
|
%{_sbindir}/resizepart
|
||||||
%{_sbindir}/rtcwake
|
%{_sbindir}/rtcwake
|
||||||
|
%{_sbindir}/runuser
|
||||||
%{_sbindir}/sulogin
|
%{_sbindir}/sulogin
|
||||||
%{_sbindir}/swaplabel
|
%{_sbindir}/swaplabel
|
||||||
%{_sbindir}/swapoff
|
%{_sbindir}/swapoff
|
||||||
@ -754,6 +803,10 @@ fi
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Nov 1 2012 Karel Zak <kzak@redhat.com> 2.22.1-3
|
||||||
|
- backport upstream runuser(1)
|
||||||
|
- enable su(1)
|
||||||
|
|
||||||
* Thu Nov 1 2012 Karel Zak <kzak@redhat.com> 2.22.1-2
|
* Thu Nov 1 2012 Karel Zak <kzak@redhat.com> 2.22.1-2
|
||||||
- apply pathes from upstream stable/v2.22 branch
|
- apply pathes from upstream stable/v2.22 branch
|
||||||
- fix #865961 - wipefs -a should use O_EXCL
|
- fix #865961 - wipefs -a should use O_EXCL
|
||||||
|
Loading…
Reference in New Issue
Block a user