Я написал сценарий, который принимает в качестве аргумента строку, которая представляет собой объединение имени пользователя и проекта. Предполагается, что сценарий переключит (su) на имя пользователя, cd в конкретный каталог на основе строки проекта.
Я в основном хочу сделать:
su $USERNAME;
cd /home/$USERNAME/$PROJECT;
svn update;
Проблема в том, что как только я делаю су ... он просто ждет там. Это имеет смысл, поскольку поток выполнения перешел к переключению на пользователя. Как только я выхожу, все остальное выполняется, но не работает должным образом.
Я добавил su к команде svn, но команда не удалась (т.е. она не обновила svn в желаемом каталоге).
Как мне написать сценарий, который позволяет пользователю переключать пользователя и вызывать svn (среди прочего)?
chsh
для других пользователей. Моя проблема указана здесь, на stackoverflow.com/q/15307289/80353 Как мне адаптировать ваш ответ к моей ситуации?sudo
илиsu
имеет второстепенное значение,sudo
это намного безопаснее и удобнее.Гораздо проще: использовать
sudo
для запуска оболочки и использовать heredoc для подачи ей команд.(ответ изначально на SuperUser )
источник
-i
для полученияsomeuser
ожидаемого окружения.sudo
может быть удобно, но не годится, если он не из коробки (как в AIX).su -c 'commands'
это правильный ответ.Используйте сценарий, подобный следующему, для выполнения остальной части сценария или его части под другим пользователем:
источник
whoami
вместоid
которого будет возвращать имя вместо idsudo
может быть удобно, но не годится, если он не из коробки (как в AIX).su -c 'commands'
это правильный ответ.Вам необходимо выполнить все команды для разных пользователей как отдельный сценарий. Если это всего одна или несколько команд, то встроенный должен работать. Если команд много, то, вероятно, лучше переместить их в отдельный файл.
источник
su -s /bin/bash
.Вот еще один подход, который в моем случае был более удобен (я просто хотел отказаться от привилегий root и выполнить остальную часть сценария от ограниченного пользователя): вы можете перезапустить сценарий от правильного пользователя. Предположим, что он изначально запущен как root. Тогда это будет выглядеть так:
источник
runuser -u $user -- "$@"
, как указано в su (1)exec su "$user" "$0" -- "$@"
--
действительно полезно.Используйте
sudo
вместоEDIT : Как Дуглас отметил, вы не можете использовать
cd
в ,sudo
так как он не является внешней командой. Вы должны запускать команды в подоболочке, чтобы заставитьcd
работать.Вас могут попросить ввести пароль этого пользователя, но только один раз.
источник
sudo
может быть удобно, но не годится, если он не из коробки (как в AIX).su -c 'commands'
это правильный ответ.Сменить пользователя в сценарии оболочки невозможно. Обходные пути с использованием sudo, описанные в других ответах, вероятно, будут вашим лучшим выбором.
Если вы достаточно безумны, чтобы запускать сценарии Perl от имени пользователя root, вы можете сделать это с помощью
$< $( $> $)
переменных, которые содержат реальные / эффективные uid / gid, например:источник
Это сработало для меня
Я отделил свою «подготовку» от «стартапа».
затем в моем start_env.sh
источник
Вдохновленный идеей @ MarSoft, я изменил строки следующим образом:
Я использовал,
sudo
чтобы разрешить выполнение сценария без пароля. Если вы хотите ввести пароль для пользователя, удалите расширениеsudo
. Если вам не нужны переменные среды, удалите их-E
из sudo.Это
/usr/bin/bash -l
обеспечивает выполнениеprofile.d
сценариев для инициализированной среды.источник
sudo
может быть удобно, но не годится, если он не из коробки (как в AIX).su -c 'commands'
это правильный ответ.sudo
. На самом деле, sudo не так прост, во многих случаях вам даже нужнаsudo -E
запись конфигурации в sudoers.d, чтобы разрешить выполнение без tty с!requiretty
. Но есть много случаев, когда sudo необходимо для автоматически вызываемых скриптов, когда диалог пароля может мешать. Таким образом, я бы не стал убирать его из стандартного решения."$@"
внутри строки означает, что аргументы после первого добавляются в отдельную строку, а не включаются в-c
аргумент. Если вы хотите сделать это безопасным, вы могли быprintf -v arg_q '%q ' "$0" "$@"
и затем использоватьsu "$USERNAME" -c "/usr/bin/bash -l $arg_q"
COMMANDARGS=$@
решает проблему с-c
. Аргументы с пробелами не были проблемой раньше, но я реализовал ваш хороший ввод. Мне просто пришлось провести несколько экспериментов, чтобы заставить его работать. Я отредактировал вопрос и, надеюсь, я не вставил еще одну ошибку. Спасибо за ваш комментарий, унизительный, но необходимый.