2

これが私が達成しようとしていることです:シェルを開きます(kornまたはbashは関係ありません)、そのシェルから、ssh接続を開きたいです(ssh user@host)。ある時点で、パスワードの入力を求められるか、本当に接続したいかどうかを尋ねられる場合があります (問題のキー)。

誰かが尋ねる前に: はい、ssh2 exec 呼び出し用のプラグインがあることは知っていますが、私が取り組んでいるサーバーはそれをサポートしておらず、そうする可能性は低いです。

これが私がこれまでに試したことです:

$desc = array(array('pipe','r'),array('pipe','w'));//used in all example code
$p = proc_open('ssh user@host',$desc,$pipes);
if(!is_resource($p)){ die('@!#$%');}//will omit this line from now on
sleep(1);//omitting this,too but it's there every time I need it

次に、コンソール出力 ( stream_get_contents($pipes[1])) を読み取って、次に何を渡す必要があるかを確認しようとしました (パスワード、yes、または return'connection failed: '.stream_get_contents($pipes[1])と proc_close $p.

これにより、次のエラーが発生しました。

stdin は端末ではないため、疑似端末は割り当てられません。

したがって、ssh はphp://io-stream コンテキストで呼び出されましたが、上記のエラーのもっともらしい説明のようです。

次へ: 私は最初の SO の質問について考え、最初に bash/ksh シェルを開くことをお勧めします。

$p = proc_open('bash',$desc,$pipes);

そこから取得しますが、まったく同じエラーメッセージが表示されました.今回だけ、スクリプトは実行を停止しましたが、sshは実行されました. だから私は希望を持ち、それから愚かだと感じ、最終的には絶望的になりました。

$p=proc_open('bash && ssh user@host',$desc,$pipes);

数秒待った後、次のエラーが発生しました。

PHP 致命的なエラー: 134217728 バイトの許容メモリ サイズを使い果たしました (133693440 バイトを割り当てようとしました)

コール スタックは、最後の必死の試みでも、stream_get_contents 行を表示し続けます。

#!/path/to/bin/php -n
<?php
    $p = proc_open('bash && ssh user@host',array(array('pipe','r'),array('pipe','w')),$ps);
    if (!is_resource($p))
    {
        die('FFS');
    }
    usleep(10);
    fwrite($ps[0],'yes'."\n");
    fflush($ps[0]);
    usleep(20);
    fwrite($ps[0],'password'."\n");
    fflush($ps[0]);
    usleep(20);
    fwrite($ps[0],'whoami'."\n");
    fflush($ps[0]);
    usleep(2);
    $msg = stream_get_contents($ps[1]);
    fwrite($ps[0],'exit'."\n");
    fclose($ps[0]);
    fclose($ps[1]);
    proc_close($p);
?>

私は知っています、それは混乱していて、多くのfflush冗長性がありますが、要点は次のとおりです。私の推測では、$pipes[1] のストリームは ssh 接続を保持しているため、そのコンテンツは巨大です。私が必要とするのは、パイプ内のパイプです...これは可能ですか?私は何かが欠けているに違いありません.これが不可能な場合、パイプとは何ですか...私の推測では、proc_openコマンドがそもそも間違っていると思います(エラー: パイプが壊れています)。しかし、最初のエラーを回避する方法が本当にわかりません... 何か考えはありますか? または、上記の暴言がまったく明確でない場合は、質問をフォローアップしてください (おそらくそうではありません)。

4

1 に答える 1

1

誰かが尋ねる前に: はい、ssh2 exec 呼び出し用のプラグインがあることは知っていますが、私が取り組んでいるサーバーはそれをサポートしておらず、そうする可能性は低いです。

実際には2つあります。ほとんどのサーバーにインストールされていない PITA である PECL モジュールと、純粋な PHP SSH2 実装である phpseclib。その使用例:

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

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

echo $ssh->exec('pwd');
echo $ssh->exec('ls -la');
?>
于 2012-04-11T17:15:51.160 に答える