[devel] Re: Restricted shell for cvs over ssh

Dmitry V. Levin =?iso-8859-1?q?ldv_=CE=C1_altlinux=2Eorg?=
Вт Окт 29 17:50:12 MSK 2002


On Tue, Oct 29, 2002 at 05:32:36PM +0300, Vitaly Ostanin wrote:
> > > Если не секрет, что такое хитрое запущено на хосте devel, что
> > > не даёт нормального shell'а, но даёт возможность использовать
> > > cvs over ssh ?
> > 
> > Специальный wrapper:
> > $ wc master/alt_sh.c
> >     101     288    2112 master/alt_sh.c
> 
> А он как бы... ну... попробовать дают? :))
> 
> > > Собрался cvs у себя завести, хочется по уму :)
> > 
> > Только для cvs?
> > На devel.altlinux.ru есть ещё и rsync.
> 
> Да, это мне только для cvs.

Вот пример такого shell'а.
Естественно, что приведённый в нем путь к chroot'у надо заменить на
реальный.

Помещают такие программы обычно в /usr/local/sbin/,
с правами %attr(4710,root,группа_доступа).


--
ldv
----------- следующая часть -----------
#define _GNU_SOURCE

#include <stdio.h>
#include <errno.h>
#include <error.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>
#include <sys/types.h>
#include <pwd.h>

int
main (int ac, char *av[])
{
	const char *dir = "/path/to/chroot";
	const char *file = 0;
	struct passwd *pw;
	uid_t   uid = getuid ();

	if (!uid)
		error (EXIT_FAILURE, 0, "must be non-root");

	if (chdir (dir) < 0)
		error (EXIT_FAILURE, errno, "chdir");

	if (chroot (".") < 0)
		error (EXIT_FAILURE, errno, "chroot");

	if (setuid (uid) < 0)
		error (EXIT_FAILURE, errno, "setuid");

	pw = getpwuid (uid);
	if (!pw)
		error (EXIT_FAILURE, errno, "getpwuid");

	if (!pw->pw_dir)
		error (EXIT_FAILURE, 0, "invalid home directory");

	if (chdir (pw->pw_dir) < 0)
		error (EXIT_FAILURE, errno, "chdir");

	if (setenv ("HOME", pw->pw_dir, 1) < 0)
		error (EXIT_FAILURE, errno, "setenv: HOME");

	if (setenv ("USER", pw->pw_name, 1) < 0)
		error (EXIT_FAILURE, errno, "setenv: USER");

	if (setenv ("PATH", "/bin", 1) < 0)
		error (EXIT_FAILURE, errno, "setenv: PATH");

	if (3 == ac)
	{
		if (strcmp ("-c", av[1]))
			error (EXIT_FAILURE, EINVAL, "%s", av[1]);

		if (!strcmp ("cvs server", av[2]))
		{
			const char *args[] = { "cvs", "server", 0 };

			file = "/bin/cvs";
			execv (file, (char *const *) args);
			error (EXIT_FAILURE, errno, "execv: %s", file);
		}

		error (EXIT_FAILURE, EINVAL, "%s", av[2]);
	}

	error (EXIT_FAILURE, 0, "invalid arguments");
	return EXIT_FAILURE;
}
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20021029/f804e4cd/attachment-0001.bin>


Подробная информация о списке рассылки Devel