2010-08-04 36 views
9

Tôi đang cố gắng tạo một tập lệnh php chạy trên thiết bị đầu cuối sẽ kết nối với máy chủ từ xa bằng ssh và truy xuất tệp. đây là mã của tôi cho đến nayĐang cố kết nối bằng ssh2_auth_pubkey_file()

#!/usr/bin/php -q 
<?php 
$cwd = dirname(__FILE__).'/'; 
$filename = 'retrive-this.file'; 
$host = 'hostip'; 

$connection = ssh2_connect($host, 22, array('hostkey'=>'ssh-rsa')); 
$methods = ssh2_auth_pubkey_file($connection, 'remoteuser', 
           $cwd.'ssh/id_rsa.pub', 
           $cwd.'ssh/id_rsa', "it's an inception"); 
var_dump($methods); 

//ssh2_scp_recv($connection, "/remote/server/path/to/$filename", $cwd.$filename); 
?> 

cho bây giờ tôi đang gặp vấn đề với các ssh2_auth_pubkey_file() chức năng, khi tôi chạy kịch bản nó sẽ trả về này:

PHP Warning: ssh2_auth_pubkey_file(): Authentication failed for remoteuser using public key in /home/tonyl/Projects/get-file-ssh.php on line 10 
bool(false) 

Các tập tin quan trọng được phép -rw-r--r-- (644). Ngoài ra, khóa công khai đã được thêm vào các khóa được cấp phép của remoteuser. Tôi có thể ssh bằng cách sử dụng lệnh ssh như bình thường, vì vậy tôi không nghĩ rằng đó là một vấn đề ủy quyền ssh, nhưng ai biết được. Tôi mới vào ssh và thư viện php ssh2.

Tôi có thể kết nối bằng cách sử dụng ssh2_auth_password() nếu tôi bật nó trong tệp sshd_config từ xa, nhưng tôi không muốn làm điều đó vì nó làm giảm an toàn khi chuyển.

Bất kỳ ý tưởng nào về những gì tôi có thể làm.

+1

dir mặc định sẽ là '.ssh', không phải' ssh', có thể đó là vấn đề? Và id_rsa thực sự là 0600, thuộc sở hữu của người dùng kết nối. – Wrikken

+0

Nếu điều này làm việc với ssh từ dòng lệnh, Điều này là gần như không thể gỡ lỗi mà không cần bước vào libssh2 với một trình gỡ lỗi. Bạn cũng có thể thử đầu tiên để chạy PHP với strace để xem nếu bạn có thể tìm thấy một cái gì đó fishy. – Artefacto

+0

Tôi ít nhất có thể xác nhận đây là thông báo lỗi _exact_ được nhận khi tệp khóa công khai/riêng tư không tồn tại. – Wrikken

Trả lời

9

Đây là lỗi đã biết trong php: không thể sử dụng khóa cá nhân được bảo vệ bằng mật khẩu trên một số kết hợp nhất định.

Xem: https://bugs.php.net/bug.php?id=58573

ssh2_auth_pubkey_file() bị phá vỡ khi các tập tin quan trọng nào được bảo vệ bằng mật khẩu VÀ libssh2 được biên soạn với libgcrypt, đó là những gì debian/ubuntu và có lẽ những người khác làm. Tôi đang làm việc trên một giải pháp cho lỗi này, nhưng nếu bạn cần làm việc này xây dựng lại libssh2 mình với OpenSSL.

Cách giải quyết có thể là lưu khóa cá nhân không được mã hóa. Để giải mã khóa:

openssl rsa -in id_rsa -out id_rsaNOPASSWORD 

và sau đó sử dụng file mà không id_rsaNOPASSWORD cung cấp các tham số thứ năm 'mật khẩu'. Nó hoạt động, nhưng bạn sẽ phải cẩn thận với tập tin khóa đã giải mã của bạn. Dù sao, mức độ bảo mật không thực sự bị ảnh hưởng nghiêm trọng, bởi vì ngay cả với một khóa được mã hóa, bạn vẫn cần phải chuyển cụm mật khẩu không được mã hóa sang hàm ssh2_auth_pubkey_file ...

Hy vọng điều đó sẽ hữu ích.

+0

Bạn chỉ có thể sử dụng http://phpseclib.sourceforge.net/. Nó không chỉ không có vấn đề này - nó hỗ trợ nhiều định dạng quan trọng hơn phần mở rộng SSH của PHP - PuTTY, PKCS8, PKCS1, XML, mật khẩu, không có mật khẩu, v.v. – neubert

0

điều này trông giống như lỗi ngay tại đây. FILE là một filepath phải không? Vì vậy, nó trông giống như /somedir/somefile.php và tất cả những gì bạn đã làm là thêm một/vào cuối .php vì vậy tôi không nghĩ rằng điều này thực sự hợp lệ. thấy http://www.php.net/manual/en/language.constants.predefined.php

$cwd = dirname(__FILE__).'/'; 

cũng có, những người khác đã gặp vấn đề với ssh2_auth_pubkey_file trở về sai trong mọi điều kiện. bạn có thể muốn gửi báo cáo lỗi. Tôi đã hy vọng sử dụng chức năng này. Tôi không biết cách sử dụng nó vì tôi không biết cách cung cấp khóa riêng.

Tôi nghĩ rằng mã bạn muốn là

if (!defined('__DIR__')) { 
    $iPos = strrpos(__FILE__, "/"); 
    define("__DIR__", substr(__FILE__, 0, $iPos) . "/"); 
} 
$cwd=__DIR__ . '/'; 

và ghi nhớ rằng khi nói đến các thư mục ở xa, bạn nên sử dụng ssh2_sftp_realpath().

dirname() đã được báo cáo là không đáng tin cậy.

+0

Mã '$ cwd = dirname (__ FILE __). '/';' Trả về đúng thư mục: '/ home/tonyl/Projects /' Tôi không nghĩ đó là vấn đề và không phải 'dirname()' vì tôi đang sử dụng nó cho thư mục cục bộ, không phải cho thư mục từ xa. Cảm ơn sự giúp đỡ mặc dù, tôi nghĩ rằng tôi sẽ xem nếu có một báo cáo lỗi về thư viện C hoặc PHP –

+0

Trong nghi ngờ chỉ sử dụng đường dẫn của bạn như thế này ->/home/user/dir/'gây ra vấn đề không phải là đường dẫn của bạn là hàm php ssh2_auth_pubkey_file. Tôi đang xếp chồng lên nhau với cùng một vấn đề về f **** – B4NZ41

+0

Các bạn có tìm được giải pháp không? Tôi đang mắc kẹt với cùng một vấn đề ở đây. Bạn có chìa khóa sử dụng một 'bí mật'? Nếu vậy, một trong những ứng cử viên có khả năng gây ra lỗi này là https://bugs.php.net/bug.php?id=58573 – MicE

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