Return to BSD News archive
Path: sserve!newshost.anu.edu.au!munnari.oz.au!yarrina.connect.com.au!harbinger.cc.monash.edu.au!msuinfo!agate!howland.reston.ans.net!EU.net!ieunet!news.ieunet.ie!jkh
From: jkh@whisker.lotus.ie (Jordan K. Hubbard)
Newsgroups: comp.os.386bsd.questions
Subject: Re: "su" for one command
Date: 03 Dec 1993 09:11:02 GMT
Organization: Dublin, Ireland
Lines: 70
Distribution: world
Message-ID: <JKH.93Dec3011102@whisker.lotus.ie>
References: <2dkb8a$hoq@sylvester.cc.utexas.edu>
NNTP-Posting-Host: whisker.lotus.ie
In-reply-to: vax@sylvester.cc.utexas.edu's message of 2 Dec 1993 03:07:22 -0600
In article <2dkb8a$hoq@sylvester.cc.utexas.edu> vax@sylvester.cc.utexas.edu (Vax) writes:
Under BSD Unixes, how does one go about executing a single command
as another user? I have been unsuccessful in applying the standard:
"su foo command". It simply ignores the command. Is there a proper way
to do this? Do you use a "here" document? Can you nest them?
Try something like this:
#include <stdio.h>
#include <pwd.h>
extern int errno;
/* #define MY_UID 700 */
main (argc, argv, envp)
int argc;
char *argv [];
char *envp [];
{
char *shell, *name, *getenv();
struct passwd *ent;
char ps1[128];
char **av = argv;
int ac = argc;
/* Enable for security - see MY_UID above
if (getuid()!=MY_UID) {
fprintf(stderr, "piss off!\n");
exit(0);
}
*/
if ((argc > 1) && (argv[1][0] == '-')) {
name = av[1] + 1;
sprintf(ps1, "PS1=(%s) ", name);
av++;
ac--;
}
else {
name = "root";
strcpy(ps1, "PS1=(#) ");
}
if ((ent = getpwnam(name)) == NULL) {
fprintf(stderr, "Can't find password entry for \"%s\"\n", name);
exit(0);
}
if (!(setgid(ent->pw_gid) || setuid(ent->pw_uid))) {
putenv(ps1);
if (ac == 1)
if(shell = getenv("SHELL"))
execl(shell, shell, (char *)0L);
else
execl("/bin/sh", "sh", (char *)(0L));
else {
execvp(av[1], av + 1);
}
fprintf(stderr, "Error in %s: ", argv[0]);
perror("");
}
else {
fprintf(stderr, "%s setuid failed - ", argv[0]);
perror("");
}
}
--
(Jordan K. Hubbard) jkh@violet.berkeley.edu, jkh@al.org, jkh@whisker.lotus.ie