
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ライブラリとして使用されていますが、他の言語にも移植されています...ここでこの質問を扱うと答えが長すぎるので、他の人がそれぞれの答えでそうするようにします。
答え2
いいえ。設計上、Unix / Linuxでは、プロセスはこのようには機能しません。
あなたが望むものが何であるかを理解しているなら、このexpect
アプリは役に立ちます。読むman expect
。