2016-04-27 7 views
0

Ich bin neu in der Shell-Programmierung und ich habe ein Skript erstellt, das eine Verbindung zu einem Server von mir öffnet. Ich möchte, dass dieses Skript auf eine Eingabe von einem Clientknoten wartet und diese verwendet, um eine Funktion auszuführen.Netcat-Daemon zum Aufrufen von Funktionen in SH-Skript

Dies ist mein Prozess. Run script> öffnet listener> auf dem zweiten Computer zu verwenden netcat Anschluss> eine Funktion im Skript auf dem Server namens nodefunction

Ich habe server_port zu '4444'

Dateinamen codiert laufen: run_hangman

nc -l -k -v -p 4444 | bash hangman 

Dateiname: Henker

#!/bin/bash 

msg_timeout=0 
host_ows=1 
server_port=4444 
dubOws=xxx.xxx.xxx.xxx 

initServer() { 
    hostIP=`ip -o addr show dev "eth0" | awk '$3 == "inet" {print $4}' | sed -r 's!/.*!!; s!.*\.!!'` 
    hostOws=`echo $hostIP | cut -d . -f 4` 
} 
servermsg(){ #message //if = --n, echos on same line 
    if [ "$1" != "--n" ] 
    then 
     echo `date +"%T"` "[SERVER] "$1 
    else 
     echo -n `date +"%T"` "[SERVER] " 
    fi 
} 
owsmsg(){ #message //if = --n, echos on same line 
    if [ "$1" != "--n" ] 
    then 
     echo `date +"%T"` "[OWS] "$1 
    else 
     echo -n `date +"%T"` "[OWS] " 
    fi 
} 
playermsg() { 
    if [ "$1" != "--n" ] 
    then 
     echo `date +"%T"` "[PLAYER] "$1 
    else 
     echo -n `date +"%T"` "[PLAYER] " 
    fi 
} 
question(){ #question, read, example 
    servermsg "$1" 
    if [ -n "$3" ] 
    then 
     servermsg "$3" 
    fi 
    read $2 
    echo "" 
} 
owsArray(){ # 
    for targetOws in $player_list 
    do 
     owsArray+=("OWS"$targetOws) 
    done 
    echo -n ${owsArray[*]} 
    echo 
} 
openSocket() { 
    servermsg "Starting the Game Listener" 
    servermsg "Opening Listener on port "$server_port 
    #nc -k -l $server_port |bash  
    #nc -kl -q 1 -p $server_port # This should create the listener & This is where everything stops. 
    servermsg "Now listening on port "$server_port 
} 

initServer 
owsmsg "Starting server on OWS"$hostOws"..." 

question "Enter all the OWSs that will play:" player_list "Example: 1 9 14 23" 
echo $player_list 
question "Type a category hint:" game_cat "Example: Type of Animal" 
question "Type your word:" game_word "Example: zebra" 
question "How many guesses:" game_guesses "Example: 7" 

servermsg "OWS"$host_ows "has created a Hangman session" 
servermsg "Players are:"; servermsg --n; owsArray 
servermsg "Your word is "${#game_word}" letters long and players have "$game_guesses" guesses" 
question "If this is all correct press enter, or CTRL+C to cancel" 

openSocket 

# I think I need a While script here to read the RAW input and run the playermsg function with the input? 

ich betreiben die run_hangman Datei und dann über meinen Knoten Computer, um es mich verbinden. Ich gebe die folgende Zeile ein und gebe "1 2 3" aus, weil ich das brauche. Ich kann auch "1 2 3" nicht direkt in das Fenster eingeben, in dem "run_hangman" läuft, als würde ich Enter drücken, geht es in eine neue Zeile.

echo "1 2 3" >/dev/tcp/xxx.xxx.xxx.xxx/4444 

Der Server zeigt, dass es

verbunden
Listening on [0.0.0.0] (family 0, port 4444) 
14:52:24 [OWS] Starting server on OWS225... 
14:52:24 [SERVER] Enter all the OWSs that will play: 
14:52:24 [SERVER] Example: 1 9 14 23 
Connection from [xxx.xxx.xxx.xxx] port 4444 [tcp/*] accepted (family 2, sport 41564) 
Connection closed, listening again. 

1 2 3 

Nun, wenn es erlauben wird, openSocket wird es mir noch ein Echo zu schicken und dann schließt es auf dem Server. Ich muss bekommen, was ich nehme, ist eine while-Anweisung und habe es auf eine Eingabe wie "playermsg 'hat ein Spiel gestartet" und habe es tatsächlich diese Funktion auf dem Server ausführen.

Kann ich das zum Laufen bringen, scheint es fast, als müsste es im Hintergrund sein? Ich habe nc(1) als Referenz verwendet und einige Websites sagten -d und das hat auch nicht funktioniert.

Antwort

0

Ich habe es herausgefunden. Ich brauchte tatsächlich eine Weile Erklärung.

openSocket 
while read -r value; do 
    val=${value:10} 
    if [[ "$value" == playermsg* ]]; then 
     val=${value:10} 
     playermsg $val 
    elif [[ "$value" == servermsg* ]]; then 
     val=${value:10} 
     servermsg $val 
    else 
     echo "Returned "$value 
     echo "Value was "$val 
    fi 
done 

So, jetzt auf dem zweiten Computer laufen ich einfach

echo "playermsg testing" >/dev/tcp/xxx.xxx.xxx.xxx/4444 

Dann zeigt der Server die folgenden:

15:29:36 [SERVER] Starting the Game Listener 
15:29:36 [SERVER] Opening Listener on port 4440 
15:29:36 [SERVER] Now listening on port 4440 
15:29:37 [PLAYER] testing