
ファイルがあり、このファイルには次の行があります。
ssh [email protected]
ssh [email protected]
etc....
各サーバーで実行し、そのファイル内の各サーバーでlsコマンドを実行したいスクリプトがあります。私が今やっていることは:
while read line;
do
$line
done < $1
うまくいきますが、最初の行についてはそれ以降
stdin が端末ではないため、疑似端末は割り当てられません。間違い。
だから私は何かを見逃していることを知っていますが、ここでは少し迷子になりました。
答え1
ファイルにコマンドオプションを追加します-t
。ssh
ssh -t [email protected]
ssh -t [email protected]
etc....
からman ssh
:
-t Force pseudo-tty allocation. This can be used to execute arbi‐
trary screen-based programs on a remote machine, which can be
very useful, e.g. when implementing menu services. Multiple -t
options force tty allocation, even if ssh has no local tty.
それでもエラーが発生する場合は、次-t
のオプションを追加してください。
ssh -t -t [email protected]
答え2
標準入力からコマンドを読み込んでから実行するコマンドを実行中です。標準入力が入力ファイルに接続されているため、コマンドを実行しています。ssh [email protected]
server1.com
server1.com
ssh [email protected]
そのコマンドを実行するには、何らかの方法でコードを処理するls
必要があります。ls
2つの賢明な選択肢があります:
任意のコマンドを実行するには、コマンド全体を入力ファイルに入れます。
ssh [email protected] ls ssh [email protected] ls
入力ファイルはシェルスクリプトです。で実行するか、実行可能にして上部に
sh myscript
置きます。#!/bin/sh
複数のコンピュータで同じコマンドを実行するには、入力ファイルにコンピュータ名のみを含めるようにしてください。
[email protected] [email protected]
その後、マシン名を読み、各マシンでコマンドを実行します。
while read target comment; do ssh "$target" ls </dev/null done <"$1"
リダイレクトは、
/dev/null
リモートコマンドがコンピュータ名のリストを含むファイルから標準入力を読み取ろうとするのを防ぐためです。リストファイルの各行には、サーバー名の後に追加の単語を含めることができ、その単語は変数に埋め込まれますcomment
。この習慣を育てろ変数置換の周りに二重引用符を追加する。より良いサービスを受けることができます複数のコンピュータで同じコマンドを実行するためのフレームワーク。