マルチプレクサ

マルチプレクサ

ssh別のプロセスでプロセスを操作しようとしています。私が実行している画像ssh root@XXXXとpidは12345です。 SSHセッションにコマンドを実行するように指示するプログラムを実行したいと思いますls。これを試しましたecho ls > /proc/12345/fd/0。 SSH端末はエコーを正しく表示しますが、を押した後にenterリモートシステムがコマンドを受信しないようですls

私が望むことができるものはありますか?

より具体的に言えば、私がログインしようとしているサーバーは、公開パスワードではなく、標準のSSH認証方式のパスワードでもない動的パスワードを使用しています。サーバーはotpを要求して認証します。

ベストアンサー1

私は4つの方法を考えてみました。

  • マルチプレクサ
  • SSH
  • 予想される
  • 他の方法

マルチプレクサ

以下を使用して、実行中または実行するように設定できるウィンドウtmuxに文字列またはキーストロークを送信できます。ssh

tmux new -d -s mySession
tmux send-keys -t mySession.0 "ssh root@XXXX" ENTER
tmux send-keys -t mySession.0 "ls" ENTER

接続にかかる回数やパスワード/キーが必要かどうかによってマイレージが変わることがありますが、ここでは当然です。

SSH

これは明確ではないかもしれませんが、SSH経由で直接コマンドを実行するには2つの方法があります。

  • シェルコマンドを直接使用する
ssh remote "command here"

または

ssh -t remote "command here"
  • SSHでHeredocを使用する
ssh remote << 'EOF' # can use any other marker pair/string as explained below
command
list
here
EOF

これにより、実行するタスクに対してより多くの自由が得られ、ここで見積もりを処理するのは面倒ではありません。

1つの問題は、[テキストエディタ]で区切り文字を作成するときにタグが正しく閉じられていることを確認できるように、構文強調を使用する必要があることです。heredoc特に、そのタグが区切り文字に表示されている場合は、任意の文字列を使用するか(または単に使用)長い区切り記号タグも機能します)

必要に応じて両方の方法を使用できますが、次の点に注意してください。

  • リモートシステムの各SSHプロセスのPIDを生成するので、複数のコマンドを連続して実行し、別の行またはheredocから分離することを決定した場合、ある時点でPIDが不足します。限られたVM/マシンまたはリモートリソースが不足している場合)。

  • 必要に応じてSSH接続を維持できるように、そのエントリを閉じるか、1つだけ残してください。

  • どちらのソリューションでもTERM変数が設定されていないと文句を言うことができます。次のように設定してください。

export TERM=xterm

予想される

記載されている他の答えと同様に、予測を使用できます。

#!/usr/bin/expect -f
spawn ssh remote.server.com
expect "password: "
send "passwordhere?\r"
expect "$ "
......       ##Various automated commands##
expect "$ "
send "exit\r"

あなたのマイレージはさまざまですはるかにここで与えられたexpectもの勝つ または 逃す、特にパスワードプロンプトと対話するとき...

他の方法

次のような他の方法を使用できます。

  • sendkeys~からこれリポジトリまたはxdotoolローカルリポジトリからキー/文字列を特定のウィンドウに送信することができ、このウィンドウは実行中の端末または選択したssh項目に設定できます。以下は両方の(例)構文です。
sendkey.sh "Yourwindowname" "yourstringorkey"

または/そして

xdotool type --window "window ID here" "your string here"

メモ:

時にはxdotool、および/またはsendkey他のウィンドウ/プログラムで動作する場合と動作しない場合がありますが、どちらもほとんどの端末で動作する必要があります。

1つがうまくいかない場合は、別のものを試してください。また、その目的wmctrlで好まない限り、ターゲットウィンドウのid / pid /情報を取得するにはインストールする必要がありますxprop...(すでにほとんどのディストリビューションにインストールされています)。

最後に、次のいずれかを選択できます。

  • evdev(これを言及してくれた@Forestに感謝します)
  • pyinput
  • pyautogui

これら3つは主にPythonライブラリとして使用されていますが、他の言語にも移植されています...ここでこの質問を扱うと答えが長すぎるので、他の人がそれぞれの答えでそうするようにします。

おすすめ記事