2017-10-30 14 views
1

私はこれが宿題であるとは思っていませんが、私はいつも試してみようとしています。この特定の質問にどのように接近するかについてのいくつかのアイデアを得てください。TCP接続を受け付けるBashスクリプト。クライアント接続が発生したときにクライアントの応答として時刻を送信します。

「TCP接続を受け入れるlab6s6という名前のスクリプトを作成します。クライアント接続 がクライアントへの応答として、一日の時間を送って、発生した場合。あなたは としてリスニングポートを任意のポート番号を選択することができ、そして忘れてはいけませんあなたの接続を閉じる。

私は私のVirtualBoxの最新のFedora OSを実行している

これまでのところ、私はこのコードの特定の部分に遭遇してきたいくつかの研究を行った後

$ exec {file-descriptor}<>/dev/{protocol}/{host}/{port}

何Iいくつかの研究をした後に出てくるだろう

exec 3<>/dev/TCP/127.0.0.1/8000 

私の一般的な理解から、ファイルディスクリプタは常に3に設定される傾向があります(これはstdin、stdout、stderrのため、これは何の目的ですか?)また、読み書きを表す "<"ディレクトリは実際にこれらのプロトコルを使用する方法です。最後に、私のipのために、私はループバックを使ってはいけないということをどこかで読んでいましたが、これはうまくいかないでしょうが、私は記事を読んでいる間はちょっと無礼でした。数字が高いほど、あなたの信号がより利用可能になりますか?

と別の問題については、このようなことを達成するために他の種類のソフトウェアをインストールする必要がありますか?私のLAN上にある他のコンピュータと話すことができるように、私のコンピュータ上の電話回線のように私が基本的に開いているかどうかを誰かが明確にすることができますか?

私は直接の回答を求めていませんが、誰かが正しい方向に私を振ることができたら、私はそれを非常に感謝します!

もう一度おねがいします!

+1

あなたはどんなツールを使用することはできますか? Netcat( 'nc')は私が使ったほとんどのシステムで利用でき、接続を聞くことができます。 '-v'フラグを使うと、Netcatはあなたに着信接続のIPアドレスを与えます。 – Guest

+0

私たちの教授は、私が知っているものからツールに制限を与えてくれませんでした.netcatに関しては、このツールは基本的に私が作った別の仮想マシン間の通信手段のように開くことができますか?誰かが私に実際に起こると思われることのアイデアを与えることができます、私の理解は、私の仮想マシンの1つが他の人に話すことを許可することです、それは正しいのでしょうか?あなたはこの問題を描く良い方法があるように感じますか? – DavidY

答えて

0

私はあなたの2つのスクリプトのために用意しています。クライアントとサーバーの 彼らに実行権を与えた後:のchmod uは+ X SCRIPT_NAMEあなたは、任意の順序でそれらを実行することができます(クライアント - >サーバーまたはサーバー - >クライアント)

bash_server.sh

#!/usr/bin/env bash 

#define port on which the server will listen 
#and the output file that will be used to store the client port to send an answer 
readonly PORT_LISTEN=22222; 
readonly SERVER_FILE=server_file_tmp.out; 

echo "Removing the server temporary file: ${SERVER_FILE}"; 
rm -f "${SERVER_FILE}"; 
#will open/bind/listen on PORT_LISTEN and whenever some information is received 
#it will write it in the SERVER FILE 
echo "Starting the server on port: ${PORT_LISTEN} with configuration file: ${SERVER_FILE}"; 
nc -k -l "${PORT_LISTEN}" | tee "${SERVER_FILE}" & 

echo "Waiting for connection..." 
#active listening to entry connection 
while true; 
do 
    #get always information about the external connection trying to connect to our open port 
    tmpNetworkString=$(lsof -i:"${PORT_LISTEN}" | grep "localhost:${PORT_LISTEN} (ESTABLISHED)" | awk '{print $9}'); 
    echo -n "${tmpNetworkString}"; 
    if [ -s "${SERVER_FILE}" ] && [ ! -z "${tmpNetworkString}" ]; then 
     answerPORT=$(cat "${SERVER_FILE}"); 
     echo "Connection received on port ${PORT_LISTEN}..."; 
     incomingIP=$(echo $tmpNetworkString | cut -d':' -f1); 
     incomingPort=$(echo $tmpNetworkString | cut -d'-' -f1 | cut -d':' -f2); 
     echo ">>Incoming traffic IP: ${incomingIP}"; 
     echo ">>Incoming traffic Port: ${incomingPort}"; 
     echo "Answering on IP: ${incomingIP}, port: ${answerPORT}..."; 
     #wait client port to be ready 
     nc -z "${incomingIP}" "${answerPORT}"; 
     isOpen=$?; 
     while [ ! "${isOpen}" -eq 0 ]; 
     do 
      nc -z "${incomingIP}" "${answerPORT}"; 
      isOpen=$?; 
     done 
     echo $(date) | nc -q 2 "${incomingIP}" "${answerPORT}"; 
     echo "Closing the server, port: ${PORT_LISTEN}"; 
     fuser -k -n tcp "${PORT_LISTEN}"; 
     echo "Removing the server temporary file: ${SERVER_FILE}"; 
     rm -f "${SERVER_FILE}"; 
     exit 0; 
    fi 
done 

bash_client.sh

#!/usr/bin/env bash 

#define port on which the client will listen 
#and the output file that will be used to store the answer from the server 
readonly PORT_LISTEN=33333; 
readonly CLIENT_FILE=client_file_tmp.out; 
readonly SERVER_PORT=22222; 
readonly SERVER_IP=localhost 

echo "Removing the client temporary file: ${CLIENT_FILE}"; 
rm -f "${CLIENT_FILE}"; 
#will open/bind/listen on PORT_LISTEN and whenever some information is received 
#it will write it in the CLIENT FILE 
echo "Starting the server on port: ${PORT_LISTEN} with configuration file: ${CLIENT_FILE}"; 
nc -k -l "${PORT_LISTEN}" > "${CLIENT_FILE}" & 

echo "Connecting to the server: ${SERVER_IP}, on port: ${SERVER_PORT} and waiting for answer"; 
#sending port information for answer: 

#wait client port to be ready 
nc -z "${SERVER_IP}" "${SERVER_PORT}"; 
isOpen=$?; 
while [ ! "${isOpen}" -eq 0 ]; 
do 
    nc -z "${SERVER_IP}" "${SERVER_PORT}"; 
    isOpen=$?; 
done 
echo "${PORT_LISTEN}" | nc -q 2 "${SERVER_IP}" "${SERVER_PORT}"; 

while true; 
do 
    if [ -s "${CLIENT_FILE}" ]; then 
     echo "Answer received from server..."; 
     echo "##############################"; 
     echo "##############################"; 
     cat "${CLIENT_FILE}"; 
     echo "##############################"; 
     echo "##############################"; 
     #sleep 10; 
     echo "Closing the open port of the client, port: ${PORT_LISTEN}"; 
     fuser -k -n tcp "${PORT_LISTEN}"; 
     echo "Removing the answer file: ${CLIENT_FILE}"; 
     rm -f "${CLIENT_FILE}"; 
     exit 0; 
    fi 
done 
+0

上記の情報をありがとうございますが、まだ私は2つの仮想マシンを互いに通信できるようにはできないようですが、私はファイアウォールで遊んでいました。 – DavidY

+0

まず、両方を実行しようとするべきです同じマシン上のスクリプト(localhostを使用)を実行し、2つの異なるマシンから実行しようとすると、それらが通信できるようにする必要があります(同じネットワーク内にあり、それらの間にNAT /これが動作しているときは、ネットワーク設定でプレイできます) – Allan

関連する問題