txtファイルからコマンドを実行する

txtファイルからコマンドを実行する

ファイルがあり、このファイルには次の行があります。

ssh [email protected]
ssh [email protected]
etc....

各サーバーで実行し、そのファイル内の各サーバーでlsコマンドを実行したいスクリプトがあります。私が今やっていることは:

while read line;
do
$line
done < $1

うまくいきますが、最初の行についてはそれ以降

stdin が端末ではないため、疑似端末は割り当てられません。間違い。

だから私は何かを見逃していることを知っていますが、ここでは少し迷子になりました。

答え1

ファイルにコマンドオプションを追加します-tssh

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.comserver1.comssh [email protected]

そのコマンドを実行するには、何らかの方法でコードを処理するls必要があります。ls2つの賢明な選択肢があります:

  • 任意のコマンドを実行するには、コマンド全体を入力ファイルに入れます。

    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。この習慣を育てろ変数置換の周りに二重引用符を追加する

    より良いサービスを受けることができます複数のコンピュータで同じコマンドを実行するためのフレームワーク

関連情報