Jump to content

[GLOBAL] 100% question pour un pinguin


Recommended Posts

Topic très instructif.

Juste une petite question:

chmod a-x /lib/ld-*

Ca donne quoi?

Sinon une question de rapidité.

Imaginons qu'on définisse des variables comme suit:

V0=zero
V1=un
V2=deux
V3=trois
...
V1000=mille

Le nombre de variables définies est donné par la variable nb_var, exemple:

nb_var=1001

Comment afficher le contenu de toutes ces variables une par une avec un script shell ?

Link to post
Share on other sites
  • Replies 298
  • Created
  • Last Reply
Imaginons qu'on définisse des variables comme suit:

V0=zero
V1=un
V2=deux
V3=trois
...
V1000=mille

Le nombre de variables définies est donné par la variable nb_var, exemple:

nb_var=1001

Comment afficher le contenu de toutes ces variables une par une avec un script shell  ?

Avec eval (quoi que ce serait plus facile si on mettait les variables dans un tableau à la base, hein, mais après l'exo est moins drôle :D)

#!/bin/sh
V0=zero
V1=un
V2=deux
V3=trois

nb=4

for i in $(seq 0 $(($nb-1)))
do
   Vi=$(eval "echo \$V$i")
   echo $Vi
done

Ceci donne :

zero
un
deux
trois

EDIT : encadrage du seq par $() au lieu de `` pour des raisons d'homogénéité :-D

Link to post
Share on other sites

une un peu velue ??

j'ai une machine Linux sur laquelle je m'authentifie via LDAP. Du coup les usernames sont "nomdudomaine\nomduuser"

quand je fais un ls -l, je n'ai que les qq premiers caractères du nom du domaine, alors qu'évidemment c'est le nomduuser qui m'intéresse ...

:/home/GROUPELDAP]$ ls -al
total 164
drwxrwxrwx   38 root     pgsql        4096 Aug 17 11:31 .
drwxr-xr-x   16 root     root         4096 Aug  1 13:30 ..
drwx------    2 GROUPELD pgsql        4096 Jun 30 15:41 user1
drwx------    2 GROUPELD pgsql        4096 Nov 15  2004 user2

alors qu'en colonne 3 je voudrais "GROUPELDAP\user1" ...

j'ai essayé un export COLUMNS avant, mais sans effet (alors que pour dpkg -l c'est bien utile)

quand je créé un user local sur ma kubuntu avec un nom très long, ça marche, le ls me donne tout

/home # ls -l
total 28
drwxr-xr-x   2 guest                 guest                 4096 Jul  8 10:43 guest
drwxr-xr-x   2 kilestlongcenomdeuser kilestlongcenomdeuser 4096 Aug 17 11:40 kilestlongcenomdeuser

mais sur la machine qui m'intéresse (RH7.3), keudchiq ...

- ce n'est pas masqué, un ls -l | awk '{print $3}' ne me donne que le fragment ...

- ls -l --tabisze=0 ne résoud pas mon pb ...

Link to post
Share on other sites

Bon Sandeman c'est pas pour répondre à cette question là que je posete, mais à l'autre ("Avoir toutes les photos du topic plus beau bureaux")

Un peu violent, mais ça marche :transpi:

Fichier get_links.sh :

#!/bin/sh

#
# Copyright (c) 2005 Damien THEBAULT
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#

ls $1 1>/dev/null || exit 1

PSEUDOS=$(
   cat $1 | sed -nr "s|.*<span class='normalname'><a href=.*>(.*)</a></span></td>.*|\1|g p; T; =" | sed -e 'N; s/\n/:/'
)

PICS=$(
   tmp=$(cat $1 | sed -e '=' | sed -e 'N; s/\n/ /')
   while echo -e "$tmp" | grep -vE "^ *$" | grep -qv "^<img"
   do
       tmp=$(echo -e "$tmp" | grep "<img" | grep "user posted image" | grep -v "class='signature'" | sed -nr "s/^([0-9]*)(.*)<img/\1 \2\n<img \1/g p" | grep "<img")
   done
   echo -e "$tmp" | sed -nr "s|.*<img *([0-9]*) *src='(.*)' border='0' alt='user posted image' />.*|\1\|\2|g p"
)

LINKS=$(
   tmp=$(cat $1 | sed -e '=' | sed -e 'N; s/\n/ /')
   while echo -e "$tmp" | grep -vE "^ *$" | grep -qv "^<a"
   do
       tmp=$(echo -e "$tmp" | grep "<img" | grep "user posted image" | grep -v "class='signature'" | sed -nr "s/^([0-9]*)(.*)<a/\1 \2\n<a \1/g p" | grep "<a")
   done
   echo -e "$tmp" | sed -nr "s|.*<a *([0-9]*) *href='(.*)' target='_blank'><img src='(.*)' border='0' alt='user posted image' />.*|\1\|\2|g p"
)

MINIS=$(
   tmp=$(cat $1 | sed -e '=' | sed -e 'N; s/\n/ /')
   while echo -e "$tmp" | grep -vE "^ *$" | grep -qv "^<a"
   do
       tmp=$(echo -e "$tmp" | grep "<img" | grep "user posted image" | grep -v "class='signature'" | sed -nr "s/^([0-9]*)(.*)<a/\1 \2\n<a \1/g p" | grep "<a")
   done
   echo -e "$tmp" | sed -nr "s|.*<a *([0-9]*) *href='(.*)' target='_blank'><img src='(.*)' border='0' alt='user posted image' />.*|\1\|\3|g p"
)

for i in $MINIS
do
   PICS=$(echo "$PICS" | sed -e "s^$i^^g" | grep -v "^$")
done

for i in $LINKS $PICS
do
   IMG=$(echo $i | awk -F "|" '{print $2}')
   LINE=$(echo $i | awk -F "|" '{print $1}')

   PSEUDO=""
   for i in $(echo $PSEUDOS)
   do
       PSLINE=$(echo $i | awk -F ":" '{print $2}')
       [ "$LINE" ] && [ "$PSLINE" ] && [ "$PSLINE" -lt "$LINE" ] && PSEUDO=$(echo $i | awk -F ":" '{print $1}')
   done

   echo "$PSEUDO|$IMG"
done

fichier principal pci_screens.sh :

#!/bin/sh

#
# Copyright (c) 2005 Damien THEBAULT
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#

GREEN='\033[01;32m'
RED='\033[01;31m'
NORM='\033[00m'

echo "Usage : $0 <opts>" 1>&2
echo "-no-dl : don't download"  1>&2
echo "-f : force download of already downloaded files" 1>&2
echo "-no-up : don't update preprocessed output" 1>&2
echo "-html : html output" 1>&2
echo "-bbcode : bbcode output" 1>&2
echo "" 1>&2

MAX=900

for i in $@
do
   case $i in
       -no-dl)        NO_DL="1";;
       -f)            FORCE="1";;
       -no-up)        NO_DL="1"; NO_UP="1";;
       -html)        HTML="1";;
       -bbcode)    BBCODE="1";;
   esac
done

[ "$HTML" ] || [ "$BBCODE" ] || HTML="1"
[ "$HTML" ] && [ "$BBCODE" ] && HTML=""

if [ ! "$NO_DL" ]
then
   [ -d dl ] || mkdir dl
   pushd dl
   for i in $(seq 0 20 $MAX)
   do
       if [ "$FORCE" ] || [ ! -f $i ]
       then
           wget http://www.pcinpact.com/forum/sujet_23732_$i.htm -O $i.html
       fi
   done
   popd #dl
fi

if [ ! "$NO_UP" ]
then
   {
   for i in $(seq 0 20 $MAX)
   do
       echo dl/$i.html 1>&2
       ./get_links.sh dl/$i.html
   done
   } | sort > list.tmp
fi

[ "$HTML" ] && echo "<html>"
ni=0
n=$(cat list.tmp | wc -l)
for i in $(cat list.tmp)
do
   ((ni=ni+1))
   PSEUDO=$(echo $i | awk -F "|" '{print $1}')
   LINK=$(echo $i | awk -F "|" '{print $2}')
   echo -n "$ni/$n checking $PSEUDO ( $LINK )... " 1>&2

   HOST=$(echo $LINK | sed 's|http://||g')
   while echo $HOST | grep -q "/"
   do
       HOST=$(dirname $HOST)
   done

   if ping -W 1 -c 1 $HOST 2>/dev/null 1>&2
   then
       if wget --spider $LINK 2>/dev/null 1>&2
       then
           echo -e "${GREEN}OK${NORM}" 1>&2
           [ "$HTML" ] && echo "<a href=\"$LINK\">$PSEUDO</a><br>"
           [ "$BBCODE" ] && echo "[URL=$LINK]$PSEUDO[/URL]"
       else
           echo -e "${RED}NO${NORM}" 1>&2
       fi
   else
       echo -e "${RED}NO${NORM}" 1>&2
   fi
done
[ "$HTML" ] && echo "</html>"

Si quelqu'un veut les fichiers je les lui envoie (hein Sandeman)

Link to post
Share on other sites
  • 3 months later...
Une petite question ? :)

Que fait ma signature

Pour rappel :

/lib/ld-linux.so.2 /bin/echo 16i[q]sa[ln0=aln100%Pln100/snlbx]sbA0D4D465452snlb xq |/lib/ld-linux.so.2 /usr/bin/dc

:transpi:

:smack:

J'en ai une autre sympa aussi dans le même genre (mais un peu plus simple) :

perl -e'map{print pack c,($|++?1:13)+ord,select$,,$,,$,,$|}split//,ESEL.$/'

Encore une pour rester sur dc, mais bien plus compliqué là :

echo '9k[l:l;s<s=0l>x]s"[1+l<dd*l=d*-l;+ds<rl=2**l:+ds=d*rd*+4<-d15>>] s>[q]s-[d77/3*2-s;47l"x-P1+d78>`]s`0[d23/.5-3*s:0l`xr10P1+d24>$]ds$x'|dc

Link to post
Share on other sites
  • 1 month later...

Bon, pour déporter tous les messages du bar à un endroit plus approprié, et comme l'a dit duke98, je vais poser le problème ici :

Comment bloquer les attaques de type fork-bomb sur un système?

Je ressort le script bash :

:(){ :|:& };:

On peut déjà utiliser /etc/security/limits.conf ou ulimit

Mais est-il aussi possible de limiter l'utilisation CPU? (par exemple, 33% par utilisateur)

Link to post
Share on other sites

Ah, en fait y'a aussi /etc/limits...

Mais il semble que lui aussi n'affecte que les programmes utilisant pam (à vérifier quand même), donc autant utiliser /etc/security/limits.conf qui est plus flexible (par groupes par exemple)

Voici comment mettre une limite de 250/300 processus :

@users soft nproc 250

@users hard nproc 300

sources (c'est pas ma faute si j'ai trouvé de la doc principalement sur des sites gentoo :oops: ) :

http://gentoo-wiki.com/SECURITY_Limit_User_Processes

http://www.gentoo.org/doc/en/security/secu...l?part=1&chap=5

Link to post
Share on other sites

j'ai dumal à croire qu'on puisse limiter l'utilisation cpu... quand un process s'execute, il à acces à toutes les ressources de calcul du calcul pendant son temps d'exécution.

ce temps d'exécution est fixe (qq ms), et la politique d'ordonnacement des process est anonyme (elle ne prend pas en compte le nom.user/group/etc... du processus, uniquement sont le temps qu'il a passé à être éxécuté et sa priorité).

donc à partir du moment où un processus s'exécute, il pourra être à 100% cpu.

dans le cas de la fork bomb, ce n'est pas grave dans le cas ou on à fixé une limite aux nombre de process. en effet, root peut toujours se logguer (créer un process de login) et tuer tous les processus de l'utilisateur concerné. c'est juste que face à la masse de processus à ordonancer, le temps qu'il mettra pour y arriver est un peu plus incertain.

vous pouvez essayer : fixez la limite à 200, lancez votre fork bomb, via ssh loguez vous et tuez les tous, normalement, ça marche (j'ai déjà testé - je crois même avoir posté un screen de ça dans le bar...). c'est juste que le systeme perd en réactivité

Link to post
Share on other sites
  • 4 months later...

C'est bien calme ici

Bon un tout piti problème tiré de mon dernier tuto ...

Le soft utilisé tente de lire des données sur un media abîmé, mais n'est pas d'une grande stabilité. Il y a une fonction de reprise, mais vers un nouveau fichier ... avec un padding de 0 dans l'intervalle. Bien entendu la taille des fichiers n'est pas prévisible ...

donc en gros, si j'essaie de lire la chaine ABCDEFGHIJKLMNOPQRSTUVWXYZ

j'aurai

fichier 1 : ABCDE

fichier 2 : 000000FGHIJK

fichier 3 : 000000000000LM

fichier 4 : 00000000000000NOPQRSTUVW

fichier 5 : 00000000000000000000000000XYZ

Le but du jeu : écrire un petit script qui me reconstruit proprement la cible (sachant qu'on parle de fichiers binaires de 700 Mo :transpi:

Il y a plus d'infos et un exemple de résolution dans le topic pré-cité, mais si vous avez des idées plus flashy :smack:

Link to post
Share on other sites

C'est bien calme ici

Bon un tout piti problème tiré de mon dernier tuto ...

Le soft utilisé tente de lire des données sur un media abîmé, mais n'est pas d'une grande stabilité. Il y a une fonction de reprise, mais vers un nouveau fichier ... avec un padding de 0 dans l'intervalle. Bien entendu la taille des fichiers n'est pas prévisible ...

donc en gros, si j'essaie de lire la chaine ABCDEFGHIJKLMNOPQRSTUVWXYZ

j'aurai

fichier 1 : ABCDE

fichier 2 : 000000FGHIJK

fichier 3 : 000000000000LM

fichier 4 : 00000000000000NOPQRSTUVW

fichier 5 : 00000000000000000000000000XYZ

Le but du jeu : écrire un petit script qui me reconstruit proprement la cible (sachant qu'on parle de fichiers binaires de 700 Mo ;)

Il y a plus d'infos et un exemple de résolution dans le topic pré-cité, mais si vous avez des idées plus flashy :eeek2:

je pense qu'il y a moyen de s'en sortir avec "dd", "wc -c"... et peut-etre l'option offset.

touch NewImage && 
for FILE in $( ls fichiers* | sort);
do
 dd if=${FILE} of=NewImage skip=${wc -c NewImage} seek=${wc -c NewImage} bs=1;
done

Link to post
Share on other sites

:reflechis: pas mal je vais essayer ça ... mais pour l'instant je retourne au décollage (de ma tapisserie)

c'est un exemple théorique, faudra sans doute jouer sur les paramètres de "sort"

A+

Je retourne à mon install d'XGl ...

Link to post
Share on other sites
  • 3 weeks later...

allez, comme vous vous ennuyez. je vous en soumets une petite :

(un pote qui me l'a posée, je lui ai donné une réponse qui tient en une ligne :craint: ) :

j'ai deux fichiers :

#cat fichier1.txt
Sand
arr
de p
des qu
trop f
#cat fichier2.txt
eman
êtes
oser
estions
aciles !

et à partir de ça je récupère un fichier :

#cat fichier.txt
Sandeman
arrêtes
de poser
des questions
trop faciles !

Link to post
Share on other sites

allez, comme vous vous ennuyez. je vous en soumets une petite :

(un pote qui me l'a posée, je lui ai donné une réponse qui tient en une ligne :craint: ) :

j'ai deux fichiers :

#cat fichier1.txt
Sand
arr
de p
des qu
trop f
#cat fichier2.txt
eman
êtes
oser
estions
aciles !

et à partir de ça je récupère un fichier :

#cat fichier.txt
Sandeman
arrêtes
de poser
des questions
trop faciles !

Trop facile... :

i=0 ; while [ $i -lt `cat fichier1 | wc -l ` ] ; do i=$((i+1)) ; echo `head fichier1 -n$i | tail -n1``head fichier2 -n$i | tail -n1` >> fichier ; done

C'est la première solution qui me soit venue à l'esprit... c'est simple, non ? :craint:

Link to post
Share on other sites

Moi j'en ai une à base de sed :

((i=1))
while true
do
line1=$(sed -n "$i{p;q;}" fichier1.txt)
line2=$(sed -n "$i{p;q;}" fichier2.txt)
[ -z "$line1" ] && [ -z "$line2" ] && return
echo "$line1$line2"
((i++))
done

(en plus on peut avoir des fichiers de tailles différentes et quitter quand on veut...)

Mais je ne suis pas sûr que le faire en shell soit le plus approprié.

Link to post
Share on other sites

En partant de la sotution de yoda222 :

i=0; while [ $i -lt `cat file1 | wc -l` ] ; do ((i=i+1)) ; sed -n ${i}p file1 | tr -d '\n'; sed -n ${i}p file2 ; done

Mais bon ça reste un peu crade.

Link to post
Share on other sites

comme prévu, en perl c'est bien plus efficace :

open(f1,"fichier1.txt") or die;@l1=<f1>;close(f1);chomp @l1;
open(f2,"fichier2.txt") or die;@l2=<f2>;close(f2);chomp @l2;
for( $i=0; $i<=$#l1 && $i<=$#l2; $i++){print "$l1[$i]$l2[$i]\n";}

 $ perl script.pl
Sandeman
arrêtes
de poser
des questions
trop faciles !

Une petite comparaison de vitesse :

 $ % sh ./test.sh
100 loops

shell...
real	0m3.953s
user	0m1.304s
sys	 0m2.656s

perl...
real	0m0.604s
user	0m0.272s
sys	 0m0.328s

et en C :

#include <stdio.h>
int main()
{
FILE *f1 = fopen("fichier1.txt","r");
FILE *f2 = fopen("fichier2.txt","r");
int c1,c2;
while(!(feof(f1) && feof(f2)))
{
	do
	{
		c1 = fgetc(f1);
		if(c1 != EOF && c1!='\n') putchar(c1);
	} while(c1 != EOF && c1!='\n');
	do
	{
		c2 = fgetc(f2);
		if(c2 != EOF) putchar(c2);
	} while(c2 != EOF && c2!='\n');
}
fclose(f2);
fclose(f1);
return 0;
}

ça va encore plus vite...

C...

real	0m0.184s
user	0m0.060s
sys	 0m0.124s

(on est limité par les appels sytèmes là)

Link to post
Share on other sites
fais donc un

time paste -d '' fichier1.txt fichier2.txt

alors :chinois:

Sauf que là t'en fait qu'un seul, moi c'est une boucle avec 100 itérations...

Et donc le code C est meilleur (compilé avec à peu près les mêmes options que paste)

C...

real	0m0.194s
user	0m0.056s
sys	 0m0.096s

paste...

real	0m0.342s
user	0m0.096s
sys	 0m0.184s

et les autres options de paste sont faciles à implémenter... ils ont fait quoi quand ils ont programmé? :chinois:

Link to post
Share on other sites

Archived

This topic is now archived and is closed to further replies.


×
×
  • Create New...