私は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回)を入れる必要があります。
年齢を探しましたが、何も見つかりません。これに関するいくつかの助けに本当に感謝しています。この投稿の長さについても申し訳ありません。:)
乾杯
ジョー