Return to BSD News archive
Newsgroups: comp.os.386bsd.questions Path: sserve!newshost.anu.edu.au!munnari.oz.au!news.Hawaii.Edu!ames!agate!headwall.Stanford.EDU!kithrup.com!sef From: sef@kithrup.com (Sean Eric Fagan) Subject: Re: "su" for one command Organization: Kithrup Enterprises, Ltd. References: <2dkb8a$hoq@sylvester.cc.utexas.edu> <JKH.93Dec3011102@whisker.lotus.ie> <CHH55F.8KI@twwells.com> Message-ID: <CHH9tF.FJt@kithrup.com> Date: Fri, 3 Dec 1993 21:17:25 GMT Lines: 85 In article <CHH55F.8KI@twwells.com> bill@twwells.com (T. William Wells) writes: >Speaking as an irked user who was bitten by the very same gotcha: >Improvements I can understand, but just dropping a feature? Why? >Please don't cite POSIX. That may be a reason but it is certainly >no excuse! Any reason to not retrofit the old behavior on the new >su? If it's not happening somewhere else, I'll probably do it >myself. I'm not sure why it was done, and I don't know where my .2 is, so I can't look at it. To execute a single command as another user via su, you can do: echo command args | su user Or you can apply these patches to su; they pass all arguments after the user to the shell, thus allowing "su user -c foo" to work. *** su.c.~1~ Tue Feb 25 09:55:04 1992 --- su.c Sat Mar 27 22:43:31 1993 *************** *** 64,69 **** --- 64,75 ---- #define ARGSTR "-flm" #endif + #ifdef CRYPT + extern char *crypt(); + #else + # define crypt(a,b) (a) + #endif + main(argc, argv) int argc; char **argv; *************** *** 76,87 **** uid_t ruid, getuid(); int asme, ch, asthem, fastlogin, prio; enum { UNSET, YES, NO } iscsh = UNSET; ! char *user, *shell, *username, *cleanenv[2], *nargv[4], **np; char shellbuf[MAXPATHLEN]; ! char *crypt(), *getpass(), *getenv(), *getlogin(), *ontty(); - np = &nargv[3]; - *np-- = NULL; asme = asthem = fastlogin = 0; while ((ch = getopt(argc, argv, ARGSTR)) != EOF) switch((char)ch) { --- 82,91 ---- uid_t ruid, getuid(); int asme, ch, asthem, fastlogin, prio; enum { UNSET, YES, NO } iscsh = UNSET; ! char *user, *shell, *username, *cleanenv[2], **np; char shellbuf[MAXPATHLEN]; ! char *getpass(), *getenv(), *getlogin(), *ontty(); asme = asthem = fastlogin = 0; while ((ch = getopt(argc, argv, ARGSTR)) != EOF) switch((char)ch) { *************** *** 138,143 **** --- 142,149 ---- /* get target login information, default to root */ user = *argv ? *argv : "root"; + np = *argv ? argv : argv-1; + if ((pwd = getpwnam(user)) == NULL) { fprintf(stderr, "su: unknown login %s\n", user); exit(1); *************** *** 163,173 **** /* if target requires a password, verify it */ if (*pwd->pw_passwd) { p = getpass("Password:"); - #ifdef DES if (strcmp(pwd->pw_passwd, crypt(p, pwd->pw_passwd))) { - #else - if (strcmp(pwd->pw_passwd, p)) { - #endif fprintf(stderr, "Sorry\n"); syslog(LOG_AUTH|LOG_WARNING, "BAD SU %s to %s%s", username, --- 169,175 ----