2

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

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

Есть ли способ запустить скрипт от имени root?

sudo su
echo "password"
svn export --force file:///home/repository/trunk/ /home/memarexweb/public_html/devel/
chmod -R 777 /home/memarexweb/public_html/devel/

1 ответ1

3

Отредактируйте файл sudoers чтобы разрешить выполнение определенных команд без пароля.

Лучше всего разделить ваш пост-коммитный скрипт на две части, одна из которых будет запускаться через sudo .

  • /etc/sudoers:

    loqman    ALL=(root) NOPASSWD: /usr/local/bin/svn-postcommit-export
    
  • Ваш пост-коммит хук:

    #!/bin/sh
    sudo /usr/local/bin/svn-postcommit-export
    
  • /usr/local/bin/svn-postcommit-export:

    #!/bin/sh
    svn export --force file:///home/repository/trunk/ /home/memarexweb/public_html/devel/
    chmod -R 777 /home/memarexweb/public_html/devel/
    

    (Вы можете выбрать любое имя и поместить скрипт в любое место; я просто предложил svn-postcommit-export в качестве примера и /usr/local/bin в качестве общего расположения.)


Теперь, черт возьми, это не сработало

Вы можете подумать, что все в скрипте выполняется точно так же, как если бы вы вводили его с клавиатуры. Это не вариант. Интерпретатор (sh) запускает каждую команду отдельно, ожидает ее завершения, а затем запускает следующую.

Существуют также правила того, как обрабатываются ввод и вывод - программы читают свой ввод из 'stdin', а не из вашего скрипта, и записывают вывод в 'stdout' 0. Когда вы запускаете ваш скрипт в окне терминала 1, его 'stdin' и 'stdout' будут присоединены к вашей клавиатуре и этому окну терминала, и это будет наследоваться всеми командами: su 2 не знает, что остальные скрипт выглядит так; вместо этого он ожидает ввода команд от 'stdin' - в данном случае, вашей клавиатуры. Точно так же echo "password" выведет пароль на "stdout" (окно вашего терминала), а не на sudo .

Вы можете прикрепить вывод одного процесса к входу другого, используя каналы; например:

echo "svn export ..." | su
  • Это плохой способ запуска команд с помощью su ; используется здесь только в качестве примера. Для обычного использования лучше использовать su -c 'command' или sudo command .

  • Прежде чем пытаться echo password | sudo: не трать свое время. Большинство программ, включая sudo и su , будут явно считывать пароли с вашего терминала, а не с stdin. В случае с sudo вы можете отключить требование пароля, отредактировав /etc /sudoers, как указано выше.


0 «stderr» опущен для простоты, так как он работает так же, как и «stdout» в большинстве случаев.

1 Когда скрипт запускается с помощью svn post-commit, он получит /dev/null качестве своего стандартного ввода (и, вероятно, стандартного вывода).

2 Упрощенный. На самом деле su сам не читает команды, он запускает процесс оболочки (например, sh или bash), который выполняет эту работу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .