3

stdoutをファイルにリダイレクトする方法を知っていますが、stdoutをプロセス(Linux環境)にリダイレクトすることは可能ですか?

たとえば、アクティブなSSHセッションを「〜^ Z」を介してバックグラウンドに移動した場合、ローカルホストで別のプログラムを起動し、そのstdoutをSSHセッションにリダイレクトする方法はありますか?

ありがとう!

4

1 に答える 1

3

時々のようなトリック

echo "something" > /proc/pid-of-process/fd/0

動作しますが、疑似端末にリンクされている場合は動作しません。

だから、これがあなたがやりたいことをする一つの方法です。

  1. **証明書/パスワードなしのログインを使用するようにSSH接続を構成します。
  2. 名前付きパイプを作成します(例mkfifo mypipe
  3. tailを使用してパイプから読み取り、それをSSHプロセスに渡します。例:

    tail -f mypipe | ssh -t -t user@somehost.com

  4. sshセッションに参加したいものはすべて、名前付きパイプに送信します。例:

    echo "ls -l" > mypipe

    したがって、別のプログラムからのものをパイプする必要がある場合は、

    ./my-program > /path/to/mypipe

  5. 完了です。

いくつかのメモ:

  1. **はオプションですが、入力しない場合は、SSHセッションを開始する端末でパスワードを入力する必要があり、パイプを通過させることはできません。実際、試してみると、SSH接続が完了すると、パイプを通過したプレーンテキストとして表示されます。
  2. SSHセッションは、名前付きパイプと同じくらい安全になりました。ただ頭を上げてください。
  3. 接続すると、発信元端末からSSHセッションを使用できなくなります。名前付きパイプを使用する必要があります。
  4. 元のターミナルでSSHプロセスをctrl+cすることで、SSHプロセスを強制終了し、ターミナルの機能を復元できます。
  5. すべての出力は元の端末に表示されます-おそらく明らかですが、私はそれを指摘したかっただけです。
  6. パイプが空のときにSSHプロセスがEOFを受信しないようにするには、toの-fオプションが必要です。tailパイプが閉じるのを防ぐ方法は他にもありますが、これが私の意見では最も簡単です。
  7. ttyの割り当て-t -tを強制するオプションssh。そうしないと、stdinがパイプされているため、文句を言います。
  8. 最後に、あなたがやりたいことをするためのより良い方法がほぼ間違いなくあります-これが深刻な/長期的なものである場合は、それを見つけることを検討する必要があります。
于 2012-09-01T00:02:40.497 に答える