동일한 폴더( )에서 bash 스크립트를 실행하는 a_web_page.cgi
개발 상자에서 Perl CGI 스크립트( )를 실행 하고 싶습니다 ..1.20
host_script.sh
그런 다음 스크립트는 다른 서버에 대해 SSH 명령을 실행합니다 1.10
. 이 서버는 단순히 문자열을 반환하는 스크립트를 실행합니다.
./host_script.sh
me
내가 키의 소유자가 되는 한 script()를 수동으로 실행하면 작동합니다. (키는 테스트 목적으로 스크립트와 동일한 폴더에 저장됩니다.)
기본적으로 키의 소유자는 입니다 apache
.
문제는 apache
이 키를 사용해도 여전히 작동하지 않는다는 것입니다. 아래에 설명했습니다.
이 명령은 .(개발 상자)의 가상 머신에서 실행됩니다 192.168.1.20
. 로컬 상자에서 SSH를 통해 가상 머신에 들어갔습니다.192.168.1.50
192.168.1.10
대상 컴퓨터 및script1.sh
. 스크립트는 문자열을 반환합니다.192.168.1.20
및 를 사용하여 Apache 웹 서버를 실행하는a_web_page.cgi
서버 입니다host_script.sh
. (저는 이 상자에서 이 명령을 실행하고 있습니다.)192.168.1.50
내 로컬 컴퓨터는 실제로 고려해서는 안 되지만, 도움이 될 경우를 대비해 여기에 두십시오.
에서 192.168.1.20
:
ls-알
-rwxrwxrwx. 1 me apache 622 Apr 12 09:19 a_web_page.cgi
-rwxrwxrwx. 1 me apache 111 Apr 11 15:14 host_script.sh
-rwx------. 1 apache apache 1675 Apr 11 15:11 test
-rwx------. 1 apache apache 392 Apr 11 15:11 test.pub
vim 호스트 script.sh
#!/bin/bash
ssh -i /var/www/html/dev/remote_script/test [email protected] "/home/user/scripts/script1.sh"
a_web_page.cgi
#!/usr/bin/perl
use strict;
use warnings;
print "Content-type: text/html\n\n";
my $executeString = './host_script.sh';
my $output = `$executeString`;
print "<br />$executeString<br />: $output<br />";
산출(http://192.168.1.20/dev/remote_script/a_web_page.cgi):
./host_script.sh
:
sudo tail -f /var/log/httpd/error_log
[Tue Apr 12 10:05:22 2016] [error] [client 192.168.1.50] ssh: connect to host 192.168.1.10 port 22: Permission denied\r
(클라이언트 IP가 개발 상자가 아닌 내 로컬 상자인 이유가 혼란스럽습니다.)
구성된 경우
inet addr:192.168.1.20
(SSH 세션을 종료하여 로컬 컴퓨터에서 ifconfig를 실행하면 192.168.1.50
.)
이 단계에서 SSH가 실패하는 것을 볼 수 있으므로 직접 실행할 수 있는 권한을 192.168.1.10
부여하고 실행해 보겠습니다 .host_script.sh
sudo chown me 테스트
이것은 작동합니다.
./host_script.sh
This is a script on the 192.168.1.10 server!
(이 문자열은 script1.sh
on 에서 반환 되며 1.10
단지 echo 문입니다.)
따라서 키를 읽을 수 있는 권한이 있는 한 스크립트를 직접 실행해도 문제가 없습니다.
-rwx------. 1 me apache 1675 Apr 11 15:11 test
-rwx------. 1 me apache 392 Apr 11 15:11 test.pub
답변1
ssh 명령을 수동으로 실행할 때 비밀번호 없는 SSH를 구성했으며 ~user/.ssh에 필요한 키가 있다고 가정합니다. 웹페이지를 통해 이 프로그램을 실행하면 사용자 apache(또는 사용자 httpd)로 ssh가 실행되며, 키는 ~apache/.ssh가 사용된다. 사용자에게 비밀번호가 없는 SSH가 없으므로 "권한이 거부되었습니다".
192.168.1.50에서 웹페이지를 보고 있으므로 error.log에 표시된 대로 ssh(192.168.1.20에서 실행 중)가 192.168.1.10에 연결할 수 없다는 오류가 발생합니다. 이는 올바른 것입니다.
이 문제를 해결하는 다양한 방법:
- apache가 자신의 사용자로 ssh를 수행할 수 있도록 apache에 sudo 액세스 권한을 부여합니다. "sudo -u me -c 'ssh 192.168.1.10 'script1.sh'"와 같이 하면 apache는 sudo를 사용하여 전환합니다. 당신에게 ssh를 실행하십시오.
- Apache가 두 호스트 모두에 홈 디렉터리를 갖도록 하고 Apache 사용자에 대해 비밀번호 없는 SSH를 구성하고 모든 작업을 Apache로 수행합니다.
보안 문제가 우려된다면 웹 서비스와 같은 대체 솔루션을 찾아야 합니다.