내 조사:

내 조사:

shell_exec()PHP 함수를 사용하여 일부 콘텐츠를 로컬 소켓으로 보내고 싶습니다 .

내 현재 접근 방식은 다음과 같습니다.

sudo -s echo "foobar" > /dev/tcp/192.168.178.41/8080

명령줄에서 이 명령을 실행하면 모든 것이 잘 작동합니다.. 그러나 PHP 스크립트에서 이 작업을 수행하려고 하면아무 일도하지.

심지어 오류도 아닙니다 /var/log/httpd/apache24-error_log. (예, 이 길이 맞습니다.)

저는 Synology Diskstation과 Linux와 유사한 운영 체제를 사용하고 있습니다.

내 조사:

  • 나는 도망 갔다 echo exec("whoami");. 돌아왔다 http. 분명히 아파치 사용자 이름은 http.
  • /etc/sudoers그런 다음 사용자에게 필요한 모든 권한이 부여되도록 파일을 수정했습니다 . 내 Linux 배포판에는 이 기능이 없으므로 visudo수동으로 편집해야 합니다. 이제 다음과 같이 보입니다.

    # Enable logging of a command's output.
    # Use sudoreplay to play back logged sessions.
    Defaults syslog=authpriv
    
    # Allow root to execute any command
    root ALL=(ALL) ALL
    
    # Allow members of group administrators to execute any command
    %administrators ALL=(ALL) ALL
    
    # Configure privilege of wheel group
    Cmnd_Alias SHELL = /bin/ash, /bin/sh, /bin/bash
    Cmnd_Alias SU = /usr/bin/su
    %wheel ALL=(ALL) NOPASSWD: ALL, !SHELL, !SU
    
    http ALL=NOPASSWD: /bin/sudo, /bin/echo, /usr/bin/sudo, /usr/bin/echo
    

PHP를 사용하여 이 명령을 어떻게 성공적으로 실행할 수 있습니까? 미리 감사드립니다!

답변1

나는 실험을 했고 위의 댓글에서 @thrig가 의심한 것을 정확히 shell_exec()사용하고 있습니다 . shSynology Diskstation에서는 이것이 가능하지 않거나 지원되지 않을 수 있습니다 /bin/sh.bash/dev/tcp/...

이것의 변형이 나에게 효과적인 것 같습니다.

shell_exec("bash -c 'echo foobar > /dev/tcp/192.168.178.41/8080'")

관련 정보