SSH - 端末オーバーライドリダイレクトの入力プロンプトを印刷する

SSH - 端末オーバーライドリダイレクトの入力プロンプトを印刷する

2つのスクリプトがあります。

  • test_input.shSSHを介して実行されるスクリプトです。このスクリプトでは、ユーザーに何かを入力するように求めます。
  • test_ssh_connection.shlocalhostスクリプトをリンクして実行するスクリプトです。test_input.sh

test_ssh_connection.sh出力をtest_input.shファイルにリダイレクトしたいのですが、プロンプトを見ることtest_input.shができるので、画面に入力プロンプトを表示したいと思います。

これは私のものですtest_ssh_connection.sh

echo "Connecting to localhost and executing an input script."
ssh "localhost" "sh test_input.sh" >> "test.txt"

これはtest_input.sh

echo -n "Give me a value: "
read value
echo "You gave me [${value}]."

test.txt実際に実行後の内容は次のとおりですtest_ssh_connection.sh

Give me a value: You gave me [asd].

現在、プロンプトGive me a value:は端末にのみあり、test.txt端末にはありません。代わりに私が望むものはそれを端末に表示し、可能であればtest.txt

見つけました。これ>/dev/tty質問がありますが、ssh /を介して呼び出すと添え字が機能しないようです>$(tty)

答え1

このため、アプリケーションの通常の出力に属さないプロンプトやその他の対話型メッセージは通常、標準エラーストリームに書き込まれます。たとえば、デフォルトのプロンプトはシェルの標準エラーストリームに書き込まれます。

次のコマンドが与えられると、readユーティリティはbash標準エラーメッセージを表示します-p

#!/bin/bash

read -r -p 'Give me a value: ' value
printf 'You gave me [%s].\n' "$value"

あなたに/bin/sh似た仕事をしてください

#!/bin/sh

printf 'Give me a value: ' >&2
read -r value
printf 'You gave me [%s].\n' "$value"

リダイレクトは>&2出力をprintf標準エラーにリダイレクトします。

関連:


あなたは文章を書きたいですか?TTYで直接接続次に、これら2つのバリエーションのうち2番目のバリエーションを使用し、リダイレクトを介してメッセージを表示します>/dev/ttyssh -tこれを行うには、疑似TTY割り当てを使用する必要があります。また、これはプロンプトで標準エラーを使用しないため、かなり一般的な習慣が壊れます。

関連情報