Запустіть сценарій оболонки як інший користувач


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

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


Це завжди вимагатиме ввести пароль? Як можна обійти його?
zjffdu

2
Завжди вам потрібно буде ввести пароль, якщо ви виконуєте команду як некористувальний користувач. Якщо ви хочете уникнути пароля, ви можете налаштувати sudo, щоб це дозволило. ТАКЕ - налаштування sudo, щоб дозволити користувачеві запускати su, дозволяє їм стати будь-яким користувачем. Я б запропонував створити скрипт для вашої команди, встановити дозволи на скрипт на 700 та володіти root, а потім налаштувати sudo, щоб дозволити користувачу запускати цей єдиний сценарій.
baumgart

Я вважаю - хоча ця відповідь може працювати для ОП - це не зовсім коректно. Наскільки мені відомо, використання обох -(або --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.
jonny


9

Щоб автоматизувати це за графіком, ви можете помістити його в crontab користувача. Завдання Cron не отримають повного середовища, але, можливо, краще все-таки помістити всі необхідні змінні env у сам сценарій.

Щоб відредагувати crontab користувача:

sudo crontab -u postgres -e

Не могли б ви пояснити більше?
saravanakumar

3

Це має бути інформативне прочитання на скриптах оболонки

Якщо ви запустите su із - usernameпослідовністю аргументів, це "" зробить оболонку для входу, щоб користувач міг отримати те саме середовище, що і користувач. Зазвичай використовується для швидкого виконання сценарію в домашньому середовищі з іншого входу.


Це може бути корисно, якщо вам потрібно виконати ряд дій. Але майте на увазі, що в більшості облікових записів системної служби не повинно бути дійсних домашніх шляхів та оболонок.
Ден Карлі

2

Спробуйте сю-сторінку:

su -c script_run_as_postgres.sh - postgres

Позашляхово, ви можете використовувати sudo, щоб дозволити вам запускати саме цього коментаря як постгреси без пароля. Однак для вашого / etc / sudoers потрібні певні налаштування.


2

Метод "su -c ...", розміщений іншими, є хорошим. Для автоматизації ви можете додати скрипт до crontab користувача, який вам потрібен для виконання.


1

Якщо у користувача вже є запис на sudo, і ви не знаєте пароль суперпользователя, ви можете спробувати наступне: Цей перезавантажує поштові повідомлення, ініціалізовані за адресою /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"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.