shスクリプトから関数を呼び出すために使用されるnetcatデーモン

shスクリプトから関数を呼び出すために使用されるnetcatデーモン

私はシェルプログラミングが初めてで、サーバーへの接続を開くスクリプトを作成しました。このスクリプトはクライアントノードの入力を受け取り、それを使用して関数を実行したいと思います。

これが私のプロセスです。スクリプトの実行 > リスナーを開く > 2台目のコンピュータでnetcatを使用して接続 > サーバー上のスクリプトでnodefunctionという関数を実行する

server_portを「4444」にエンコードしました。

ファイル名:run_hangman

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

ファイル名:処刑者

#!/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?

run_hangmanファイルを実行し、ノードマシンを介して接続します。次の行を入力すると、「1 2 3」と表示されます。これは私が必要だからです。また、「run_hangman」を実行するウィンドウに「1 2 3」を直接入力することはできません。 Enterキーを押すと、新しい行に移動するのと同じです。

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

サーバーが接続としてマークされます。

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

これでopenSocketに到達すると、もう一度エコーを送信してからサーバーで閉じます。私はwhileステートメントだと思うものを持ってきて、「playermsg 'game started'」のような入力を受け取り、実際にサーバー上で関数を実行させる必要があります。

バックグラウンドで実行されているように見えるように実行することはできますか?使ってきたCNC(1)ちなみに、一部のサイトでは試してみることができるということですが、-dそれも動作しません。

ベストアンサー1

わかりました。しばらく声明が必要です。

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

今2台目のコンピュータで実行したばかり

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

これにより、サーバーは以下を表示します。

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

おすすめ記事