Я работаю на машине, где у меня нет root, но есть список разрешенных sudo
команд. Одна из этих команд — /bin/su - foouser
. Так что я могу набрать sudo su - foouser
, и я получаю интерактивную оболочку как foouser. Затем я могу запустить что-то как foouser
.
Проблема в том, что foouser
это общий пользователь/оболочка, которая используется для запуска некоторых важных производственных процессов. Я не могу легко настроить его или настроить так, как хочу. И я не должен работать в нем постоянно, что разделяет мои терминалы и историю команд между теми, где я вошел как я, и теми, где я foouser
.
Что мне действительно хотелось бы сделать, так это иметь способ запустить одну команду как foouser
, заблокировать ее, вывести stdout и stderr в мою оболочку, как это обычно делает команда, а затем вернуться, когда я все еще вошел в систему как я (а не foouser
). Это можно, например, инкапсулировать в скрипт, чтобы он as_foo bar
запускал команду bar
как foouser
, вывел stdout и stderr, вернул код возврата bar
, а затем вернул меня обратно в мою оболочку.
Я могу попросить системных администраторов изменить разрешения. Например, они могли бы добавить bar
в список sudo, и тогда я мог бы использовать (я думаю) su -c
для запуска bar в том виде, как я описал. Но затем, если на следующий день я захочу запустить bar2
, мне придется снова с ними поговорить.
Есть ли выход из этой дилеммы? Это кажется довольно глупым, потому что я, очевидно, могу стать foouser
и запустить столько команд, сколько захочу, так что никакой разницы в плане безопасности я не вижу. Просто не могу найти очевидный удобный способ сделать это возможным.
решение1
sudo su - foouser <command>
Для запуска от имени root вам необходимо иметь хотя бы ограниченный доступ root su - foouser <command>
.
sudo -u foouser <command>
можно сделать то, что вы хотите, за один шаг. Но это требует, чтобы системный администратор предоставил вам sudo
доступ к foouser
учетной записи следующим образом:
ignacio ALL=(foouser) ALL
вместо этого:
ignacio ALL=(root) su - foouser
sudo
Такая настройка позволит вам определить, например, псевдоним, как вы задумали:
as_foo='sudo -u foouser'
И избегая su -
, вы можете иметь возможность продолжать использовать свои собственные настройки: использование sudo
таким образом изменяет только идентификатор пользователя, но сохраняет HOME
его предыдущее значение, считывая любые сценарии запуска оболочки и другие настройки изтвойдомашний каталог вместо foouser
's.
(Разумеется, эти скрипты должны быть доступны для чтения и этому другому пользователю, и любые общие скрипты, которые вы можете запустить, должны foouser
явно ссылаться на домашний каталог пользователя как , /home/foouser
а не просто $HOME
.)
Однако есть некоторые sudo
настройки, которые могут помешать этому решению работать: если always_set_home
опция sudo установлена в файле sudoers или если env_reset
опция установлена без добавления HOME
в env_keep
список, HOME
она будет сброшена в любом случае. В такой ситуации попробуйте добавить опцию -E
в sudo
команду, чтобы явно запросить сохранение вашей среды.
И когда вы действительно хотите запустить что-то foouser
с точно такой же настройкой среды, как при входе в систему foouser
(т. е. эквивалент sudo su - foouser
), добавьте -i
опцию, чтобы специально запросить это. Так же как sudo -i -u foouser
и 100% точная замена sudo su - foouser
.
Если вы найдете какую-то систему с такой древней версией, sudo
что в ней нет этой -i
опции, используйте -H
опцию с sudo: это не идеальная замена, но ее может быть достаточно. Такая старая версия, sudo
скорее всего, также будет иметь некоторые известные ошибки, связанные с безопасностью, поэтому ее стоит обновить в любом случае.
Вы можете использовать sudo -l
as yourself, чтобы точно узнать, как определен ваш доступ к sudo и какие параметры sudo (т. е. записи по умолчанию) действуют для вас.
решение2
Передайте дополнительные аргументы в su
.
sudo su - foouser sh -c 'echo $USER'