Отредактируйте файл 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
), который выполняет эту работу.