1

私はbashを使い始めたばかりで、(a)デバイス名と(b)文字列に基づいて、サーバー内の特定のファイルをリモートで検索するスクリプトを作成しようとしています。私の目標は、指定されたデバイスの「文字列」を含むすべての出力を取得することです。以下のスクリプトを試してみると、ただハングします。ただし、サーバーで直接コマンドを実行すると ("grep -i "router1" /var/log/router.log | grep -i "UPDOWN")、動作します。

#!/bin/bash
#
read -p "Enter username: " user
read -p "Enter device name: " dev
read -p "Enter string: " str
while read /home/user1/syslogs
do 
 ssh "$user"@server1234 'grep -i "$dev" /var/log/"$syslogs" 2> /dev/null | grep -i "$str"'
done
4

2 に答える 2

1

このメッセージPseudo-terminal will not be allocated because stdin is not a terminalは、リモート ホストのシェルがヒア ドキュメントからリダイレクトされており、リモート ホストが実行するコマンドが指定されていないという事実によるものですstdin。つまり、リモート ホストは最初に疑似コマンドが不足しているため、対話型ログイン セッションの -terminal ( sshman ページの概要を参照してください: ) が、ヒア ドキュメントからリダイレクトされているため、そのシェルの その結果、リモート ホストは疑似端末の割り当てを拒否します。ssh ... [user@]hostname [command]stdin

この場合の解決策は、リモート ホストがヒア ドキュメントで指定されたコマンドを実行するためのコマンドとしてシェルを指定することです。

-Tシェルをコマンドとして指定する代わりに、スイッチを使用して疑似端末を割り当てる必要がないことをリモートホストに事前に伝えることができます。

一方-t、スイッチは、指定されたコマンドがリモート ホストでの対話型ログイン シェル セッションを想定している場合にのみ必要です (topまたは などvim)。

- ssh $user@server1234 <<EOF ...
+ ssh $user@server1234 /bin/sh <<EOF ...
+ ssh -T $user@server1234 <<EOF ...
于 2013-12-19T16:37:14.103 に答える
1

readコマンドの使い方が間違っているようです。引数として読み取るファイルを指定しません。read常に標準入力から読み取ります。結果としてファイルから読み取った値で何をしたいのかは明確ではありませんが、次のようなものが必要です。

read -p "Enter username: " user
read -p "Enter device name: " dev
read -p "Enter string: " str

while read fileName; do
    # Also: I'm borrowing sputnick's solution to the nested quote problem.
    ssh $user@server1234 <<EOF
        grep -i "$dev" /var/log/$fileName 2>/dev/null | grep -i "$str"
EOF
done < /home/user1/syslogs
于 2012-11-21T13:38:59.080 に答える