3

私はphpseclibを使用しており、誰かがプログラムでサーバーにSSH接続してルートパスワードを変更し、パスワードを忘れた可能性のあるユーザーのパスワードを変更できるようにするいくつかのphp関数を作成する必要があります(したがって、としてログインする必要があります)根)。

libssh2を使ってみましたが、使うのが少し面倒でした。私は今、より堅牢に見えるphpseclibを見ています。しかし、私が次のように「su」コマンドを使用しようとしたとき:

echo $ssh->exec('su');

返信があります:

su: must be run from a terminal

sudoを使おうとすると:

echo $ssh->exec('sudo passwd root');

エラーが発生します:

sudo: no tty present and no askpass program specified

とにかく、suは直接sshアクセスに対して無効になっていることがわかりましたが、この記事を見てみると、次のコマンドでそれを実行できることがわかりました。

ssh -t -t -l 'username' 'host' 'su -'

それが私のラップトップ(ubuntuを実行している)から端末に入るときにとにかく私のために最終的に働いたものであり、それから私は自分のパスワードを入力し、次にrootパスワードを入力して終了しました。

上記にリンクされているサイトからの引用:

Sshコマンド(-tを使用)は、リモートsshdに、-tが指定されたときにワーカープロセスへの「疑似端末」パイプを確立するように指示します。

。sshは、stdinがターミナルである限り、これを実行します。

。ただし、sshのstdinが非終端記号の場合、
2つの-tが指定されていない限り、sshはsshdに疑似終端記号を確立するように指示しません。

エコーパスワード| ssh -t -t -l username remote_host

。したがって、-t -t(sshから)を使用して、sshdはクライアントプロセスへの疑似端末を設定します。

。クライアントは、「tty」であろうと「su」であろうと、架空の端末に接続されていることを認識できません。

エコーdummystr| ssh -t -t -l username host.com -c'' tty '

エコーパスワード| ssh -t -t -l username host.com -c'su-'

だから答えがあります。OpenBSDのようなインタラクティブクライアントsshを介してLinuxボックスで「suroot」を実行している場合は、double-tを使用します。

だから、私が上で言ったように、それは実際にターミナルから機能しました:

ssh -t -t -l 'username' 'host' 'su -'

しかし、私は本当にphpseclibを使用してこのコマンドを実行できるようにしたいと思っています。唯一のことは、exec()関数にフラグを入れる方法がわからないことです。具体的には、-tフラグ(2回)を入れる必要があります。

年齢を探しましたが、何も見つかりません。これに関するいくつかの助けに本当に感謝しています。この投稿の長さについても申し訳ありません。:)

乾杯

ジョー

4

3 に答える 3

2

呼び出して疑似端末を有効にすることができます

$ssh->enablePTY();

ログイン後、実行前。これにより、欠落している tty について不平を言うのを防ぐことができます。

于 2015-11-23T11:47:35.020 に答える
2

sudo passwd root に tty が必要な場合は、phpseclib で read() / write() を試してください。例えば。

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

$ssh = new Net_SSH2('localhost', 22);
$ssh->login('username', 'password');

$ssh->read('[prompt]');
$ssh->write("sudo passwd root\n");
$ssh->read('Password:');
$ssh->write("Password\n");
echo $ssh->read('[prompt]');
?>

実際、私はあなたの他の投稿からコピー/貼り付けているだけです: php ssh2_execは「su」コマンドを実行していません

あなたはそこで助けを得ていたように見えますが、フォローアップをやめましたか? コマンドに新しい行を追加する必要があると誰かが提案しました。あなたはそれを試しましたか?彼らはまた、phpseclib サポート フォーラムに投稿することを提案しました。私には良いアドバイスのように思えます...

于 2011-04-24T00:20:18.150 に答える
1

とりあえずphpseclibを調べましNet_SSH2た。サーバーへの接続にソケットを使用しているようです。したがって、-t2回渡す方法はありません。それはssh電話ではありません。

質問でlibssh2について言及したので、それをサポートするPEARラッパーがあり、作業が簡単になる可能性があります。コードは現在SVNのみにあります。PEARラッパーも呼び出さNet_SSH2れますが、phpseclibのものとは異なりますNet_SSH2(紛らわしい)。

ここのコードをチェックしてください:

ダウンロードするには、次のコマンドでsvnチェックアウトを実行します。

svn co http://svn.php.net/repository/pear/packages/Net_SSH2/trunk/ ./Net_SSH2

小さな例:

<?php
require_once './Net_SSH2/Net/SSH.php';
$ssh = new Net_SSH2::factory('LibSSH2', array(
    'login_name' => 'user',
    'password'   => 'pass',
    'hostname'   => 'example.org',
    'command'    => 'su -',
));
$ssh->sshExec($std_output, $std_error);
var_dump($std_output, $std_error);

それは役に立ちますか?

于 2011-04-23T17:18:40.477 に答える