Я перенаправляю stdout из sudo. Однако владельцем выходного файла является пользователь, запустивший sudo, а не целевой пользователь sudo.
Я вошел в систему как «root» для выполнения следующей команды:
sudo -u w3svcsadm echo "TEST ran" > /home/youribm/emaildigest/TEST_$( date +%Y%m%d%H%M%S ).output
Выходной файл создается с владельцем «root», но я хочу, чтобы владельцем был «w3svcsadm» (это вызывает у нас проблемы с разрешениями). Я перепробовал в команде всевозможные паренсы, но не могу передать права собственности целевому пользователю.
Ответ, который вам нужен, - запустить вашу команду следующим образом (или аналогичным образом):
sudo -u w3svcsadm bash -c 'echo "TEST ran" > /home/youribm/emaildigest/TEST_$( date +%Y%m%d%H%M%S ).output'
Разница в следующем:
в вашей версии sudo означает, что echo "TEST ran"
работает как w3svcsadm
. В > /home/youribm/emaildigest/TEST_$( date +%Y%m%d%H%M%S ).output
запускается от имени вашего текущего пользователя, который, очевидно, является пользователем root.
на самом деле вы хотите, чтобы весь блок, включая перенаправление, запускался как w3svcsadm
. В моем предложении я достигаю этого, запустив bash
так как w3svcsadm
и рассказывая bash
для запуска полной командной строки (echo "TEST ran" > /home/youribm/emaildigest/TEST_$( date +%Y%m%d%H%M%S ).output
), а затем выйдите.
Или, проще говоря: перенаправление - это форма связи между двумя командами, и в вашем случае вы хотите, чтобы обе команды выполнялись одним и тем же пользователем.
Может помочь мысленно заменить >
с участием ;
(или &&
) чтобы понять: первая команда echo
, а вторая команда write standard input into this file
.
Первая «половина» команды (до перенаправления) выполняется sudo, а остальная часть - нет. Хотя мы обычно рассматриваем команду с перенаправлением вывода как одну команду, это не так - это две команды, поэтому вам необходимо убедиться, что обе команды выполняются тем пользователем, которого вы предполагали.
это использование sudo
только для части перед перенаправлением, используйте
sudo -u w3svcsadm -c 'echo "TEST ran" > /home/youribm/emaildigest/TEST_$( date +%Y%m%d%H%M%S ).output'
или вы можете использовать
echo "TEST ran" | sudo -u w3svcsadm tee /home/youribm/emaildigest/TEST_$( date +%Y%m%d%H%M%S ).output
Я вошел в систему как root для выполнения команды ниже
Немного странно:
Причина вашей проблемы в том, что вы перенаправляете вывод команды sudo, когда действительно хотите перенаправить вывод w3svcsadm:
sudo sudo -u w3svcsadm \
'echo "TEST ran" > /home/youribm/emaildigest/TEST_$( date +%Y%m%d%H%M%S ).output'
Спасибо всем!
@Quantum, к сожалению, наша версия sudo не имеет опции -c.
@iwaseatenbyagrue Спасибо за подробное объяснение. Я знал, что это должно быть что-то в этом роде, но никогда не думал о запуске bash с командой.
@symcbean «Понижение» разрешений было всего лишь тестом. Настоящая проблема, с которой я столкнулся, - это задание cron, и это вызывает проблемы, когда он создает файл как root.