Correction apportée dans la liste de recherche des noms de serveurs :
(utilisable en tapant f<chaine de caractères dans le nom du serveur>)
Cette correction inclut :
- Un inversement de la liste des configurations de serveurs en entrée
du bloc for utilisé pour lister les serveurs et chercher la chaine
de caractères dans les noms de serveurs.
- Ajout d'une commande "echo" dans la ligne de comparaison entre les
valeurs du filtre entré et du nom du serveur.
En effet, sans la commande "echo" dans la partie droite de la
comparaison, Bash ajoute systématiquement les backslash, ce qui casse
le méchanisme de comparaison et donne de ce fait toujours un résultat
faux.
Concernant l'inversement de la liste, utiliser simplement
"${server_map[@]}" affiche une map inversée par rapport à ce qui avait
été entré dans le bloc de création de cette map.
Pour corriger ce problème, une ligne d'inversement à été nécessaire :
> printf '%s\n' "${server_map[@]}" | tac | cut -d " " -f 6
96 lines
4.5 KiB
Bash
96 lines
4.5 KiB
Bash
#!/bin/bash
|
|
|
|
AUTHORIZED_SERVERS_PATH="opt/public/servers"
|
|
AUTHORIZED_SERVERS_FILE="/${AUTHORIZED_SERVERS_PATH}/authorized_servers.txt"
|
|
CONNECTED_USER="$(whoami)"
|
|
|
|
USER_SERVERS=$(awk -v user="${CONNECTED_USER}" '
|
|
{
|
|
split($5, users, ",");
|
|
for (i in users) {
|
|
if (users[i] == user) {
|
|
print $0;
|
|
}
|
|
}
|
|
}' "${AUTHORIZED_SERVERS_FILE}")
|
|
|
|
if [[ -z ${USER_SERVERS} ]]; then
|
|
echo "Vous n'avez pas l'autorisation de vous connecter à un serveur."
|
|
exit 1
|
|
fi
|
|
|
|
function main_menu() {
|
|
if [[ -z $choice ]] || [[ ${choice} == "null" ]]; then
|
|
clear
|
|
echo "Veuillez sélectionner un serveur auquel vous connecter :"
|
|
fi
|
|
|
|
counter=0
|
|
declare -A server_map
|
|
while read -r line; do
|
|
ip=$(echo "${line}" | cut -d ' ' -f 1)
|
|
port=$(echo "${line}" | cut -d ' ' -f 2)
|
|
custom_name=$(echo "${line}" | cut -d ' ' -f 3)
|
|
server_user=$(echo "${line}" | cut -d ' ' -f 4)
|
|
server_authmethod=$(echo "${line}" | cut -d ' ' -f 6)
|
|
server_auth=$(echo "${line}" | cut -d ' ' -f 7)
|
|
server_map[${counter}]="${ip} ${port} ${server_user} ${server_authmethod} ${server_auth} ${custom_name}"
|
|
if [[ -z $choice ]] || [[ ${choice} == "null" ]]; then
|
|
echo "${counter}) ${custom_name} - ${server_user} ${ip}:${port}"
|
|
fi
|
|
counter=$((counter + 1))
|
|
done <<<"${USER_SERVERS}"
|
|
|
|
if [[ -z $choice ]] || [[ ${choice} == "null" ]]; then
|
|
echo "${counter}) Tapez 'quit' ou ${counter} pour vous déconnecter."
|
|
echo "f) Tapez 'f'<nom de l'hote> pour filtrer les entrées."
|
|
|
|
read -r -p "Votre choix (0-${counter}) : " choice
|
|
fi
|
|
|
|
if [[ ${choice} == "quit" ]] || [[ ${choice} == "${counter}" ]]; then
|
|
echo "Déconnexion du bastion."
|
|
exit 0
|
|
elif [[ $(echo "${choice}" | cut -c1-1) == "f" ]]; then
|
|
filter=$(echo "${choice}" | cut -c2-)
|
|
find_counter=0
|
|
echo "=====Résultats du filtre====="
|
|
for host in $(printf '%s\n' "${server_map[@]}" | tac | cut -d " " -f 6); do
|
|
if [[ $(echo "${host}" | awk '{print $(NF)}' | grep -m 1 -o "${filter}" | head -1) == $(echo "${filter}") ]]; then
|
|
echo "${find_counter}) $(echo ${server_map[${find_counter}]} | awk '{print $(NF)}') - $(echo ${server_map[${find_counter}]} | cut -d ' ' -f 3) $(echo ${server_map[${find_counter}]} | cut -d ' ' -f 1):$(echo ${server_map[${find_counter}]} | cut -d ' ' -f 2)"
|
|
fi
|
|
find_counter=$((find_counter + 1))
|
|
done
|
|
read -r -p "Votre choix (0-${counter}) : " choice
|
|
elif [[ -z ${choice} ]] || [[ -z ${server_map[${choice}]} ]]; then
|
|
echo "Sélection invalide."
|
|
choice="null"
|
|
else
|
|
clear
|
|
local selected_server
|
|
selected_server="${server_map[${choice}]}"
|
|
echo "Connexion à $(echo "${selected_server}" | cut -d " " -f -3)..."
|
|
if [[ -z "$(echo "${selected_server}" | cut -d ' ' -f 4)" ]]; then
|
|
ttyrec -z --"$(echo "${selected_server}" | cut -d ' ' -f 1)"-"$(echo "${selected_server}" | cut -d ' ' -f 3)"-- -k 300 --warn-before-kill 60 -- ssh -o StrictHostKeyChecking=accept-new -p "$(echo "${selected_server}" | cut -d ' ' -f 2)" "$(echo "${selected_server}" | cut -d ' ' -f 3)"@"$(echo "${selected_server}" | cut -d ' ' -f 1)"
|
|
elif [[ "$(echo "${selected_server}" | cut -d ' ' -f 4)" == "key" ]] && [[ -f /"${AUTHORIZED_SERVERS_PATH}"/"$(echo "${selected_server}" | cut -d ' ' -f 5)" ]]; then
|
|
eval "$(ssh-agent)" >/dev/null
|
|
trap 'kill $SSH_AGENT_PID' EXIT
|
|
cat /"${AUTHORIZED_SERVERS_PATH}"/"$(echo "${selected_server}" | cut -d ' ' -f 5)" | ssh-add - >/dev/null
|
|
ttyrec -z --"$(echo "${selected_server}" | cut -d ' ' -f 1)"-"$(echo "${selected_server}" | cut -d ' ' -f 3)"-- -k 300 --warn-before-kill 60 -- ssh -o StrictHostKeyChecking=accept-new -p "$(echo "${selected_server}" | cut -d ' ' -f 2)" "$(echo "${selected_server}" | cut -d ' ' -f 3)"@"$(echo "${selected_server}" | cut -d ' ' -f 1)"
|
|
ssh-add -D >/dev/null
|
|
elif [[ "$(echo "${selected_server}" | cut -d ' ' -f 4)" == "password" ]] && [[ -f /"${AUTHORIZED_SERVERS_PATH}"/"$(echo "${selected_server}" | cut -d ' ' -f 5)" ]]; then
|
|
local ssh_password
|
|
ssh_password=$(cat /"${AUTHORIZED_SERVERS_PATH}"/"$(echo "${selected_server}" | cut -d ' ' -f 5)")
|
|
ttyrec -z --"$(echo "${selected_server}" | cut -d ' ' -f 1)"-"$(echo "${selected_server}" | cut -d ' ' -f 3)"-- -k 300 --warn-before-kill 60 -- sshpass -p "${ssh_password}" ssh -o StrictHostKeyChecking=accept-new -p "$(echo "${selected_server}" | cut -d ' ' -f 2)" "$(echo "${selected_server}" | cut -d ' ' -f 3)"@"$(echo "${selected_server}" | cut -d ' ' -f 1)"
|
|
unset ssh_password
|
|
else
|
|
echo -e "Un problème de configuration a été détecté sur \nles options de connexion à l'hôte selectionné.\nVeuillez contacter votre administrateur."
|
|
fi
|
|
choice="null"
|
|
fi
|
|
}
|
|
|
|
while true; do
|
|
main_menu
|
|
done
|