これは私のスクリプトです。ここでは、ユーザーが指定したパスにあるファイルを一覧表示するために使用しています。サーバーにログインしますが、ファイルはリストされません。誰でもわかりますか?
#! /bin/bash
echo "Please give correct path"
for HOST in $(cat servers.txt ) ; do
ssha $HOST < List.sh
done
catlist.sh
#!/bin/bash
echo "Enter the path to list the files"
read $path
ls -lrt
答え1
問題はstdinを介してスクリプトを渡しますが、スクリプト自体はstdinから読み取ろうとすることです。 stdinから渡されるスクリプトに引数を渡すには、コマンドライン引数を使用し、必要に応じて外部ループのstdinから読み取られた引数を使用することをお勧めします。
2番目の問題は、呼び出し構文がread
間違っていることです。 (なしで変数名が必要です。)また、に$
渡そうとします。それ以外の場合、入力にバックスラッシュが含まれていると、不快で予期しないことが発生します。-r
read
for i in $(cat servers.txt)
3番目の問題は、あなたが望んでいる間それをやっていることです<servers.txt while read -r i
。これは一行ずつ行われます。for
ループはファイル全体をメモリに読み込むだけでなく(大きなファイルの場合は爆発する可能性があります)、個々の行にスペースがあると失敗します。
答え2
ここにはいくつかの問題があると思います。そのうちの1つは、リモートサーバーのsshセッションでユーザーにメッセージを表示したいが、stdinを介してスクリプトをsshセッションにリダイレクトするため、割り当てられた端末がなく、ユーザーが次のタスクを実行する機会が少ないことです。答える。
それからそれを読みますが、stdin
これは実際にはスクリプトの残りの部分を含むストリームなので、ユーザー入力ではなく実行したい行から読み取ることです。
$path
その後、変数を読み取るパラメータに拡張しようとしますが、$
変数名のみを提供するため、変数を拡張しないでください(変数を設定した場所と同じように)。 。
最後に、コマンドにパスを使用しようとしないでくださいls
。
この場合、スクリプトを実行する前にユーザーにメッセージを表示する方が良い場合があります。それは次のとおりです。
while read -r host; do
read -p "Enter the path to list the files: " path
ssh $HOST ls -lrt $path
done < servers.txt