2014-06-07 1 views
1

배포 스크립트의 마지막 단계 중 하나는 의 모든 PHP 파일이 suphp 요구 사항을 충족해야합니다. 배포 스크립트에서 우리는이 : 우리가 잘 작동 서버에서 수동으로 명령을 실행하면Capistrano에서 파일 사용 권한을 업데이트하면 '인수 목록이 너무 길다.'

* executing "find /srv/www/xyz/ -type f -name \"*.php\" -print0 | xargs -0 sudo chmod 600" 
    servers: ["www.xyz.net"] 
    [www.xyz.net] executing command 
*** [err :: www.xyz.net] sudo 
*** [err :: www.xyz.net] : 
*** [err :: www.xyz.net] unable to execute /bin/chmod: Argument list too long 
*** [err :: www.xyz.net] 
    command finished in 333ms 
failed: "sh -c 'find /srv/www/xyz/ -type f -name \"*.php\" -print0 | xargs -0 sudo chmod 600'" on www.xyz.net 

:

run "find /srv/www/xyz/ -type f -name \"*.php\" -print0 | xargs -0 sudo chmod 600" 

그러나 우리는 다음과 같은 오류가 발생 배포 할 때. Capistrano를 실행할 때 왜이 오류가 발생하는지 이해하는 사람이 있을까요? 카피 스트라 노에서 다음과 같이 파이프 될 때 sudo가 작동하면 것인지도 확실하지

run "find /srv/www/xyz/ -type f -name \"*.php\" -print0 | xargs -0 sudo chmod 600" 

:

답변

1

귀하의 명령이 있습니다.

카피 스트라 노 중대하다, 그러나 무엇을하는지 아무도 마법 없다. Capistrano는 본질적으로 SSH 연결을 열어주는 루비 스크립트입니다 & 다음 쉘 스크립트 명령의 더미를 실행합니다. 따라서 Capistrano를 통해 시작된 새로운 SSH 연결은 서버에 대한 새로운 로그인으로 간주됩니다. 즉, sudo은 암호가 필요합니다. & Capistrano는 그런 식으로 작동하지 않습니다 ... 서버에 암호가없는 sudo이 설정되어 있지 않은 한. the Capistrano documentation에서 자세한 내용 : -name '*.php'을 : 당신은 당신이 -name \"*.php\"을 사용할 때 큰 따옴표를 이스케이프 할 필요가 같은

The second part of this topic is that our deploy user needs to be authorised to work in the deployment directory, on the server. That means we need to be able to work, ideally without sudo (none of the default Capistrano recipes expect sudo to be available), or for your custom recipes, you will need to have configured passwordless sudo.

는 또한, 그래서 아마 그냥이 작동하는 것처럼 이토 수 변경하지 않는 것 같습니다. run 명령의 컨텍스트에 맞게 큰 따옴표를 이스케이프 처리 했으므로 작은 따옴표를 사용합니다.

run "find /srv/www/xyz -type f -iwholename '*.php*' -print0 | xargs -0 chmod 600" 

참고 :

run "find /srv/www/xyz/ -type f -name '*.php' -print0 | xargs -0 sudo chmod 600" 

하지만 그 모든 과거

, 나는이 대신하려고 추천 : 나는 run의 맥락에 배치하는 탈출 따옴표 ( \")이이 문제의 근본이었다 내기 사용자가 시작하는 sudo하지 않고 파일을 만들 수 있다면, 다음 같은 사용자가 파일 권한을 변경 후 sudo 사용할 필요가 있다는 이유가 없기 때문에 장소에 더 sudo이 없습니다. 또한 name이 아닌 iwholename을 사용하고 있습니다. 이 맥에서 사용 xargs의 비 GNU은/BSD 버전 작동하지 않도록

run "find /srv/www/xyz -type f -iwholename '*.php*' -print0 | xargs --no-run-if-empty -0 chmod 600" 

--no-run-if-empty는 GNU 확장이다 :

는 또한 원격 호스트가 xargs 옵션을 처리 할 수있는 경우 --no-run-if-empty를 사용하는 것이 좋습니다 OS X 등이지만 현대 Linux 설치 (우분투/데비안, CentOS/레드햇)에서는 잘 작동합니다.

+0

감사합니다. Jake. 배포 사용자가 필요한 권한을 가지고 있지 않으므로 sudo가 필요합니다 (우리는없이 시도했지만 실패했습니다). 그러나 sudo를 사용하여 명령의 버전으로 변경하면 일관되게 3 번 작동합니다. 문제가 무엇이라고 생각합니까? – Michelle

+0

@Michelle 암호없이'sudo' 설정을했기 때문에'sudo'가 효과가 있었다고 가정합니다. 내 최신 편집을 참조하십시오. 그러나 당신은 "우리가 sudo로 명령의 버전으로 바꿨을 때 그것은 3 번 일관되게 일했습니다. 문제가 무엇이라고 생각합니까?"그렇다면 원래의'-name \"*. php \ "'설정이 초초라고 생각합니다. '-name "* .php"로 이스케이프 된 따옴표를 없애 버리거나 그냥'-iwholename '* .php *' '를 사용하는 것이 더 좋은 해결책 일 수 있습니다. 나는 항상'iwholename'을 문제없이 사용했습니다. – JakeGould

+0

@Michelle 무슨 일이 있었는지 알 것 같습니다. 이스케이프 된 따옴표는'-name \ "*. php \"의 컨텍스트에서 실행되도록 설정합니다. 그러나 이것은'-name '* .php와 같이 작은 따옴표를 사용하도록 변경 될 수 있습니다. 어느 것이'-iwholename '* .php *''에도 사용됩니다. 나는 도망 쳤던 따옴표와'run'이 좋은 플레이를하지 못한다는 것을 확신합니다. 그래서 문제가 해결되었습니다! – JakeGould

관련 문제