何らかの理由で、次のエンコードが必要な基本スクリプトがあります。
vi test_run.sh
#!/bin/sh
ssh -tt 192.168.1.20
私が実行するコマンドを実行するには:
cat test_run.sh | sh -
リモートサーバーに接続できますが、をls
押すなどのコマンドを実行できず、画面がEnterフリーズします。
答え1
ssh
それを実行するシェルの標準入力ストリームを継承します。
実行中のシェルの標準入力はssh
シェルスクリプト(パイプ)を読み取るために使用されるため、インタラクティブにcat
コマンドを実行するためには使用できませんssh
。これがセッションをインタラクティブにしよ-tt
うとする理由です(そうでなければ文句を言うでしょう)。ssh
ssh
stdin が端末ではないため、疑似端末は割り当てられません。)しかし、前述のように、使用されたストリームはユーザーのコマンドを提供し、シェルはそのストリームを使用して実際のスクリプトを読み取るので機能しません。
代わりに、通常どおりスクリプトを実行してください。
sh test_run.sh
これにより、標準入力ストリームを使用してリモートシェルセッションで対話的にコマンドを実行でき、呼び出しにはssh
まったく必要ありません。-tt
スクリプトが少し長い場合:
#!/bin/sh
ssh -tt 192.168.1.20
hostname
echo "DONE"
実行すると
cat test_run.sh | sh -
hostname
これらの両方を実行するマシンecho
は実際には離れてマシン。これは、シェルの標準入力(cat
スクリプトを含むから読み取ったストリームに接続されている)がに渡されるためですssh
。これは、スクリプトのコマンドをリモートシステムで起動されたシェルに渡すことができます(リモートシェルに入力したように)。