SSH는 온라인 패킷을 암호화하는 기술을 통해 데이터를 전송할 수 있으며, 전송되는 모든 데이터는 누군가가 데이터를 가로채더라도 유용한 정보를 얻을 수 없습니다. 동시에 데이터가 압축되어 전송 속도가 크게 향상됩니다. 즉, SSH를 사용하면 데이터 전송이 상대적으로 안전하고 효율적으로 보장될 수 있습니다.
그러나 PHP가 SSH에 연결하고 원격 명령을 실행할 수 있다는 사실을 모든 사람이 아는 것은 아니지만 매우 유용합니다. PHP를 다양한 방법으로 활용할 수 있기 때문에 PHP의 동작을 제어할 수 있는 설정 옵션도 많습니다. 대규모 선택적 매개변수 세트를 사용하면 다양한 목적으로 PHP를 사용할 수 있지만 이는 이러한 매개변수와 서버측 구성의 조합으로 인해 일부 보안 문제가 발생할 수 있음을 의미하기도 합니다. 저자는 PHP CLI 애플리케이션에서 SSH를 사용해왔는데, 처음에는 별로 간단하지 않다고 할 수 있습니다. Shell2 함수의 안전한 사용에 대한 매뉴얼은 그다지 실용적이지 않습니다. 저자는 오늘 이 작은 글을 쓰기 전에 많은 실험을 했습니다. 이 매뉴얼을 읽고 나면 PHP를 구성하는 데 시간을 절약할 수 있기를 바랍니다.
이 기사에서는귀하가 실행 중인 운영 체제가 Debian/Ubuntu라고
가정합니다
.Debian/Ubuntu를 실행하지 않는 경우 이 문서의 해당 내용을 Linux 배포판에서 제공하는 패키지 관리자로 바꿔야 할 수도 있습니다.
PHP5를 실행 중입니다. PHP5를 실행하지 않는 경우 대신 PHP4를 사용할 수 있습니다.
PHP 및 서버 관리에 대한 기본적인 이해가 있습니다.
이미 PHP가 설치되어 있습니다.
필수 구성 요소
설치 패키지
먼저 다음 패키지를 설치해 보겠습니다.
sudo aptitude update
sudo aptitude install php5-dev php5-cli php-pear buid-essential
openssl-dev zlib1g-dev
설치가 완료되고 다음 단계로 이동합니다.
libssh2 컴파일
sourceforge 웹사이트에서 Libssh2를 다운로드한 후 컴파일해야 하지만 걱정하지 마세요. 다음과 같이 하면 됩니다.
cd /usr/src
wget
// 포트 22에서 server1.example.com에 로그인합니다.
if ( !($con = ssh2_connect("server1.example.com", 22))){
echo "fail: 연결을 설정할 수 없습니다n"
} else {
// 사용자 이름 root, 비밀번호 secretpassword
if(! ssh2_auth_password ($con, "root", "secretpassword")) {
echo "실패: 인증할 수 없습니다n"
} else {
//좋습니다, 로그인했습니다
!
;
// 명령 실행
if(!($stream = ssh2_exec($con, "ls -al" )) ){
echo "fail: 명령을 실행할 수 없습니다n"
} else{
// 명령stream_set_blocking
에서 반환되는 데이터 수집
( $stream, true );
$data = "";
while( $buf = fread($
stream
,4096) ){
$data .= $buf
}
}
두 번째 방법: Shell
같은 방법으로 다음 코드에 대한 함수나 클래스를 작성할 수도 있습니다. 그러나 이 문서에서는 기본 개념만 제공합니다.
if (!function_exists("ssh2_connect")) die("function ssh2_connect does not 존재합니다")
// 포트 22에서 server1.example.com에 로그인합니다.
if(!($con = ssh2_connect ("server1.example.com", 22))){
echo "실패: 연결을 설정할 수 없습니다.n";
} else {
// 사용자 이름 root, 비밀번호 secretpassword
if(!ssh2_auth_password($con, "root ", "secretpassword")) {
echo "실패: 인증할 수 없습니다.n";
} else {
//
좋습니다.
echo "알겠습니다: 로그인했습니다...n";
shell
if (!($shell = ssh2_shell($con, 'vt102', null, 80, 40, SSH2_TERM_UNIT_CHARS))){
echo "실패: 쉘을 설정할 수 없습니다n"
} else{
stream_set_blocking( $shell, true ) ;
/ / 명령 보내기
fwrite($shell,"ls -aln")
;
// 반환 데이터 수집
$data = ""
while( $buf = fread($shell,,4096) ){
$data .= $buf;
}
fclose($shell);
}
}
}
팁:
때때로 서버가 사용 중이거나 연결 오류가 발생하고 버퍼에 데이터가 없으며 PHP 스크립트의 출력이 중지됩니다. 데이터를 수집하는 명령(명령이 완료되지 않더라도!) 이를 위해 다음을 수행할 수 있습니다:
ssh2_exec($con, 'ls -al; echo "__COMMAND_FINISHED__"' );
이제 지속적으로 버퍼를 확인하는 루프에서 COMMAND_FINISHED를 살펴보세요. 그러면 모든 데이터가 있다는 것을 알 수 있기 때문입니다. 무한 루프(무한 루프)를 방지하려면 10초 제한 시간을 사용할 수 있습니다.
$time_start = time();
$data = "";
while( true ){
$data .= fread($stream, 4096) ;
if( strpos($data,"__COMMAND_FINISHED__") !== false){
echo "알겠습니다: 명령이 완료되었습니다n"
break
}
if( (time()-$time_start) > 10 ){
echo "실패: 시간 초과 10초에 도달했습니다n";
break;
}
}
위의 예에서는 stream_set_blocking을 false로 설정하는 것이 좋습니다.
SSH를 통해 파일 보내기
ssh2_scp_send($con, "/tmp/source.dat", "/tmp/dest.dat", 0644)
제대로 작동하지 않으면
다음 사항을 확인하세요.
이 문서에 따라 모든 단계를 확인하세요
. 서버측에서는
sshd_config에서 "PasswordAuthentication yes"를 활성화해야 합니다. 대부분의 서버에서 기본값은 yes이지만 경우에 따라 이 기능을 직접 설정하려면 파일에 다음 행을 추가해야 할 수도 있습니다.
/etc/ssh/sshd_config:
# 터널링된 일반 텍스트 비밀번호를 활성화하려면 yes로 변경합니다.
PasswordAuthentication yes
변경한 경우 SSH를 다시 시작해야 합니다.
/etc/init.d/ssh restart