これが私が達成しようとしていることです:シェルを開きます(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コマンドがそもそも間違っていると思います(エラー: パイプが壊れています)。しかし、最初のエラーを回避する方法が本当にわかりません... 何か考えはありますか? または、上記の暴言がまったく明確でない場合は、質問をフォローアップしてください (おそらくそうではありません)。