web-dev-qa-db-ja.com

「stdinは端末ではないため、擬似端末は割り当てられません。」の対処方法

ssh -t remotehost vim /tmp/x.txt

上記のようなコマンドを実行できることを知っています。

しかし、リモートマシンでローカルbashコードを実行できるようにしたいと思います。このため、リモートのbash -sを呼び出して、ローカルのbashコードを処理できるようにします。

ssh -t remotehost 'bash -s' <<< vim /tmp/x.txt

ただし、上記の例は「stdinは端末ではないため、擬似端末は割り当てられません」と示しています。 sshにstdin経由でローカルのbashコードを取得させ、リモートの「bash -s」経由で実行する方法はありますか?ありがとう。

7
user1424739
ssh -t remotehost 'bash -s' <<< vim /tmp/x.txt

Sshプロセスへの標準入力がTTYではない場合、単一の-tオプションでsshを実行しているため、「疑似端末は割り当てられません...」というメッセージが表示されます。 sshは、この場合に特にそのメッセージを出力します。 -tのドキュメント の意味:

-t
擬似端末割り当てを強制します。これは、リモートマシン上で任意の画面ベースのプログラムを実行するために使用できます。メニューサービスを実装する場合。 複数の-tオプションは、sshにローカルttyがない場合でも、tty割り当てを強制します

-tコマンドラインオプションは、ssh構成オプション RequestTTY に関連しています。

RequestTTY
セッションの擬似ttyを要求するかどうかを指定します。引数は、no(TTYを要求しない)、yes(標準入力がTTYの場合は常にTTYを要求する)、force(常にTTYを要求する)、またはauto(ログインセッションを開くときにTTYを要求する)のいずれかです。このオプションは、ssh(1)の-tおよび-Tフラグをミラーリングします。

単一の-tは "RequestTTY yes"と同等ですが、そのうち2つは "RequestTTY force"と同等です。

リモートコマンドをTTYで実行する場合は、-tを2回指定します。

ssh -tt remotehost 'bash -s' <<< vim /tmp/x.txt
or
ssh -t -t remotehost 'bash -s' <<< vim /tmp/x.txt

sshはリモートシステムにTTYを割り当て、そのメッセージを出力しません。

リモートシステムで実行されているコマンドがTTYを必要としない場合、-tオプションを省略できます。

ssh remotehost 'bash -s' <<< vim /tmp/x.txt
8
Kenster

以下があなたの目的に合っていると思います。

vim /tmp/x.txt ; ssh remotehost 'bash -s' < /tmp/x.txt

最初の式(vim ...)を使用すると、/tmp/x.txtというローカルファイルとしてリモートで実行するコマンドを指定できます。 2番目の式(ssh ...)は、リモートbashインタープリターを呼び出し、ローカルファイルの内容を送信して実行します。この場合sshには-tオプションが必要ないことに注意してください(擬似端末警告が発生します)。また、 ここで文字列を使用する必要はありません<<<)が、通常のファイル入力演算子(<)を使用できます。

この解決策は、たとえば次のファイルの内容で機能するようです:

echo These commands are being executed on $HOSTNAME
echo This is a second command
0
ngj