public
Authored by
PotatoGim

[Bash] Run SSH and parsing output with FIFO
Edited
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/bin/bash
set -o nounset
WPIPE=wpipe
RPIPE=rpipe
trap "rm -f $WPIPE; rm -f $RPIPE" EXIT
if [ ! -p $WPIPE ]; then
mkfifo $WPIPE
fi
if [ ! -p $RPIPE ]; then
mkfifo $RPIPE
fi
exec 3<>$WPIPE 4<>$RPIPE
################################################################################
##### 프로세스 치환을 사용하는 경우
# STDIN을 5에 임시 저장하고, WPIPE를 0으로 사상
exec 5<&0 0<&3
# 1, 2를 RPIPE로 사상
exec 4< <( ssh root@192.168.0.1 \
"echo - | cat > test.txt; \
echo \"EXITED: \$?\"" 2>&1 )
# 0을 STDIN으로 복구
exec 0<&5
##### 백그라운드 프로세스를 사용하는 경우
ssh root@192.168.0.1 \
"echo - | cat > test.txt; \
echo \"EXITED: \$?\"" <&3 1>&4 2>&4
################################################################################
RUNNING=1;
shopt -s nocasematch
EXIT_PATTERN=EXITED
INFO_PATTERN='^(\*|\+|-)[[:space:]]+\[([0-9]+)\][[:space:]]+(.*)[[:space:]]+(.*)$'
while [ $RUNNING -eq 1 ];
do
while read -r -t 0.5 -s line <&4;
do
echo $line;
if [[ $line =~ $EXIT_PATTERN ]]; then
RUNNING=0
fi
if [[ $line =~ $INFO_PATTERN ]]; then
STAT=${BASH_REMATCH[1]}
NUM=${BASH_REMATCH[2]}
NAME=${BASH_REMATCH[3]}
VER=${BASH_REMATCH[4]}
if [[ $VER =~ $VERSION ]]; then
echo "MATCHED: $VER"
echo $NUM >&3
fi
fi
done
sleep 1;
done
echo "EXIT"
exit 0
Please register or sign in to comment