내 웹 루트 디렉터리에 다음 줄이 포함된 copy.sh라는 쉘 스크립트가 있습니다.
rsync -rzv -e 'ssh -p 199' test.txt [email protected]:/home/testuser/txt
ssh [email protected] -p 199 . /home/testuser/lty.sh > ltylog.txt 2>&1
스크립트는 먼저 텍스트 파일을 원격 서버에 복사한 다음 쉘 스크립트를 실행하여 다른 두 서버 간에 파일을 동기화합니다. 현재 서버에서 testuser에 대한 SSH 공개/개인 키를 생성하여 원격 서버에 복사했습니다. 비밀번호 없이 원격 서버에 SSH로 접속할 수 있습니다
ssh [email protected] -p 199
위 명령을 실행하고 원격 서버에 액세스할 수 있습니다. 내 호스트에서는 testuser 상태에 있을 때 아무 문제 없이 쉘 스크립트를 실행할 수 있습니다. 파일을 복사하고 원격 스크립트를 실행합니다. 이제 스크립트 권한을 777로 설정했습니다. 하지만 PHP를 사용하여 다음과 같이 shell_exec를 실행하여 이 스크립트를 실행해야 합니다.
<?php
shell_exec('. /var/www/html/copy.sh');
echo "<pre>";
echo file_get_contents("ltylog.txt");
echo "<pre>";
?>
하지만 이 PHP를 실행하면 아무 일도 일어나지 않습니다. 쉘 스크립트를 실행하는 사용자는 테스트 사용자가 아닌 Apache 사용자라고 생각하기 때문입니다. 하지만 shell_exec PWD 또는 다른 것을 실행하면 쉘 스크립트를 실행하는 대신 완벽하게 실행됩니다. PHP 안전 모드를 비활성화하고 모든 파일에 777 권한을 부여했습니다. 그러나 나는 아직도 이것을 작동시킬 수 없습니다.
PS 저는 권한이 있는 웹 루트에 쉘 스크립트를 배치하는 것이 큰 보안 위험을 초래한다는 것을 알고 있습니다. 하지만 이것은 프로덕션 시스템이 아니며 내부 목적을 위해 작은 웹 애플리케이션을 테스트하고 있습니다. 제가 이 작업을 수행하고 있는 서버는 인터넷에 전혀 접속할 수 없습니다. 누구든지 이 문제를 해결하도록 도와줄 수 있나요? 나는 작은 해결책을 찾고 있습니다. 왜냐하면 이 작은 웹 애플리케이션은 한두 사람만이 사용하기 때문입니다. 감사해요
답변1
귀하의 질문을 올바르게 이해하고 보안 위험에 관심이 없다면 sudo를 설치하고 모든 권한이 있는 sudoers 파일에 "www-data"(www-data는 nginx/apache에서 사용하는 기본 사용자입니다)를 추가한 다음 권한이 필요하지 않습니다. 암호가 필요하며 이를 사용하여 다른 사용자로 명령을 실행합니다.
다음을 수행할 수 있습니다.
sudo를 설치합니다:
apt-get install sudo
그런 다음 구성에 사용자를 추가합니다.
nano /etc/sudoers
마지막 줄에 추가하세요:
www-data ALL=(ALL) NOPASSWD: ALL
마지막으로 sudo를 사용하여 PHP를 편집하여 명령을 실행할 수 있습니다.
shell_exec('sudo -u testuser /var/www/html/copy.sh');
@편집하다
내 서버에서 실행되도록 관리했습니다. 아래 단계를 따르기만 하면 효과가 있을 것입니다.
PHP 코드를 다음 코드로 바꿔보세요.
<?php echo shell_exec('/bin/sh /var/www/html/copy.sh'); #this will display the result in your browser echo "<pre>"; echo file_get_contents("ltylog.txt"); echo "<pre>"; ?>
그런 다음 www-data가 copy.sh 파일에 액세스할 수 있는지 확인하세요.
다음과 같이 777 chmod를 지정할 수 있습니다.
chmod 777 /var/www/html/copy.sh
또는 파일을 사용자 www-data(아파치에서 사용)에 속하도록 만들 수 있습니다.
chown www-data:www-data /var/www/html/copy.sh
그러나 두 번째 옵션을 사용하기로 선택한 경우 다음과 같이 chmod를 적용하여 www-data가 계속 파일을 실행할 수 있는지 확인하세요.
chmod 755 /var/www/html/copy.sh
파일을 실행 가능하게 만듭니다.
chmod +x /var/www/html/copy.sh
copy.sh 코드를 다음으로 변경합니다.
rsync -rzv -e 'ssh -p 199' test.txt [email protected]:/home/testuser/txt ssh [email protected] -p 199 /bin/sh /home/testuser/lty.sh > ltylog.txt 2>&1
마지막으로 testuser가 다음 파일에 액세스할 수 있는지 확인하세요.
- /집/
- /홈/테스트사용자/
- /home/testuser/lty.sh
- /home/testuser/ltylog.txt
보안에 관심이 없다면 원격 서버의 콘솔에 간단히 입력하면 됩니다.
chmod 777 -R /home/
또는 각 파일을 수동으로 검사하여 권한이 올바르게 설정되었는지 확인할 수 있습니다.