Запустите скрипт оболочки от имени другого пользователя
Какой хороший способ запуска сценария оболочки от имени другого пользователя. Я использую Debian etch, и я знаю, какого пользователя я хочу выдать.
Если бы я делал это вручную, я бы сделал:
su postgres
./backup_db.sh /tmp/test
exit
Поскольку я хочу автоматизировать процесс, мне нужен способ запуска backup_db.sh от имени postgres (наследование среды и т. Д.)
Спасибо!
8 ответов
Чтобы запустить ваш сценарий от имени другого пользователя одной командой, выполните:
/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.
Если для запуска целевого пользователя определена оболочка nologin, вы можете использовать опцию -s, чтобы указать оболочку:
/bin/su -s /bin/bash -c '/path/to/your/script' testuser
Смотрите следующий вопрос: запустите скрипт как пользователь, у которого есть nologin shell
Чтобы автоматизировать это по расписанию, вы можете поместить его в crontab пользователя. Задания Cron не получат полную среду, но в любом случае лучше будет поместить все необходимые переменные env в сам скрипт.
Чтобы изменить crontab пользователя:
sudo crontab -u postgres -e
Это должно быть информативное чтение - setuid для сценариев оболочки
Если вы запускаете su с " - username
"последовательность аргументов, он сделает оболочку входа в систему для пользователя, чтобы предоставить ту же среду, что и пользователь. Обычно используется для быстрого выполнения вашего сценария с вашей домашней средой из другого имени входа.
Хороший метод su -c ..., опубликованный другими. Для автоматизации вы можете добавить скрипт в crontab пользователя, для которого вы хотите его выполнить.
Попробуйте страницу руководства su:
su -c script_run_as_postgres.sh - postgres
К счастью, вы можете использовать sudo, чтобы позволить вам запускать только этот комманд как postgres без пароля. Это требует некоторой настройки в вашем /etc/sudoers.
Вы также можете использовать:
sudo -u postgres script_run_as_postgres.sh
Если у пользователя уже есть запись в 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"