Запустите скрипт оболочки от имени другого пользователя

42

Какой хороший способ запуска сценария оболочки от имени другого пользователя. Я использую Debian etch, и я знаю, какого пользователя я хочу выдать.

Если бы я делал это вручную, я бы сделал:

su postgres
./backup_db.sh /tmp/test
exit

Поскольку я хочу автоматизировать процесс, мне нужен способ запуска backup_db.sh от имени postgres (наследование среды и т. Д.)

Благодарность!

Вадих М.
источник

Ответы:

67

Чтобы запустить ваш сценарий от имени другого пользователя одной командой, выполните:

/bin/su -c "/path/to/backup_db.sh /tmp/test" - postgres

Breaking it down:
 /bin/su : switch user
 -c "/path/to..." : command to run
 - : option to su, make it a login session (source profile for the user)
 postgres : user to become

Я рекомендую всегда использовать полные пути в таких сценариях - вы не всегда можете гарантировать, что будете в правильном каталоге, когда вы su (возможно, кто-то изменил homedir на вас, кто знает). Я также всегда использую полный путь к su (/ bin / su), потому что я параноик. Возможно, кто-то может отредактировать ваш путь и заставить вас использовать скомпрометированную версию su.

Баумгарт
источник
Это всегда потребует от меня ввода пароля? Как можно обойти это?
Zjffdu
2
Всегда требуется вводить пароль, если вы запускаете команду от имени пользователя, не являющегося пользователем root. Если вы хотите избежать пароля, вы можете настроить sudo, чтобы разрешить это. ОДНАКО - настройка sudo, позволяющая пользователю запускать su, позволяет ему стать любым пользователем. Я бы предложил создать сценарий для вашей команды, установить разрешения для сценария 700 и принадлежать пользователю root, а затем настроить sudo, чтобы позволить пользователю запускать этот единственный сценарий.
Баумгарт
Я полагаю - хотя этот ответ может работать на ФП - он не совсем корректен. Насколько мне известно, использование обоих -(или --login) вместе с --command, -cфактически не запускает сеанс входа в систему, потому что -cвсегда вызывает оболочку без входа в систему.
ЖанМерц
1
Примечание: для переносимости - postgressв конце команды должен отображаться символ. Со страницы When - is used, it must be specified before any username. For portability it is recommended to use it as last option, before any username. The other forms (-l and --login) do not have this restriction.
руководства
9

Чтобы автоматизировать это по расписанию, вы можете поместить его в crontab пользователя. Задания Cron не получат полную среду, но в любом случае лучше будет поместить все необходимые переменные env в сам скрипт.

Чтобы изменить crontab пользователя:

sudo crontab -u postgres -e
Кайл Брандт
источник
Не могли бы вы объяснить подробнее?
Сараванакумар
3

Это должно быть информативное чтение - setuid для сценариев оболочки

Если вы запустите su с - usernameпоследовательностью аргументов " ", он создаст оболочку входа в систему для пользователя, которая предоставит ту же среду, что и пользователь. Обычно используется для быстрого выполнения сценария в домашней среде с другого имени входа.

Nik
источник
Это может быть полезно, если вам нужно выполнить ряд действий. Но имейте в виду, что у большинства учетных записей системных служб не должно быть допустимых домашних путей и оболочек.
Дэн Карли
2

Попробуйте страницу man su:

su -c script_run_as_postgres.sh - postgres

К счастью, вы можете использовать sudo, чтобы позволить вам запускать только этот комманд как postgres без пароля. Это требует некоторой настройки в вашем / etc / sudoers.

pjz
источник
2

Хороший метод su -c ..., опубликованный другими. Для автоматизации вы можете добавить скрипт в crontab пользователя, для которого вы хотите его выполнить.

Джефф Фриц
источник
1

Если у пользователя уже есть запись в sudo, и вы не знаете пароль суперпользователя, то вы можете попробовать выполнить следующее: Этот перезапускает postgres, инициализированный в /data/my-db/pgsql/9.6/data

sudo su - postgres -c "/usr/pgsql-9.6/bin/pg_ctl -D /data/my-db/pgsql/9.6/data -l /var/log/pgsql.log restart"
smishra
источник
-1

Вы также можете использовать:

sudo -u postgres script_run_as_postgres.sh

Xandersoft
источник