2012-02-24 3 views
3

PHP 스크립트에서 SSH를 통해 원격 서버에서 명령을 실행하려고합니다. 내가 명령 줄에서 실행할 경우이 일반 로그인 쉘과 사용자 자신의 SSH를 디렉토리로 실행중인 때문에.ssh 디렉토리를 만들지 않고 ssh 명령을 실행할 수 있습니까?

$ssh_command = "ssh -F keys/config -o UserKnownHostsFile=keys/known_hosts -i keys/deployment_key -p $ssh_port $r 
    $git_fetch = "git --git-dir=$remote_path/.git --work-tree=$remote_path fetch 2>&1"; 
    exec("$ssh_command '$git_fetch' 2>&1", $out); 

스크립트는 잘 작동 : 다음 코드 조각입니다. 웹 인터페이스를 통해 스크립트를 실행하려고하면 SSH가 Apache 사용자의 홈 디렉토리에 .ssh 디렉토리를 만들 수 없기 때문에 스크립트가 실행되지 않습니다.

.ssh 디렉토리없이 SSH를 사용할 수 있습니까 아니면 Apache 사용자로 SSH를 실행하는 다른 방법이 있습니까? 나는 아파치 사용자를위한 .ssh 폴더를 만들지 않기를 바랄 것이다.

+0

나는 당황합니다. 취향과는 다른 이유가 있습니까? 아파치 프로세스로부터 특정 요청을 받고 응답을 제공하는 다른 사용자 계정으로 실행되는 서비스 내에서 SSH를 분류하는 것은 실제로 가치가 있습니까? – minopret

+0

PHP SSH2 라이브러리를 사용하고 싶지 않은 주된 이유는 PECL을 전혀 다루고 싶지 않았기 때문입니다. 받아 들여진 응답에있는 해결책은 좋은 생각이다, 나는 생각한다. – Rafe

답변

3

나는 phpseclib, a pure PHP SSH implementation와 함께 할 것 :

<?php 
include('Net/SSH2.php'); 

$key = new Crypt_RSA(); 
//$key->setPassword('whatever'); 
$key->loadKey(file_get_contents('privatekey')); 

$ssh = new Net_SSH2('www.domain.tld'); 
if (!$ssh->login('username', $key)) { 
    exit('Login Failed'); 
} 

echo $ssh->read('[email protected]:~$'); 
$ssh->write("ls -la\n"); 
echo $ssh->read('[email protected]:~$'); 
?> 

유일하게 다른 것은 나는 그들이 PHP SSH 라이브러리는 PECL 확장 기능입니다 말할 때 참조 명을 상상할 수있다. 나는 개인적으로 꽤 나쁘게 작성된대로 그것을 사용하는 것에 대해 권하고 싶습니다. 설치하기가 어렵고 따로 지원하지 않으면 공개 키와 개인 키를 제공해야합니다. phpseclib는 개인 키 만 필요합니다. 이는 개인 키가 일반적으로 포함 된 공개 키를 포함하기 때문에 의미가 있습니다. PECL SSH2 확장은 별도로 추출해야합니다. 이는 어리석습니다.

phpseclib는 PECL SSH2 라이브러리보다 더 많은 형식을 지원합니다. phpseclib는 PuTTY 키 형식, XML 서명 키 등을 지원합니다.

0

아니요, OpenSSH 클라이언트를 사용할 때 사용자의 집에 .ssh가 필요합니다. 이를 방지 할 수있는 방법이 없습니다. 통합 설정이 포함되어 있기 때문에 보안 기능을위한 것입니다. 빈 더미 디렉토리 만 유지하면 클라이언트는 거기에 쓰지 않습니다. 그러나 적절한 사용자 권한이 있어야합니다.

+0

PHP SSH2 라이브러리를 사용하는 경우에도 필요합니까? – Rafe

+1

AFAIK 이러한 제한없이 SSH2 라이브러리를 사용할 수 있습니다. 즉, 그것은 해결책이 될 것입니다. –

3

하나의 작은 문제/부작용으로이 제한을 피할 수 있습니다.

옵션 UserKnownHostsFile=/dev/nullStrictHostKeyChecking=no을 설정하면 실제로 호스트 키를 저장하거나 검증 할 필요가 없도록 SSH를 속일 수 있습니다.

으로 설정하면 StrictHostKeyChecking을 no로 설정하면 키를 처음 알거나 확인하지 않고 서버에 연결할 수 있습니다. /dev/nullUserKnownHostsFile으로 사용하면 아무 것도 읽지 않고 씁니다. 따라서 저장된 값은 읽히지 않습니다.

SSH가 여전히 .ssh 디렉토리를 만들려고 시도했지만 실패하면 경고 메시지가 표시되고 연결이 계속됩니다. 경고는 출력에 포함됩니다 (경고를 표시하지 않는 한).

다음은 예입니다. 참고 :이 예에서는 인증을 설정하지 않았으므로 비밀번호 인증을 사용하려고했지만 실패합니다. 그러나 ID를 사용하고 있으므로 정상적으로 연결해야합니다.

<?php 
$ssh_command = "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no " 
       ."-p 2223 [email protected]"; 

exec("$ssh_command ls 2>&1", $out); 

var_dump($out); 

// output when called from browser running as daemon(1) 
array(5) { 
    [0]=> 
    string(44) "Could not create directory '/usr/sbin/.ssh'." 
    [1]=> 
    string(110) "Warning: Permanently added '[host.localdomain]:2223,[192.168.88.20]:2223' (RSA) to the list of known hosts." 
    [2]=> 
    string(36) "Permission denied, please try again." 
    [3]=> 
    string(36) "Permission denied, please try again." 
    [4]=> 
    string(82) "Received disconnect from 192.168.88.20: 2: Too many authentication failures for user" 
} 

귀하의 출력은 출력 다음에 대해 영구적으로 알려진 호스트 (/dev/null)의 목록에 호스트를 추가 경고 다음에 .ssh 디렉토리를 만들 수없는 경우에 대해 최초의 경고를, 가장 가능성이 포함됩니다 당신의 명령에서; 첫 번째 줄이이 경고인지 확인하고 $out 배열로 이동해야합니다.

또 다른 참고 사항 : 악의적 인 서버에 연결하려고 시도하는 사람 - 중간 공격 또는 DNS/IP 해킹의 가능성을 열어줍니다.

이 문서는 시만텍의 SSH Host Key Protection에 있습니다.

+1

known_hosts 파일의 위치를 ​​수동으로 지정할 수도 있습니다. 이를 통해 중간자 공격에 취약성을 열지 않고 기본 위치를 피할 수 있습니다. – Rafe

0

해결책 :

이렇게하지 마십시오. 필자는 수년 동안 PHP를 사용하지 않았지만 모든 현대적인 범용 프로그래밍 언어에서 이것은 거대한 WTF가 될 것입니다. PHP SSH2 라이브러리 사용에 대해 한 사용자가 익숙한 것을 보았습니다 ... 이것이 바로 IMHO가 될 것입니다.

명령을 실행하기 위해 쉘로 점프 아웃하면 결과가 중요하지 않은 부작용이 발생할 때만 발생해야합니다.중요한 일에 의존하거나 명령의 결과가 어떤 식 으로든 프로그램 상태를 수정해야하는 경우이를 처리 할 내부 라이브러리를 찾아 보거나 적절한 C 언어를 통해이를 올바르게 수행 할 언어를 확장해야합니다 라이브러리. 그렇지 않으면, 당신은 상처의 세계를 위해 스스로를 준비하고 있습니다.

0

문제는 SSH가 찾는 첫 번째 것이 사용자의 구성 파일이라는 것입니다. -F 플래그를 사용하여 자신의 구성 파일의 위치를 ​​지정할 수 있습니다.이 파일은 문제를 해결해야하지만 현재 작업을 서두르고 있습니다. 따라서이 설정을 두 번 확인하지 않았습니다. ID 파일 인 & c.와 같은 다른 것들의 위치를 ​​지정해야합니다. 파일에 올바른 소유권과 사용 권한이 필요하거나 SSH가 불평 할 것입니다.

즉, SSH2와 같은 SSH 라이브러리를 사용하는 것이 가능하다면 포격하는 데 훨씬 뛰어난 해결책입니다.

+0

그래, 실제로 다른 곳에서 설정 파일을 찾는다 고 말하면 실제로 그것을 만들고 싶어. – Rafe

0

~/.ssh가 HOME 환경 변수를 사용하여 착륙 할 위치를 제어 할 수 있습니다. 그렇게하면 Apache가 제공하는 디렉토리가 아닐 수 있습니다.

관련 문제