экспортировать функцию оболочки в su как пользователь с оболочкой по умолчанию ksh

У меня есть ситуация, когда только root может mailx, и только операторы могут перезапустить процесс. Я хочу создать автоматический сценарий, который перезапускает процесс и отправляет электронное письмо об этом.

Когда я пробую это с помощью функции, функция «не найдена».

У меня было что-то вроде:

#!/usr/bin/bash

function restartprocess {
/usr/bin/processcontrol.sh start
}

export -f restartprocess

su - ops -c "restartprocess"

mailx -s "process restarted" myemail.mydomain.com < emailmessage.txt

exit 0

Мне сказали, что функция не найдена. После устранения неполадок выяснилось, что оболочкой по умолчанию для пользователя ops является ksh.

Я попытался изменить сценарий для запуска в ksh и изменить "export -f" на "typeset -xf", но функция не была найдена. Типа: ksh: функция экспорта не найдена

В конце концов я сдался и просто вызвал сценарий (который был непосредственно в функции), и это сработало. Это было как:

su - ops -c "/usr/bin/processcontrol.sh start"

(Это все, конечно, упрощение настоящего сценария).

Учитывая, что у пользователя ops оболочка по умолчанию - ksh, и я не могу изменить это или изменить sudoers, есть ли способ экспортировать функцию, чтобы я мог использовать su как ops (и мне нужно запустить профиль ops) и выполнить эту функцию?

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

Любое образование по этому поводу будет оценено!


person user1659007    schedule 10.09.2012    source источник
comment
Могу ли я предположить, что export -f restart (а не export -f restartprocess) - это опечатка в вашем сообщении, а не в вашем реальном коде? Если да, пожалуйста, исправьте свой вопрос выше. Также может помочь включение точного текста сообщения «функция не найдена». Удачи.   -  person shellter    schedule 10.09.2012


Ответы (1)


Существует множество ограничений на экспорт функций, особенно в сочетании с su - ... с разными учетными записями и разными оболочками.

Вместо этого выверните свой сценарий наизнанку и поместите всю команду, которая должна выполняться, внутри функции в вызывающей оболочке.

Что-то вроде: (И bash, и ksh)

#!/usr/bin/bash

function restartprocess {
    /bin/su - ops -c "/usr/bin/processcontrol.sh start"
}

if restartprocess; then
    mailx -s "process restarted" \
        [email protected] < emailmessage.txt
fi

exit 0    

Это скроет всю /bin/su обработку внутри функции restartprocess и может быть расширено по желанию.

person Henk Langeveld    schedule 11.09.2012
comment
Спасибо тебе за это. Я бы проголосовал, но, видимо, мне еще не разрешено это делать. - person user1659007; 14.09.2012
comment
Вы все равно сможете принять ответ (как вы его просили) или, если нет, предоставить отзыв о том, как его можно улучшить. Кроме того, попробуйте провести время на некоторых других сайтах stackexchange и заполнить свой профиль. - person Henk Langeveld; 15.09.2012