2011-01-07 38 views
6

Tôi gặp sự cố với ssh_exec() từ chối thực hiện lệnh "cd".ssh2_exec() sẽ không thay đổi thư mục bằng "cd"

Nếu tôi đăng nhập trực tiếp vào máy chủ và thực hiện lệnh, nó hoạt động tốt, vì vậy tôi không nghĩ rằng vấn đề là với lệnh của tôi.

Mã của tôi là như sau:

$str = ssh2_exec($sshStream, 'cp /var/www/compressed.tar.gz /var/www/vhosts/demo-domain1.com/httpdocs/'); 
$errstr = ssh2_fetch_stream($str, SSH2_STREAM_STDERR); 
stream_set_blocking($str, true); 
stream_set_blocking($errstr, true); 
echo "Output: " . stream_get_contents($str); 
echo "Error: " . stream_get_contents($errstr); 

$str = ssh2_exec($sshStream, 'cd /var/www/vhosts/demo-domain1.com/httpdocs/'); 
$errstr = ssh2_fetch_stream($str, SSH2_STREAM_STDERR); 
stream_set_blocking($str, true); 
stream_set_blocking($errstr, true); 
echo "Output: " . stream_get_contents($str); 
echo "Error: " . stream_get_contents($errstr); 

$str = ssh2_exec($sshStream, 'tar xzf c-class.tar.gz'); 
$errstr = ssh2_fetch_stream($str, SSH2_STREAM_STDERR); 
stream_set_blocking($str, true); 
stream_set_blocking($errstr, true); 
echo "Output: " . stream_get_contents($str); 
echo "Error: " . stream_get_contents($errstr); 

Tôi đang đăng nhập bằng root.

Lệnh đầu tiên chạy đúng và sao chép tệp vào vị trí. Lệnh thứ hai không thực thi, nhưng không có lỗi. Lệnh thứ ba hiển thị một lỗi (rõ ràng là lệnh cd trước đó không hoạt động).

Tôi biết nó đã không thay đổi dir, như khi tôi thực hiện "pwd", nó trả về nói rằng nó vẫn còn trong thư mục gốc.

Như đã đề cập trước đây, nếu tôi chạy lệnh từ trình bao, chúng thực thi tốt, vì vậy tôi chắc chắn 99.9% cú pháp của tôi là chính xác.

Đây là một máy chủ chuyên dụng được cung cấp bởi 1 & 1, chạy CentOS và Plesk 9.

+0

gì xảy ra khi bạn thay đổi lệnh cho 'cd/var/www/vhosts/demo-domain1.com/httpdocs/|| echo "cd failed"? –

Trả lời

14

Để thực hiện ssh2_exec() PHP bắt đầu một quá trình mà sẽ thực hiện một ssh thực thi trên máy chủ từ xa.

Quy trình tạo vỏ được tạo từ xa có môi trường riêng, bao gồm thư mục làm việc hiện tại.
Lệnh cd sẽ thay đổi thư mục làm việc của shell đã được bắt đầu bằng lệnh thứ hai của bạn.

Khi lệnh thứ hai đó kết thúc, trình bao sẽ chết với nó. Cùng với các thông tin dir làm việc.

Nói cách khác, lệnh n môi trường vỏ sẽ không được ghi nhớ trong khi thực hiện lệnh n + 1.

Nếu bạn muốn các lệnh shell được làm việc thời gian tùy thuộc vào nhau về mặt môi trường, bạn nên đặt một số lệnh trong một độc đáo ssh2_exec như

$str = ssh2_exec($sshStream, 'cd /var/www/vhosts/demo-domain1.com/httpdocs/;' 
          . 'tar xzf c-class.tar.gz'); 

$errstr = ssh2_fetch_stream($str, SSH2_STREAM_STDERR); 
stream_set_blocking($str, true); 
stream_set_blocking($errstr, true); 
echo "Output: " . stream_get_contents($str); 
echo "Error: " . stream_get_contents($errstr); 
+0

Cảm ơn ring0 Điều đó hoạt động hoàn hảo :) –

+0

Các câu trả lời khác trên web rất khó hiểu, điều này làm cho nó rõ ràng lý do tại sao nó không hoạt động. Tôi đã phải đặt tất cả các lệnh của tôi trong một ssh2_exec thay vì nhiều từ khi họ theo dõi nhau. –

Các vấn đề liên quan