У меня есть сценарий, который копирует файлы между серверами. Я использую команду lsof, чтобы убедиться, что файл не записывается перед перемещением. Пользователь, запускающий скрипт и пользователь, записывающий в файл, отличается, поэтому мне нужно sudo для владельца файла. Вот соответствующая строка в файле sudoers:Использовать источник со скриптом, который содержит команду sudo
userA ALL=(userB:userB) NOPASSWD: ALL
В главном скрипте (бежал как ПользовательА), я попытался назвать SUDO то индекс, содержащий команду LSOF:
sudo su - userB -c 'source ./getOpenFiles.sh'
getOpenFiles.sh имеет одну строку:
#!/bin/bash
lsofResult=$(/usr/sbin/lsof "${sourcePath}")
Я также попытался назвать индекс:
source ./getOpenFiles.sh
Тогда есть первая линия подстрочный быть Sudo:
#!/bin/bash
sudo su - banjobs
lsofResult=$(/usr/sbin/lsof "${sourcePath}")`.
Ни одно из решений работает.
Когда вы запускаете 'sudo su - banjobs', следующая команда не запускается до тех пор, пока ваш' sudo su' не завершится и не выйдет, и ничего не осталось, как 'banjobs'. –
Это означает, что он не оценивает 'lsofResult' как' banjobs'. –
... и если вы используете 'su -c 'source somescript'', то' somescript' запускается 'sh', а не' bash', независимо от того, что говорит его shebang. И если ваш 'sh' не поддерживает' source', то он не запускается вообще. (POSIX-совместимый способ записи 'source' -'. Somescript', а не 'source somescript'). –