Я пытаюсь запустить сценарий bash на сервере centos. Я запустил сценарий как пользователь root (как для прав доступа к файлам), но мне также нужно использовать разрешения службы aws, принадлежащие учетной записи службы. Мы решили не предоставлять учетной записи root доступ к среде AWS.
Если я запустил скрипт вручную ./disk-arcive.sh
работает без проблем. Когда я запускаю его из своего crontab, он молча терпит неудачу при переходе на aws-cli-user
. Нет сообщения об ошибке, и только при запуске cron.
Как это называется в Crontab sudo crontab -e
:
0 20 * * * /bin/sh /etc/disk-arcive.sh
Сводка файла оболочки:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin <<Same as root
find (old stuff) >> /old-stuff.temp
while read line; do
/opt/bin/encryption-tool "$line">> /encrypt_logfile.log << key access requires root permission
done < /old-stuff.temp
while read line; do
sudo -u aws-cli-user /usr/local/bin/aws s3 mv "$line.pgp" s3://mybucket"$line.pgp" >> /bucket_logfile.log #<< switch to user fails, user needed for s3 permissions
sudo -u aws-cli-user echo "User is now aws-cli-user" >> /bucket_logfile.log #<< added for debugging, does not work
echo "looks like $line is done" >> /bucket_logfile.log #<< added for debugging, Works
done < /old-stuff.temp
exit
ОБНОВЛЕНИЕ1 Я обновил строки "переключение пользователей" следующим образом. Похоже, что он не работает по-другому, однако, если я использую какие-либо параметры aws-s3 (например, --sse или --acl), они читаются как часть su
параметры.
su -l aws-cli-user -c '/usr/local/bin/aws s3 mv "$line.pgp" s3://mybucket"$line.pgp" --sse >> /bucket_logfile.log' #<< switch to user fails, user needed for s3 permissions
su -l aws-cli-user -c 'echo "User is now aws-cli-user $(whoami)" >> /bucket_logfile.log' #<< added for debugging, does not work. enters a blank line into the log file
Выход echo
line показывает, что строка $ теперь передается при переключении пользователя.
ОК, это сработало, потребовалось несколько изменений
su -l username -c command
Это позволило изменить пользователя в cron. Следующим шагом была работа с одинарными кавычками и двойными кавычками, чтобы команда была "скомпилирована" правильно. Я нашел только одну ссылку на это, поэтому у меня может быть неправильная терминология.
su -l aws-cli-user -c '/usr/local/bin/aws s3 mv "$line.pgp" s3://mybucket"$line.pgp" --sse >> /bucket_logfile.log'
Одиночная кавычка заставляет пользователя «компилировать» команду, и он не знает, что такое переменная $ line, поэтому команда не может найти ссылку на файл.
su -l aws-cli-user -c "/usr/local/bin/aws s3 mv '$line.pgp' s3://mybucket'$line.pgp' --sse >> /bucket_logfile.log"
Теперь с двойными кавычками пользователь Root компилирует работу, включая переменную $ line, а затем передает выполненную команду другому пользователю для выполнения. Из-за этого использование $ (whoami) всегда показывало root
даже если другой пользователь выполняет команду со своими разрешениями.