web-dev-qa-db-ja.com

パイプでSSHを介して何かを減らすにはどうすればよいですか?

muttバインディングを構成して、メールをssh呼び出しにパイプし、lessを使用して出力を表示するスクリプトを使用してリモートマシンでメールを処理しようとしています。ただし、これは機能しません。lessは、ページングなしで出力全体を提供するだけだからです。

それを絞り込もうとして、私が基本的にエミュレートしようとしているのは:

seq 1 100 | less

しかし、lessをリモートマシンで実行しています。 (私がmuttでスクリプトを呼び出すユースケースのため、seq 1 100部分(電子メールを表す)をリモートマシンで実行することも、less部分(スクリプトを表す)をローカルマシンで実行することもできません。

私が行った場合:

seq 1 100 | ssh -t REMOTE_MACHINE less

「標準入力は端末ではないため、疑似端末は割り当てられません。」という警告が表示されます。 lessは、ページングを行わずに出力を直接表示します。

私が行った場合:

seq 1 100 | ssh -t -t REMOTE_MACHINE less

lessは「ファイル名がありません(ヘルプの「--help」が少ない)」で失敗するため、入力が失われたと思います。

私も追加してみましたzsh -ic、効果なし。 リモートホストのsshが標準入力を読み取り、通常どおりにページングできるように、正しいless呼び出しは何ですか?

以下のGillesのコメントに回答するように編集します:上記の例のless呼び出しが実際の脚本。実行可能ファイルを作成した場合script.sh含む:

#!/bin/bash

exec less

そして、これをローカルマシンとリモートマシンの両方の自宅に配置すると、次のように機能します。

seq 1 100 | ~/script.sh

しかし、以下はそうではありません(-tまたは-t -tまたはどちらでもない:)

seq 1 100 | ssh REMOTE_MACHINE less
6
a3nm

コマンドを引数として渡し、-tを使用して強制的に端末を割り当てることができます。

たとえば、seqコマンドをリモートサーバーで実行する必要がある場合:

ssh $REMOTE_Host -t 'seq 1 100 | less'

seqコマンドをローカルマシンで実行する必要がある場合は、インライン文字列<<<を使用して同様のコマンドを使用できます(もちろん、引用は少し難しくなります)。

ssh $REMOTE_Host -t "less <<< \"$(seq 1 100)\""
5
oliv