• 締切済み

phpのssh2_auth_pubkey_file

linuxで自宅サーバーを建てています。 この度、phpで外部のsshサーバーへphpでアクセスする必要に迫られたので、やってはみたのですが、どうにもうまくいきません。。 phpinfo()では、 SSH2 support     enabled extension version 0.11.0-dev libssh2 version 1.0 banner SSH-2.0-libssh2_1.0 remote forwarding enabled hostbased auth     enabled polling support enabled publickey subsystem enabled と、sshは使えるようになっています。 実際にスクリプト内で $conn = ssh2_connect($host, 22, array("hostkey" => "ssh-rsa, ssh-dss")); を実行すると、trueが帰ってきます。 ですがそのあとに、 $pub = ssh2_auth_pubkey_file($conn, "username", "public.ppk", "private.ppk", "path"); をスクリプト内で実行すると、 Warning: ssh2_auth_pubkey_file() [function.ssh2-auth-pubkey-file]: Authentication failed for username using public key in /var/www/html/user/test.php on line 50 とエラーが出ます。結果はもちろんfalseになります。 public.ppkのエラーのように見えるのですが、、、WinSCPというソフトを使い、public.ppkとprivate.ppkもそのまま同じものを使って接続ができます。 ググってはみたのですが、どの時点でエラーになっているのか見当がつきません。。。 お分かりの方があられましたらどうぞお知恵をお貸し下さい。よろしくお願いします。

  • PHP
  • 回答数1
  • ありがとう数0

みんなの回答

noname#138894
noname#138894
回答No.1

そのプログラムはどうやって作動していますか? ブラウザから叩くような感じだと、 実行ユーザがapacheになってしまい、そのままの設定ではユーザの秘密鍵を使えないと思いますよ。 具体的には http://www.doyouphp.jp/tips/tips_ssh2.shtml の下半分くらいに解決策が説明されています。

関連するQ&A

  • iMac(OSX10.6.6)でのSSH接続の方法

    お世話になります。 先日までWin7のTeratermでSSH接続していたのですが、iMacにマシンが変わってからSSH接続の方法がわかりません。 現在ターミナルから.ssh内にWin7からもってきたpubkey.pub(鍵)を設定して接続をこころみていますが、なかなかつながりません。 エラーは、 Permission denied (publickey,gssapi-with-mic). になっています。 Win7ではTeratermのショートカット(エイリアス?)をつかって、 "C:¥Program Files (x86)¥teraterm¥ttermpro.exe" hostname:22 /ssh /1 /auth=publickey /keyfile=C:/pubkey.pub /user=hoge /passwd=hogehoge /KR=UTF8 /KT=UTF8 みたいな感じで接続していました。 ssh-keygenから鍵を作成してSSH側に設定するということが現在権限がなくてできないのですが、pubkeyのみでWin7からMacに移行できる方法があればおしえてください。 chmod 700 .ssh/ chmod 600 .ssh/pubkey.pub とパーミッションも大丈夫です。 現在Macターミナルから、 ssh -p 22 hoge@hostname -i ~/.ssh/pubkey.pub とやろうしています。 また、ちょっと理論的にはっきりとわかっているわけではないので、やや混乱しておりますが、クライアント(リモート側)がSSH接続に必要なものは(設定にもよりますが…)公開鍵だけでよいのでしょうか?以前のWin7では公開鍵とパスワードのみで接続していたと認識しています。 よろしくお願いします。

  • Basic認証: PHP_AUTH_USERが

    環境:CentOS6.3, PHP Version 5.3.3, Apache/2.2.15 (CentOS) ,MySQL Server version 5.1.61 (Client API versionも同じ) です。テーブルmembers にname,password の2欄があり、データがそれぞれ、taro , abc と入っています。  ここで phpを下記のように書きました。 1 <?php 2 // データベースに接続      中略 7 8 // 認証処理(Basic認証) 9 if (!isset($_SERVER["PHP_AUTH_USER"])) { 10 header("WWW-Authenticate: Basic"); 11 header("HTTP/1.0 401 Unauthorized"); 12 exit; 13 }else{ 14 var_dump(($_SERVER)." --line_a"."<br />"); 15 print ("ユーザ名:". $_SERVER['PHP_AUTH_USER']." --line_b"."<br />"); 16 17 // 入力されたアカウントが正しいかチェック 18 $result = mysql_query( "SELECT COUNT(id) AS rows FROM `account` WHERE name = $_SERVER [ 'PHP_AUTH_USER' ] AND password = $_SERVER ['PHP_AUTH_PW' ]", $conn); 19 20 echo( $_SERVER [ 'PHP_AUTH_USER' ]."-".$_SERVER ['PHP_AUTH_PW' ]."--line_c"."<br />"); 21 echo($result."--line_d"."<br />"); 以下略 これでブラウザから認証を経てログインすると、 string(20) "Array --line_a " ユーザ名:taro --line_b taro-ptaro--line_c --line_d となって、$result に値が入りません。 18行の WHERE句を外し、 $result = mysql_query( "SELECT COUNT(id) AS rows FROM `account`", $conn) or die("result取得エラー") ; とすると、 string(20) "Array --line_a " ユーザ名:taro --line_b taro-abc--line_c Resource id #3--line_d となり、$result にResource id #3 が返ります。 WHERE句で name = 'taro'  を指定し、 $result = mysql_query( "SELECT COUNT(id) AS rows FROM `account` WHERE name = 'taro' ", $conn) or die("result取得エラー");  とすると、 string(20) "Array --line_a " ユーザ名:taro --line_b taro-abc--line_c Resource id #3--line_d となり、やはり、$result にResource id #3 が返ります。password を追加し、WHERE name = 'taro' AND password = 'abc' としても、Resource id #3--line_d と出ます。 ところが、18行の taro を $_SERVER [ 'PHP_AUTH_USER' ] に置き換え、 $result = mysql_query( "SELECT COUNT(id) AS rows FROM `account` WHERE name = $_SERVER [ 'PHP_AUTH_USER' ] AND password = 'abc'", $conn) or die("result 取得エラー") ; string(20) "Array --line_a " ユーザ名:taro --line_b result 取得エラー となって、$result に値が入りません。 $_SERVER [ 'PHP_AUTH_USER' ] を’’で囲んでも同じ。 何故でしょうか? どのようにすれば不具合の解決ができるでしょうか?

    • ベストアンサー
    • PHP
  • PEAR auth で認証ができません

    PHP初心者で、PEAR Authによるsqliteを使用して認証のテストを行っています。 コード: <?php require_once "Auth.php"; function loginFunction() { echo "<form method=\"post\" action=\"test_auth.php\">"; echo "<input type=\"text\" name=\"username\">"; echo "<input type=\"password\" name=\"password\">"; echo "<input type=\"submit\">"; echo "</form>"; } $dsn = array( 'phptype' => 'sqlite', 'database' => 'test.sqlite', 'mode'=>'0644' ); $options = array( 'dsn' => $dsn, 'table'=>"schedule_usr", 'usernamecol'=>"username", 'passwordcol'=>"password" ); $a = new Auth("DB", $options, "loginFunction"); $a->start(); if ($a->checkAuth()) { print("認証しました。"); }else{ print("認証していません。")); } ?> エラーなどは表示されませんが、「認証しました」が表示されません。 test.sqliteではschedule_usrテーブルに username=test password=1111を 入力してあります。パスワードはmd5()で変換したものを入れてありますが、 「認証していません」が表示されてしまいます。 コード自体に問題があるのでしょうか? ご教示願います。

    • ベストアンサー
    • PHP
  • Auth認証エラー

    Auth認証をするとログインには成功するものの下記のようなエラーが出てしまいます。解決策はございませんでしょうか。ご教授願います。 Warning: session_regenerate_id() [function.session-regenerate-id]: Cannot regenerate session id - headers already sent in /usr/local/php5/php/Auth.php on line 810 Warning: Cannot modify header information - headers already sent by (output started at /home/sites/heteml/*****/*/*/*/*****/****/*****/*****/index.php:8) in /usr/local/php5/php/Auth.php on line 838 ちなみにphpファイルは下記を実行しています。 <?php require_once("Auth/Auth.php"); function loginFunction($username, $status, $auth){ if ($status == AUTH_WRONG_LOGIN){ print("ユーザー名又はパスワードが間違っています<br>"); } print("<form method=\"post\" action=\"index.php\">"); print("<table>"); print("<tr>"); print("<td>ユーザー名</td>"); print("<td><input type=\"text\" name=\"username\"></td>"); print("</tr>"); print("<tr>"); print("<td>パスワード</td>"); print("<td><input type=\"password\" name=\"password\"></td>"); print("</tr>"); print("<tr>"); print("<td colspan=\"2\"><input type=\"submit\"></td>"); print("</tr>"); print("</table>"); print("</form>"); } $params = array( "dsn" => "mysqli://authuser:authpass@localhost/authdb", "table" => "authtable", "usernamecol" => "username", "passwordcol" => "password" ); $authobj = new Auth("DB", $params, "loginFunction"); $authobj->start(); if ($authobj->getAuth()){ echo 'ログイン済み'; }else{ echo '未ログイン'; } ?> 補足ですが、サーバーはヘテムルを使用しています。

    • ベストアンサー
    • PHP
  • phpでファイルをアップロードできるか?

    phpでのファイルアップロードについて質問します。 再質問となりますが、実際にコードを作成してやってみてうまくいかないので、 あらためて質問させていただきました。 eラーニング教材(htmlで作成)で、動画ファイルをストリーミングさせることになりました。 ウェブサーバ側へのアップロードする画面として、move_uploaded_file()やis_uploaded_file()メソッドをつかっていましたが、ストリーミングサーバ側としてFTP通信でポート20、21からのみのアップロードのみ許可されているとのことです。 ftp_put()メソッドを使ってアップロードさせたところうまくいきません。 **************<コード>************* $ftp_server="【サーバー名】"; $ftp_user_name="【アカウント名】"; $ftp_user_pass="【パスワード】"; $conn_id = ftp_connect($ftp_server); $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); if ((!$conn_id) || (!$login_result)) { echo "FTP接続に失敗しました。"; exit; } else { echo "FTP接続に成功しました。"; } ここまででFTPの接続はできているようです。 その直後に、 $local_file="【ローカルのファイルパス】"; $remote_file="【FTPサーバー上のアップロードファイルパス】"; if (!ftp_put($conn_id, $remote_file, $local_file, FTP_BINARY)) { echo "FTPアップロードに失敗しました。"; exit; } else { echo "FTPアップロードに成功しました。"; } **************<コード>************* FTPアップロードに失敗します。 原因がわからなく、こまっています。 ポートの指定が必要なのでしょうか? おしえてください。 よろしくおねがいたします。 **************** FTP supportはenabled になっています。 phpのバージョンは4または5です。 IE7以上のブラウザ環境を想定しています。

    • ベストアンサー
    • PHP
  • pear のAUTHでsetAuthDataで登録できません 教えてください

    サンプルで ログインできたときに ポイント入れようとしてるのですが setAuthdata でできるのではと思ったのですが 1:<?php 2:require_once "Auth/Auth.php"; 3:function drawLogin($username, $status, $objAuth) { 4: if (isset($_SERVER)) { 5: $server = $_SERVER; 6: } 7: else { 8: $server = $GLOBALS['HTTP_SERVER_VARS']; 9: } 10: echo '<form method="post" action="' . $server['PHP_SELF'] . '">' . "\n"; echo '<label for="username">ユーザー名:</label>'; echo '<input type="text" name="username">' . "\n"; echo '<label for="password">パスワード:</label>'; echo '<input type="password" name="password">' . "\n"; echo '<input type="submit" value="ログイン">' . "\n"; echo '</form>' . "\n"; } $params = array( 'dsn'=>"mysql://sample:password@localhost/test", 'table'=>"pear", 'usernamecol'=>"username", 'passwordcol'=>"password", 'cryptType'=>"md5", 'db_filds'=>"*" ); $objAuth = new Auth("DB", $params,"drawLogin"); $objAuth->start(); if($objAuth->getAuth()) { echo "ようこそ!" . $objAuth->username . "さん<br>"; // メールアドレスを取得。// $objAuth->setAuthData("point",10); } ?> こんな感じでいいのかと思いつくりました データーベースに書き込みされません エラーはでないのですが 教えてください お願いします

    • ベストアンサー
    • PHP
  • php file() で外部サーバのファイルを読もうとするとWarni

    php file() で外部サーバのファイルを読もうとするとWarning: file(http://xyz.・・・エラーとなる。 いつもお世話になります。 phpで $csvscj='http://xyz.・・・';  //参照テキストファイル名 $FielList = implode('', file($csvscj,FILE_SKIP_EMPTY_LINES)); とすると、 Warning: file(http://xyz.・・・ というエラーが発生するようになりました。 file()で読み込むファイルがローカルPCの内部だとこのようなエラーは発生しません。 phpは、xampを個人のPCへインストールして使用しています。 この、phpのスクリプトをホームページを公開しているサーバーへアップして実行するとエラーは発生しません。 また、xampがインストールしてある別のPCでこのスクリプトを実行してもエラーは発生しません。 つまり、ある特定の機種のみで外部ファイルを読み込もうとするとエラーが発生するようになってしまいました。 「なってしまいました。」というのは今までこのようなことはありませんでした。 エラーが出るようになった機種を1ヶ月程使わないでいたらエラーが出るようになりました。 このエラーが出るようになったPCのどこが変わったのかわかりません。 解決の糸口となるようなことでも構いません。 おわかりになる方みえましたらよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • AUTHのフォーム認証で認証されない原因がわかりません

    AUTHを使いフォーム認証を試みていますが、 AUTH_WRONG_LOGINが返ってきます。 なぜ、認証されないのか原因が全くわかりません。 (単純入力ミス、パスワードのmd5による暗証値等の登録ミスではありません。) 以下がコードですが、コードに不適当な個所があればご指摘いただければと思います。 また、コードに問題がないようであれば、原因として何が考えられるか助言 をいただければと思っています。 (1)認証フォーム <html> <head> <title>ログインページ</title> </head> <body> <form method="POST" action="<?php> print($_SERVER['PHP_SELF']) ?>"> <table border="0"> <tr> <th align="right">ユーザID:</th> <td><input type="text" name="username" size="15" maxlength="20" /></td> </tr> <tr> <th align="right">パスワード:</th> <td><input type="password" name="password" size="15" maxlength="20" /></td> </tr> <tr> <td colspan="2"> <input type="submit" value="ログイン" /> </td> </tr> </table> <font color="red"><?php print($err); ?></font> </form> </body> </html> (2)認証コード <?php function loginFunction($usr,$status){  switch($status){   case AUTH_IDLED :   case AUTH_EXPIRED :    $err='ログイン期限が切れています。再ログインしてください';break;   case AUTH_WRONG_LOGIN :    $err='ユーザID/パスワードが間違っています。';break;   case AUTH_METHOD_NOT_SUPPORTED :    $err='認証方法が未サポート';break;   }   require_once('loginForm.php');   }   $params=array(    'dsn'=>'uri:file://XXXXX\XXXX.dsn',    'table'=>'login', 'usernamecol'=>'username', 'passwordcol'=>'password', 'db_fields'=>'*'); $myAuth=new Auth('DB', $params, 'loginFunction'); $myAuth->start(); if(!$myAuth->getAuth()){ exit(); } ?> .htaccessを使用し、認証コードが逐次実行されるようにしています。 [PHP使用環境] PHP=5.1.6 OS=Windows2000 PRO webserver=apatch2.0 [DB環境(リモートサーバ)] DB=MS SQL Server2000 OS=Windows2003 server R2 説明不足等がありましたら、ご指摘ください。

    • ベストアンサー
    • PHP
  • CGI版PHPでのFTPの使用について

    現在、RedhatLinux6.2J,PostgreSQL7.1,php-4.0.4-pl1という環境でCGI版PHPを使用しています。 ftp()を使用しているのですがなかなかうまくいかず困っています。 現在下記の様なソースをPHPマニュアルからもってきて動かしています。 ==================================================================== #! /usr/local/bin/php -q <? $ftp_server = "ftpサーバーのIP"; $user = "username"; $pass = "passwd"; $conn_id = ftp_connect("$ftp_server"); $login_result = ftp_login($conn_id, $user, $pass); if ((!$conn_id) || (!$login_result)) { echo "Ftp connection has failed!"; echo "Attempted to connect to ".$ftp_server." for user ".$user; die; } else { echo "Connected to ".$ftp_server.", for user ".$user; } $local_file = "test.txt"; $remote_file = "up.txt"; $upload = ftp_put($conn_id, $remote_file, $local_file, FTP_ASCII); if (!$upload) { echo "Ftp upload has failed!"; } else { echo "Uploaded ".$local_file." to ".$ftp_server." as ".$remote_file; } ftp_quit($conn_id); ?> ==================================================================== $conn_id = ftp_connect("$ftp_server");のところで Fatal error:Call to undefined function: ftp_connect() in ./ftp_test.php on line 7 というエラーがでてしまい落ちてしまいます。 何かお分かりになる方おられましたらご教授願えますでしょうか? インストール時にしなければいけないことや php.iniファイル等で設定しなければいけない項目等ありましたらご教授お願いします。 また、passiveモードでの送受信の仕方についてもぜひご教授お願いいたします。 失礼します。

    • ベストアンサー
    • PHP
  • PHPでパースエラーが出て困ってます 初心者です

    PHP初心者でろくに調べもしずにすいません>< 今、PHPでTwitterに投稿するPHPスクリプトを作っているのですが・・・ $url = "http://twitter.com/statuses/update.xml?"; $username = $_POST["name"]; $password = $_POST["pass"]; $message = $_POST["message"] $params = "status=". rawurlencode($message); $result = file_get_contents($url.$params , false, stream_context_create(array( "http" => array( "method" => "POST", "header" => "Authorization: Basic ". base64_encode($username. ":". $password) ) ))); 5行目の所でエラーが出てしまい、投稿する事が出来ません どうしたら正常な動作をしてくれるのでしょうか? よろしくお願いします。

専門家に質問してみよう