2014-09-22 2 views
0

선생님은 웹 서버를 가지고 있으며 우리는 몇 가지 것을 시험 할 수 있습니다. 나는 다음 명령을 퍼티 사용하여 서버에 연결 시도 :문자열을 가상 파일에 쓰시겠습니까?

echo "i 4 r 255 g 0 b 0." > /dev/ttyACM0 

ttyACM0 직렬 인터페이스에 스트림을 리디렉션 가상 파일입니다. 이 특정 명령은 rgb led의 색상을 변경합니다. 그러나 같은 명령은 exec 또는 shell_exec와 PHP에서 작동하지 않습니다

<?php 
    // Script saved at /home/STUDENT_NAME/public_html/blink.php 
    echo shell_exec("echo \"i 4 r 255 g 0 b 0.\" > /dev/ttyACM0"); // Doesn't work 
    echo shell_exec("echo \"Hello\""); // Returns "Hello" 
?> 

나는, execshell_exec 비활성화되지 않습니다 알고 shell_exec 작품에 두 번째 호출 때문이다. 내 다음 아이디어는 fopen("php://memory", "a");을 사용하는 것이지만이 래퍼를 사용하는 방법을 모르겠습니다. 그래서 내 질문 :

  • 이 래퍼를 올바르게 사용하는 방법은 무엇입니까? (아마도 "php://memory/dev/ttyACM0"을 좋아할 것입니다.)
  • 더 좋은 해결책이 있습니까?
+1

'public_html'은 Apache를 제안합니다. 웹 서버 사용자가 해당 파일에 쓸 수 있습니까? 또한 오류 메시지가 없다는 것은 PHP를 표시하도록 구성하지 않았 음을 의미합니다. –

답변

1

웹을 통해 파일을 작업 할 때 모든 파일 액세스는 웹 서버가 실행중인 사용자를 통해 수행됩니다. 이는 PuTTY를 통해 로그인 한 사용자와 다를 수 있습니다. 따라서 권한 문제가 발생할 수 있습니다. tty 장치에 대한 권한을 확인하십시오

LS -l/dev에/ttyACM0 나는 그것이 그룹 쓸 수 있으므로 사용자의 일부인 경우 그룹의 메모를 받아 확인합니다 추측

해당 그룹 : HTTP 서버가로 실행중인 사용자가 동일한 권리를 가지고있는 경우

그룹은

그런 다음 확인 :

ps aux | 그렙 HTTP

이 이름에 HTTP를 포함하는 모든 프로세스의 목록을 표시해야하며, 웹 서버는 가능성이 그들 가운데있을 것입니다. 그것을 식별하고, 해당 행의 첫 번째 열은 웹 서버가 사용하는 사용자를 알려줍니다. 아파치이라고 가정 해 보겠습니다. 이제 실행

그룹은 아파치

(또는 당신이 무엇을 이전 단계에서 발견)이 당신에게 사용자가 속한 그룹을 표시합니다, 나는 ttyACM0이들 수 없게됩니다 속해있는 그룹을 내기 그. sysadmin에게 사용자를 그룹에 추가하도록 요청해야합니다.

어쨌든 shell_exec을 사용하는 것은 매우 나쁜 습관입니다. 난 그냥 시리얼 장치를 열고 쓸 수 있다고 생각 : HTTP 서버 사용자가 장치에 쓸 수있는 권한이없는 경우

$fp = fopen ("/dev/ttyACM0", "w"); 
fwrite ($fp, "i 4 r 255 g 0 b 0.\n"); 
fclose ($fp); 

은 물론이 작동하지 않습니다.또한 fwrite()의 회선 종단에주의하십시오. 필요하거나 필요하지 않거나 다른 회선 종단이 필요합니다 (\r 또는 \r\n).

+0

장치는 'dialout'의 모든 구성원이 읽고 쓸 수 있도록합니다 (crw-rw ----). 내 사용자는이 그룹의 구성원입니다. 세 번째 명령의 결과는 나에게 아무런 의미도 없다. (http가 빨간색 인 http'STUDENT_NAME 12425 0.0 0.0 13252 924 pts/0 S + 17:37 0:00 grep --color = auto http')'error_get_last()'는'failed '열어두기 : 퍼미션이 거부되었습니다.'라는 메시지가 나옵니다. – Cubinator73

+0

나는'echo'와'php script_name' 명령 줄을 통해 파일을 조작 할 수 있지만 브라우저에서는 조작 할 수 없다는 것을 알아 냈습니다. – Cubinator73

+0

웹을 통해 파일을 작업 할 때 사용자가 모든 파일 액세스를하지 않지만 사용자를 통해 웹 서버가 실행 중일 때 누락 된 부분은 무엇입니까? 위의 ps 명령은 사용자가보고 한 것과는 다른 행을 표시해야하며 첫 번째 열은 웹 서버가 사용중인 사용자를 알려줍니다. 해당 사용자에 대해 'groups'명령을 실행하면 사용자가 속한 그룹이 표시되고 _dialout_는 그 그룹에 포함되지 않습니다. "Permission denied"오류는 분명히 말해줍니다. – SukkoPera

관련 문제