0

Linux サーバーに接続していくつかのコマンドを実行しようとしています。以下は、そのコード スニペットと出力です。「ls」の出力を変数に割り当てて、さらに処理できるようにしたいと考えています。方法を教えてください。

USERNAME=root
PASSWD=abc
HOST=1.2.3.4
SCRIPT="cd /tmp/sample/; ls"
cmd="ssh -l $USERNAME $HOST $SCRIPT"
$cmd

出力: 以下のようにディレクトリを一覧表示します。

5
6
7
10
12
4

2 に答える 2

1

ls 出力を解析するべきではありません

このプロセスを本当に実行する必要がある場合は、bash を使用するのが 1 つのオプションです。以下のソリューションは、出力を単一の変数に格納するのではなくls、出力を行ごとに処理することに注意してください。

#!/usr/bin/env bash
USERNAME=******
PASSWD=********
HOST=127.0.0.1
SCRIPT="cd /tmp/; ls"
cmd="ssh -l $USERNAME $HOST $SCRIPT"
while IFS= read -r line 
do
    echo "$line"
done<  <($cmd)
于 2013-09-25T23:15:34.457 に答える
1

これは私にとってきちんとしていません:

SCRIPT="cd /tmp/sample/; ls"
cmd="ssh -l $USERNAME $HOST $SCRIPT"

このようにローカル コマンドとリモート コマンドを混在させると、誤解を招くことがあります。

bash を使用できる場合は、配列を使用することをお勧めします。

SCRIPT="cd /tmp/sample/; ls"
CMD=(ssh -l "$USERNAME" "$HOST" "$SCRIPT")
OUTPUT=$("${CMD[@]}")
echo "$OUTPUT"

必要に応じて、代わりに出力を行の配列として保存できます。

SCRIPT="cd /tmp/sample/; ls"
CMD=(ssh -l "$USERNAME" "$HOST" "$SCRIPT")
readarray -t OUTPUT < <("${CMD[@]}")
for A in "${OUTPUT[@]}"; do
    echo "$A"
done

追加の注意:ls出力に応じて、ファイルを行ごとに入力する必要があるかどうかを検出するのに十分賢明ですが、そうでないバージョンもあります。その場合はオプション-1を追加してください。

于 2013-09-25T23:20:49.740 に答える