then
3 years ago
5 changed files with 320 additions and 2 deletions
@ -0,0 +1,151 @@ |
|||
#!/usr/bin/env bash |
|||
# usage: chmod all .sh files, be on the same network and run ./netchatte.sh |
|||
# todo: |
|||
# nicknames |
|||
# filesharing |
|||
|
|||
|
|||
# copyleft, netchatte is a netcat based terminal chat |
|||
# program, inspired by 'unnamed project' and made during the first tangible clouds worksession |
|||
# 18th → 21st May 2022 in Brussels (https://tangible-cloud.be/) |
|||
# |
|||
|
|||
#init |
|||
unset ALLCLIENTS |
|||
unset TEMPCLIENTS |
|||
unset IP |
|||
#define listen port |
|||
#define server port.... |
|||
|
|||
|
|||
#functions |
|||
mainMenu () |
|||
{ |
|||
printf "\n ===== MAIN MENU ===== \n" |
|||
printf "\n" |
|||
echo "Hello, pick an option:" |
|||
printf "\n" |
|||
select mainMenu in "Who is online?" "Chat" |
|||
do |
|||
#echo $mainMenu |
|||
case $mainMenu in |
|||
"Who is online?") |
|||
scan |
|||
;; |
|||
Chat) |
|||
chat |
|||
;; |
|||
# if [ '1' = "$REPLY" ]; then |
|||
# scan |
|||
# fi |
|||
|
|||
#echo "Selected number: $REPLY" |
|||
esac |
|||
done |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
scan () |
|||
{ |
|||
printf "\n" |
|||
sleep 0 |
|||
echo "Searching for friends..." |
|||
sleep 2 |
|||
printf "\n" |
|||
#scanOutput=$(arp -a | awk -F'[()]' '{print $2}' | head -1) |
|||
|
|||
# find all machines on the network |
|||
while IFS= read -r LINE; do |
|||
ALLCLIENTS+=("${LINE}") |
|||
#REALCLIENTS=( $(nc -zv -G 1 ${LINE} 1234 2>&1 | grep --line-buffered succeeded | awk '{print $3}') ) #see if port of client is open |
|||
done < <(arp -a -x | awk '{print $1}' | tail -n +2) |
|||
|
|||
|
|||
# for each machine, see if we can connect to it |
|||
for i in "${ALLCLIENTS[@]}" |
|||
do |
|||
: |
|||
TEMPCLIENTS=( $(nc -zv -G 1 $i 1234 2>&1 | grep --line-buffered succeeded | awk '{print $3}' )) |
|||
|
|||
|
|||
|
|||
if [ ${#TEMPCLIENTS[@]} -eq 0 ]; then |
|||
echo "." |
|||
#printf "\n" |
|||
|
|||
else |
|||
#echo "Found the following clients:" |
|||
#echo "$i" |
|||
REALCLIENTS+=("${i}") |
|||
fi |
|||
|
|||
|
|||
|
|||
|
|||
done |
|||
|
|||
|
|||
# Iterate over an array to create select menu |
|||
if [ ${#REALCLIENTS[@]} -eq 0 ]; then |
|||
echo "No clients found :(" |
|||
printf "\n" |
|||
else |
|||
echo "Found a friend!:" |
|||
printf "\n" |
|||
#echo "${#REALCLIENTS[@]}" |
|||
fi |
|||
select IP in "${REALCLIENTS[@]}" "Back to main menu"; do |
|||
case ${IP} in |
|||
1*) #limitation: ip must start with a 1.... |
|||
echo "Client ${IP} selected" |
|||
IP+=("${IP}") |
|||
# Further processing |
|||
|
|||
;; |
|||
"Back to main menu") |
|||
printf "\n" |
|||
mainMenu |
|||
#break |
|||
;; |
|||
*) |
|||
echo "Not available" |
|||
;; |
|||
esac |
|||
done |
|||
|
|||
} |
|||
|
|||
|
|||
chat () |
|||
{ |
|||
screen -c screenrc #launch split screen session with tx.sh and rx.sh |
|||
} |
|||
|
|||
#Main 'loop' |
|||
echo "booting...netchatte" |
|||
sleep 1 |
|||
printf "\n" |
|||
|
|||
cat << "EOF" |
|||
,-. _,---._ __ / \ |
|||
/ ) .-' `./ / \ |
|||
( ( ,' `/ /| |
|||
\ `-" \'\ / | |
|||
`. , \ \ / | |
|||
/`. ,'-`----Y | |
|||
( ; | ' |
|||
| ,-. ,-' | / |
|||
| | ( | hjw | / |
|||
) | \ `.___________|/ |
|||
`--' `--' |
|||
EOF |
|||
|
|||
|
|||
killall nc &> /dev/null # clean up (maybe add killall screen..haha dirty) |
|||
mainMenu #start main function |
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,8 @@ |
|||
#!/usr/bin/env bash |
|||
LOCALIP=$(ipconfig getifaddr en0) |
|||
|
|||
|
|||
while true |
|||
do |
|||
nc -lk ${LOCALIP} 1234 #this shoul be remote ip |
|||
done |
@ -0,0 +1,6 @@ |
|||
bindkey ^D quit |
|||
screen -t you bash ./tx.sh |
|||
split |
|||
focus down |
|||
screen -t friend bash ./rx.sh |
|||
focus up |
@ -0,0 +1,131 @@ |
|||
#!/usr/bin/env bash |
|||
LOCALIP=$(ipconfig getifaddr en0) |
|||
|
|||
#setup |
|||
foundfriend=0 |
|||
|
|||
#functions |
|||
mainMenu () |
|||
{ |
|||
printf "\n ===== MAIN MENU ===== \n" |
|||
printf "\n" |
|||
echo "Hello, pick an option:" |
|||
printf "\n" |
|||
select mainMenu in "Who is online?" "Chat" |
|||
do |
|||
#echo $mainMenu |
|||
case $mainMenu in |
|||
"Who is online?") |
|||
scan |
|||
;; |
|||
Chat) |
|||
chat |
|||
;; |
|||
# if [ '1' = "$REPLY" ]; then |
|||
# scan |
|||
# fi |
|||
|
|||
#echo "Selected number: $REPLY" |
|||
esac |
|||
done |
|||
} |
|||
|
|||
|
|||
while : ; do |
|||
|
|||
|
|||
unset ALLCLIENTS |
|||
unset TEMPCLIENTS |
|||
unset REALCLIENTS |
|||
|
|||
printf "\n" |
|||
echo "Waiting for friends..." |
|||
|
|||
sleep 2 |
|||
#printf "\n" |
|||
#scanOutput=$(arp -a | awk -F'[()]' '{print $2}' | head -1) |
|||
|
|||
# find all machines on the network |
|||
while IFS= read -r LINE; do |
|||
ALLCLIENTS+=("${LINE}") |
|||
#REALCLIENTS=( $(nc -zv -G 1 ${LINE} 1234 2>&1 | grep --line-buffered succeeded | awk '{print $3}') ) #see if port of client is open |
|||
done < <(arp -a -x | awk '{print $1}' | tail -n +2) |
|||
|
|||
|
|||
# for each machine, see if we can connect to it |
|||
for i in "${ALLCLIENTS[@]}" |
|||
do |
|||
: |
|||
TEMPCLIENTS=( $(nc -zv -G 1 $i 1234 2>&1 | grep --line-buffered succeeded | awk '{print $3}' )) |
|||
|
|||
|
|||
|
|||
if [ ${#TEMPCLIENTS[@]} -eq 0 ]; then |
|||
echo -ne "." |
|||
#printf "\n" |
|||
|
|||
else |
|||
#echo "Found the following clients:" |
|||
#echo "$i" |
|||
REALCLIENTS+=("${i}") |
|||
fi |
|||
|
|||
done |
|||
|
|||
|
|||
#remove own IP from array (breaks the 'no clients found' script below...somehow) |
|||
#echo ${LOCALIP} |
|||
delete=${LOCALIP} |
|||
#echo "localhost:.." |
|||
echo "${REALCLIENTS[@]/$delete}" |
|||
|
|||
|
|||
|
|||
if [ ${#REALCLIENTS[@]} -eq 0 ]; then |
|||
echo "No clients found :(" |
|||
printf "\n" |
|||
else |
|||
if [ ${#REALCLIENTS[@]} -ne 0 ] && [ "${REALCLIENTS}" != "${LOCALIP}" ] ; then #remove your own ip, make a list you can choose from here, and add nickname |
|||
echo "Found a friend!:" |
|||
|
|||
select IP in "${REALCLIENTS[@]}" "Back to main menu"; do |
|||
case ${IP} in |
|||
1*) #limitation: ip must start with a 1.... |
|||
echo "Client ${IP} selected" |
|||
IP+=("${IP}") |
|||
printf "\n" |
|||
echo "${IP}" |
|||
printf "\n" |
|||
printf "Connecting..." |
|||
printf "\n" |
|||
sleep 1 |
|||
printf "Connected! Type your message and press [enter], CTRL+D to quit:" |
|||
printf "\n\n" |
|||
#construct a string to be send to nc...todo |
|||
# read -p 'Please choose a nickname: ' nickname |
|||
# echo -ne "$nickname" # how to prepend a nickname and send it |
|||
# https://superuser.com/questions/261900/how-can-i-pipe-commands-to-a-netcat-that-will-stay-alive |
|||
nc ${IP} 1234 |
|||
|
|||
;; |
|||
"Back to main menu") |
|||
printf "\n" |
|||
mainMenu |
|||
#break |
|||
;; |
|||
*) |
|||
echo "Not available" |
|||
;; |
|||
esac |
|||
done |
|||
|
|||
|
|||
break |
|||
fi |
|||
sleep 5 |
|||
fi |
|||
done |
|||
|
|||
|
|||
|
|||
|
Loading…
Reference in new issue