안녕하세요,
현재 제가 php로 구성된 웹서버를 사용 중인데요, apache가 쉘스크립트를 실행시키는 부분에 대해서 문의 드리고자 합니다.
우선 제가 사용하는 웹서버는 php에서 ssh2를 이용해서 로컬서버에 접속을 한 후 로컬 계정의 권한으로 쉘스크립트를 실행하게끔 되어있습니다.
OS는 CentOS 7.4를 사용하고 있습니다.
명령어는 ssh2_exec를 사용하였구요, 간략하게 코드를 적어드리면
$cmd[] = "cd {폴더경로} && /bin/bash 쉘스크립트파일명.sh & ";
$ssh_cmd = implode(" ", $cmd);
$connection = ssh2_connect("도메인주소 혹은 IP", 22);
ssh2_auth_password($connection, "계정 ID", "계정 Password");
ssh2_exec($connection, $ssh_cmd);
이렇게 ssh2_exec를 통해 $ssh_cmd를 실행하고, $ssh_cmd에서 $cmd를 읽어서 쉘스크립트를 실행하게 되어있는 구조입니다.
이때 쉘스크립트가 일부 리눅스 패키지를 실행하게 됩니다.
이 패키지는 새로이 몇몇 파일들을 생성하는 작업을 수행하는데 파일사이즈가 0으로 나와서 문제가 되고 있습니다.
우선 해당 폴더에는 777의 권한을 부여하였고 setfact를 통해 새로 생성되는 파일에 대해서 777의 권한을 부여했습니다.
또한 해당 폴더의 소유권도 ssh2를 통해 접속하는 로컬 계정으로 변경하였습니다만 계속 에러가 발생하네요.
ssh2_exec가 아닌 exec 명령어를 통해 쉘스크립트를 실행하는 경우에는 문제 없이 실행되는데 이렇게 되면 웹 리소스를 계속 점유하게 되서 여간 불편한게 아닙니다.
쉘스크립트에서 패키지 명령어 실행하기 전에 폴더 생성명령을 내려보니 아무 문제 없이 잘 생성되는 것을 보면 apache자체가 쉘 스크립트를 실행하는 데에 있어서 권한 문제는 아닌것으로 보이네요.
보통 이런 경우에는 apache가 쉘스크립트를 실행하는데는 문제가 없으나 패키지를 실행하는 권한이 없어서 그런건지, 아니면 리눅스 패키지 중에 혹시 원격접속을 통해 실행하는 것이 불가능한 패키지들이 있는지 궁금합니다.
어떠한 의견이라도 주시면 감사하겠습니다.
´äº¯ °¨»çµå¸³´Ï´Ù. Á¦°¡ Àá½Ã ³ëÆ®ºÏ ¼ö¸®¸¦ ÇؾߵǼ ´äº¯ÀÌ ´Ê¾ú½À´Ï´Ù.
¾Ë·ÁÁֽŠµÎ°¡Áö ¹æ¹ý ¸ðµÎ ½ÃµµÇغ¸¾ÒÀ¸³ª ¿©ÀüÈ÷ ½ÇÇàÀÌ ¾ÈµÇ³×¿ä.
shÆÄÀÏ ¸»°í Á¦°¡ ¸»¾¸µå¸° ÆÐÅ°ÁöÀÇ °æ¿ì ½ÇÇà¸í·É¾î¸¦ ÀÌ¹Ì /usr/bin¿¡ º¹»çÇسõÀº »óŶó ¾î´À°÷¿¡¼µç ½ÇÇàÀÌ °¡´ÉÇÑ »óÅÂÀÔ´Ï´Ù.
º¸Åë Á¦°¡ °³ÀÎ ³ëÆ®ºÏ¿¡¼ ssh¸¦ ÅëÇØ ¿ø°ÝÀ¸·Î Á¢¼ÓÇؼ Ä¿¸Çµå »ó¿¡¼ Á÷Á¢ ¸í·ÉÀ» ½ÇÇàÀ» ÇÒ¶§´Â ¾Æ¹« ¹®Á¦¾øÀÌ Àß µÇ´Âµ¥ apache°¡ ssh2¸¦ ÅëÇØ ¿ø°ÝÁ¢¼ÓÇؼ ½©½ºÅ©¸³Æ®¸¦ ½ÇÇà½ÃÄ×À»¶§ ÆÐÅ°Áö ½ÇÇàÀÌ ¾ÈµÇ´Â°ÍÀº
1) ½©½ºÅ©¸³Æ®¿¡¼ ÆÐÅ°Áö ¸í·ÉÀ» ½ÇÇàÇϴµ¥ ¹®Á¦°¡ ÀÖ´Ù (bash°¡ ¾Æ´Ñ ´Ù¸¥ ½©½ºÅ©¸³Æ®ÀÇ »ç¿ëÀÌ ÇÊ¿äÇÒ ¼öµµ ÀÖ´Ù)
2) ssh¿Í ssh2ÀÇ Â÷ÀÌ°¡ ¹®Á¦°¡ ÀÖ´Ù
ÀÌ µÎ°¡Áö Áß¿¡ ÇϳªÀÏ ¼ö ÀÖÀ»±î¿ä? 1¹øÀÇ °æ¿ì¶ó¸é bash¿Í ´Ù¸¥ ½©½ºÅ©¸³Æ®(sh, ksh, csh µî)°£ÀÇ Â÷À̸¦ ¾Ë¾ÆºÁ¾ß ÇÒ °Í °°Àºµ¥, 2¹øÀÇ °æ¿ì´Â Ưº°È÷ ssh¿Í ssh2ÀÇ Â÷ÀÌ°¡ ¾ó¸¶³ª ¿µÇâÀ» ¹ÌÄ¥Áö °¡´ÆÇϱⰡ ¾î·Æ³×¿ä.
¸í·É¾î ½ÇÇà stepÀ» log Âï¾î µÎ¼Å¾ß ÇÕ´Ï´Ù.
´äº¯ °¨»çµå¸³´Ï´Ù. Á¦°¡ Àá½Ã ³ëÆ®ºÏ ¼ö¸®¸¦ ÇؾߵǼ ´äº¯ÀÌ ´Ê¾ú½À´Ï´Ù.
Àú À§¿¡ Á¦°¡ ÀûÀº $cmd[] = "cd {Æú´õ°æ·Î} && /bin/bash ½©½ºÅ©¸³Æ®ÆÄÀϸí.sh & "; ÀÇ ºÎºÐ¿¡¼ {Æú´õ°æ·Î}´Â ÀÌ¹Ì Àý´ë°æ·Î·Î Àû¾îµÎ¾ú½À´Ï´Ù.
±×¸®°í ½ÇÇà·Î±×¸¦ Âï´Â°ÍÀº 2>&1 ¸¦ Àû¾îÁÖ¸é ¿¡·¯·Î±×¸¦ ±â·ÏÇÒ¼ö ÀÖÁö¸¸ ÇØ´ç ÆÐÅ°ÁöÀÇ °æ¿ì´Â ÆÄÀÏ »ý¼º¿¡ ´ëÇÑ ¿¡·¯·Î±×°¡ ±â·ÏÀÌ ¾ÈµÇ´õ±º¿ä.
Ȥ½Ã 2>&1 ÀÌ¿Ü¿¡¼ ´Ù¸¥ ¹æ½ÄÀ¸·Î ·Î±×¸¦ ±â·ÏÇÏ´Â ¹æ¹ýÀ» ¾Æ½Ã¸é ¾Ë·ÁÁÖ½Ã¸é °¨»çÇÏ°Ú½À´Ï´Ù.
·Î±× ÆÄÀÏÀÇ °æ¿ì¿¡µµ Àý´ë °æ·Î¸¦ Àû¾îµÖ¾ß ÇÕ´Ï´Ù.
½©½ºÅ©¸³Æ® ÆÄÀϸí = Àý´ë°æ·Î.
Á¦°¡ php¿¡ Àû¾î³õÀº $cmd¸¦ ÀüºÎ ´Ù Àû¾îµå¸®¸é
$cmd[] = "(cd {$SaveDir}($sample} && /bin/bash /tool/analysis.sh 2>&1 > {$SaveDir}{$sample}/log &)"
ÀÌ·¸°Ô Àû¿ëÀÌ µË´Ï´Ù.
¸»¾¸µå¸°¹Ù¿Í °°ÀÌ toolÆú´õ ³»ÀÇ analysis.sh¶ó´Â ½©½ºÅ©¸³Æ®¸¦ Àý´ë°æ·Î·Î ÁöÁ¤ÇØÁ༠½ÇÇàÇÏ°Ô²û Çسù½À´Ï´Ù.
±×¸®°í 2>&1À» Àû¾î¼ log¶ó´Â ÆÄÀÏÀ» »ý¼ºÇؼ ¿¡·¯·Î±×¸¦ È®ÀÎÇÏ°Ô²û ÇÏ¿´±¸¿ä.
logÆÄÀÏÀº »ý¼ºÀÌ µÇ´Âµ¥ ÆÐÅ°Áö ÇÁ·Î±×·¥ÀÇ Á¤»ó ½ÇÇà ¿©ºÎ (¿©±â¼± ÆÄÀÏ»ý¼º ¿©ºÎ°¡ µÇ°ÚÁÒ)¿¡ ´ëÇؼ± ±â·ÏÀÌ ¾ÈµÇ³×¿ä.
https://stackoverflow.com/questions/255414/why-doesnt-cd-work-in-a-bash-shell-script
¸¶Áö¸·¿¡ &·Î bg ¶³¾î ¶ß¸®´Â °Íµµ ¹®Á¦°¡ µÉ ¼ö ÀÖ½À´Ï´Ù.
&´Â back ground¿¡ ³ÖÀ¸¶ó´Â ¸í·ÉÀÌÁö, bg¿¡¼ ½ÇÇàÇ϶ó´Â ¸í·ÉÀº ¾Æ´Ï¹Ç·Î
nohubÀ» ¾²¼Å¾ß ÇÕ´Ï´Ù.
https://stackoverflow.com/questions/9190151/how-to-run-a-shell-script-in-the-background-and-get-no-output
½ÇÁ¦·Î À§ÀÇ cmd´Â ±×³É bg¿¡¸¸ ¹Ð¾î ³Ö°í ³¡ ÀÔ´Ï´Ù.
¾Æ¹« °Íµµ ¾ÈÇÕ´Ï´Ù.
´äº¯ °¨»çµå¸³´Ï´Ù. Á¦°¡ Àá½Ã ³ëÆ®ºÏ ¼ö¸®¸¦ ÇؾߵǼ ´äº¯ÀÌ ´Ê¾ú½À´Ï´Ù.
»ç¿ëÀÚ¿¡°Ô ÇÒ´çµÈ ¿ë·®ÀÌ °¡µæáÀ» °æ¿ì¶ó¸é ÀϹÝÀûÀ¸·Î »ý°¢ÇÏ´Â µð½ºÅ©¿ë·®ÀÌ ´Ù ãÀ» °æ¿ì¸¦ ¸»¾¸ÇϽôÂÁö ÆÄÀϽýºÅÛ »ç¿ë·®À» ¸»¾¸ÇϽôÂÁö¿ä.
du¿Í dfÀÇ ¸í·É¾î¸¦ ÀÌ¿ëÇؼ È®ÀÎÇغ¸´Ï ÀüÀÚ³ª ÈÄÀÚ ¸ðµÎ ¿ë·®Àº ÃæºÐÈ÷ ³²¾ÆÀÖ¾î¼ ÇØ´çµÇ´Â ºÎºÐÀÌ ¾Æ´Ñ °Í °°½À´Ï´Ù.
Ȥ½Ã Á¦°¡ ¸»¾¸µå¸° °Í ÀÌ¿Ü¿¡ ´Ù¸¥ ºÎºÐÀ» ¸»¾¸ÇϽô °ÇÁö ±Ã±ÝÇϳ׿ä.