Un équivalent de « bash -x » pour Python:
python -m trace -t script.py
Rien n’empêche une machine de disposer de plusieurs adresses IP, sur des interfaces différentes ou sur une même interface et ceci présente de nombreux avantages dans plusieurs circonstances, par exemple :
Alias sur Debian
Un alias se configure dans le fichier /etc/network/interfaces.
Pour configurer un alias eth0:0, les lignes suivantes doivent y être ajoutées (et adaptées selon les besoins et votre configuration actuelle):
auto eth0:0
iface eth0:0 inet static
address 192.168.1.70
netmask 255.255.255.0
broadcast 192.168.1.255
network 192.168.1.0
L’alias peut être activé et désactivé comme toute carte avec les commandes ifup et ifdown:
ifup eth0:0
ifdown eth0:0
Alias sur Red Hat
Un alias se configure en créant un fichier dans /etc/sysconfig/network-scripts/ , par exemple ifcfg-eth0:0.
Dans l’exemple de ifcfg-eth0:0, il doit reprendre une structure identique à la configuration de l’interface réseau eth0, excepté l’adresse MAC qui est inutile.
Voici un exemple de contenu :
DEVICE=eth0:0
IPADDR=192.168.1.70
NETMASK=255.255.255.0
NETWORK=192.168.1.0
ONBOOT=yes
L’alias peut être activé et désactivé comme toute carte avec les commandes ifup et ifdown.
Sur les distributions type RedHat, on peut également créer des plages d’IP multiples en affectant cette plage à une interface réseau.
Il devient alors possible, d’un seul coup, de créer autant d’alias que souhaité, à condition que les adresses IP se suivent.
Si on souhaite créer 19 alias sur eth0 allant de l’IP 192.168.1.71 à 192.168.1.90, le fichier /etc/sysconfig/network-scripts/ifcfg-eth0-range0 doit être créé et rempli avec le contenu suivant :
IPADDR_START=192.168.1.71
IPADDR_END=192.168.1.90
CLONENUM_START=0
NETMASK=255.255.255.0
Le paramètre CLONENUM_START indique le numéro d’alias de départ.
L’interface associée doit être arrêtée et démarrée pour que la modification soit prise en compte, soit par ifdown/ifup, soit par le redémarrage du service network.
Le résultat est le suivant :
ifconfig
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:4C:A6:AF
inet adr:192.168.1.71 Bcast:192.168.1.255
Masque:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
eth0:1 Link encap:Ethernet HWaddr 00:0C:29:4C:A6:AF
inet adr:192.168.1.72 Bcast:192.168.1.255
Masque:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
eth0:2 Link encap:Ethernet HWaddr 00:0C:29:4C:A6:AF
inet adr:192.168.1.73 Bcast:192.168.1.255
Masque:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
eth0:3 Link encap:Ethernet HWaddr 00:0C:29:4C:A6:AF
inet adr:192.168.1.74 Bcast:192.168.1.255
Masque:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
eth0:4 Link encap:Ethernet HWaddr 00:0C:29:4C:A6:AF
inet adr:192.168.1.75 Bcast:192.168.1.255
Masque:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
eth0:5 Link encap:Ethernet HWaddr 00:0C:29:4C:A6:AF
inet adr:192.168.1.76 Bcast:192.168.1.255
Masque:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Etc… jusqu’a eth0:18.
telnet 192.168.0.14 20000
Si le port est ouvert:
Trying 192.168.0.14...
Connected to entropia (192.168.0.14).
Escape character is '^]'.
Si le port est fermé (ou service non démarré):
Trying 192.168.0.14...
telnet: connect to address 192.168.0.14: Connection refused
telnet: Unable to connect to remote host: Connection refused
netstat -paunt | grep 3306; echo $?
Si le port est ouvert:
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1979/mysqld
0
Si le port est fermé (ou service non démarré):
1
nc -v -z 192.168.0.14 3306; echo $?
Si le port est ouvert:
Connection to 192.168.0.14 3306 port [tcp/mysql] succeeded!
0
Si le port est fermé (ou service non démarré):
nc: connect to 192.168.0.14 port 3306(tcp) failed: Connection refused
1
nc 192.168.0.14 3306< /dev/null ; echo $?
Si le port est ouvert:
4
5.1.73▒d))4f*<,i▒N*'%#~rC8/#`0
Si le port est fermé (ou service non démarré):
1
wget -qO- 192.168.0.14:80 ; echo $?
wget -q --spider 192.168.0.14:80 ; echo $?
curl telnet://192.168.0.14:22
Si le port est ouvert, la commande restera bloquée car elle attend que l’on saisisse quelque chose. ctrl+c pour sortir.
Si le port est fermé:
curl: (7) couldn't connect to host
timeout 1 bash -c 'cat < /dev/null > /dev/tcp/192.168.0.14/22' ; echo $?
Si le port est ouvert:
0
Si le port est fermé:
bash: connect: Connexion refusée
bash: /dev/tcp/192.168.0.14/22: Connexion refusée
1
nmap -p 80 192.168.0.14
Si le port est ouvert:
Starting Nmap 5.51 ( http://nmap.org ) at 2016-03-29 10:00 CEST
Nmap scan report for entropia.local (192.168.0.14)
Host is up (0.00068s latency).
PORT STATE SERVICE
80/tcp open http
MAC Address: 00:50:56:01:27:55 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 0.12 seconds
Si le port est fermé:
Starting Nmap 5.51 ( http://nmap.org ) at 2016-03-29 10:06 CEST
Nmap scan report for entropia.local (192.168.0.14)
Host is up (0.00045s latency).
PORT STATE SERVICE
80/tcp closed http
MAC Address: 00:50:56:01:27:55 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 0.10 seconds
Pour tester plusieurs port en même temps:
nmap -p 22,1944,20000 192.168.0.14
python
import socket
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('192.168.0.14' , 80))
clientsocket.sent('\n')
Si le port est ouvert, vous arriverez à faire un « clientsocket.sent(‘\n’) » (qui vous retournera surement cette une erreur):
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: '_socketobject' object has no attribute 'sent'
Si le port est fermé, au moment du « clientsocket.connect((‘192.168.0.14’ , 80)) » :
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in connect
socket.error: [Errno 111] Connection refused
Pour un programme /usr/local/bin/test.sh, on va créer un fichier test.service dans le répertoire de configuration de Systemd, /etc/systemd/system/ :
vi /etc/systemd/system/test.service
Et on y mets ça:
[Unit]
Description=Mon service test
After=tlp-init.service
[Service]
Type=oneshot
RemainAfterExit=no
User=starmate
ExecStart=/usr/local/bin/test.sh
[Install]
WantedBy=multi-user.target
On démarre le service:
systemctl start test.service
Puis on l’active au démarrage :
systemctl enable test.service
Boucle for à mettre dans son .bashrc :
vi ~/.bashrc
On met la boucle a fin la du fichier.
function fermer {
BAK=$IFS
IFS=$'\n'
for id in $(ps aux | grep -P -i $1 | grep -v "grep" | awk '{printf $2" "; for (i=11; i<NF; i++) printf $i" "; print $NF}'); do service=$(echo $id | cut -d " " -f 1) if [[ $2 == "-t" ]]; then echo $service \"$(echo $id | cut -d " " -f 2-)\" "peut-être tué" else echo $service \"$(echo $id | cut -d " " -f 2-)\" "a été tué" for signal in "TERM" "INT" "HUP" "KILL" "9"; do kill -$signal $service RETVAL=$? [ $RETVAL -eq 0 ] && break echo "Attention: le kill n'a pas marché: pid=$service, signal=$signal" >&2
sleep 1
done
fi
done
IFS=$BAK
}
A défaut de ré-ouvrir un shell, on doit sourcer son .bashrc pour une prise en compte immédiate:
cd ~
source .bashrc
On peut visualiser les pids qui vont etre tués via un mode test:
fermer nom_du_programme -t
Et dés qu’on est sur:
fermer nom_du_programme