Comme étant un utilisateur de la ligne de commande, j’aime bien me créer quelques scripts bash simple qui m’évite de me retaper x fois les mêmes commandes
Je vous propose mon script pour faire des screenshots :
. En fait, je ne fais des scripts que quand j’ai besoin d’un truc précis et je ne passe generalement pas par u nfichier, mais juste en ligne de commande. C’est des trucs assez con du genre, recuperer le debit reseaux avec ifconfig et des cut/tail/head de partout (je sais, torsmo et companie le font, c’est pour ca que je dis que c’est con :ane: ).
La plupart de mes scripts sont fais pour demarrer des jeux avec cedega (genre je rentre dans le repertoire, je lance cedega et je resors du repertoire). Bref, rien de bien interessant
moi j’ai juste un petit script pour encoder du flac /shn en ogg, c’est pas tres propre amon avis mais bon :
#! /bin/bash
# Usage script PATH FORMAT
REP=$1
FORMAT=$2
if [[ -z $1 || -z $2 ]]
then
echo "Erreur!"
exit 1
fi
if [[ -e $REP ]]
then
cd $REP
else
echo "$REP n'existe pas!"
exit 1
fi
for i in *.$FORMAT
do
if [[ "$FORMAT" == "flac" ]]
then
flac -d "$i"
fi
if [[ "$FORMAT" == "shn" ]]
then
shntool conv $i
fi
done
for i in *.wav
do
oggenc -q 8 "$i"
done
rm -rf *.flac *.wav *.shn
Y aurait des conditions a rajouter pour gerer toutes les erreurs possibles mais j’ai la flemme
Je ne script presque plus en bash. Je le fais en python tout simplement parce que python est beaucoup plus lisible que bash (surtout pour un non spécialiste qui devra relire mes scripts…).
Ce n’est pas un troll !!!. Tout ce qui m’intéresse, c’est de faire un code réutilisable par le maximum de personnes. Avec la tonne de modules python dispo “c’est que du bonheur”
+1 pour python même si je l’utilise pourt des choses un peu plus complexes (un serveur pour le freeplayer qui controle VLC, travail en cours)
sinon un semblant de script bash que j’utilise le plus c’est : for i in *; do …; done
Pour revenir à python j’y prends serieusement gout, c’est une joie de coder dans ce langage même si les debuts sont un peu laborieux ça semble quand même vachement plus intuitif que le shell.
Mais quand même, monter un serveur web, faire du regex et telnet en un script de quelques lignes en quelques heures par un grand debutant, ça poutre
bah justement je ne suis pas raciste ce topic a pour vocation de ne pas exclure les autres langages de scripts
et si vous en avez en python bah à vos souris
#! /bin/sh
LOGIN=sboube@brouette.com
MDP=0123456789
HOST=adresse_de_mon_serveur...
function FAKE_ADD {
#$1 est l'adresse locale
RANDOM=$(date +%N)
local ADD
local i
for i in $(seq 1 4); do
local "NB$i"
let "NB$i = $RANDOM >> 7"
ADD="$ADD$((NB$i))."
done
ADD="${ADD%%.}"
#une chance sur 2^32 de ne pas tomber sur la meme adresse...
while [ "$ADD" == "$1" ]; do
ADD=""
for i in $(seq 1 4); do
let "NB$i = $RANDOM >> 7"
ADD="$ADD$((NB$i))."
echo "$i"
done
ADD="${ADD%%.}"
done
echo "$ADD"
}
function TEST_SVR {
local REP
REP=$(ping -c 1 -w 2 "$1" |
grep "transmitted" |
sed -e 's/\(.*\),\(.*\),\(.*\),\(.*\)/\1\2/g')
if [ "$REP" == "1 packets transmitted 1 received" ]; then
return 0
else
return 1
fi
}
function MAJ_ADD {
local REP
local ERR
local _HOST
REP=$(curl -s "http://dynupdate.no-ip.com/dns?username=$LOGIN&password=$MDP&hostname=$HOST&ip=$1")
ERR=$(echo $REP | sed -e 's/\(.*\):\([0-1]*\)/\2/g')
_HOST=$(echo $REP | sed -e 's/\(.*\):\([0-9]*\)/\1/g')
case $ERR in
#pour les codes erreurs, voir [url=http://www.no-ip.com/integrate/response]http://www.no-ip.com/integrate/response[/url]
0 ) echo "MAJ inutile $HOST pointe deja vers $1";;
1 ) echo "MAJ achevee $HOST pointe maintenant vers $1";;
2 ) echo "HOST invalide";;
3 ) echo "MDP invalide";;
4 ) echo "LOGIN invalide";;
5 ) echo "Trop de requetes envoyees, MAJ bloquees pendant une heure";;
6 ) echo "Compte bloque, cause violation de clause";;
7 ) echo "ADRESSE IP invalide, $1";;
8 ) echo "Hostname bloque";;
9 ) echo "Hote configure comme lien vers un autre site...????";;
99 ) echo "Client desactive";;
* ) echo "Code erreur inconnu, valeur : $ERR";;
esac
#utile? pas sûr...
if [ "$_HOST" != "$HOST" ]; then
echo "ATTENTION $HOST != $_HOST, mauvaise redirection!"
exit 2
fi
}
#DEBUT PROG PRINCIPAL
echo -n "Test des serveurs : "
if TEST_SVR checkip.dyndns.org && TEST_SVR dynupdate.no-ip.com; then
echo "Serveurs OK"
OPTION=0
LOCAL_ADDRESS=$(curl -s checkip.dyndns.org |
grep "Current IP Address: " |
sed -e 's/\(.*\): \([0-9]*\).\([0-9]*\).\([0-9]*\).\([0-9]*\)\(.*\)/\2.\3.\4.\5/g')
while getopts ":lahft-:" opt; do
case $opt in
l | t ) OPTION=1;;
a ) OPTION=2;;
f ) OPTION=3;;
h ) OPTION=4;;
? | - ) case $OPTARG in
true | local ) OPTION=1;;
address ) OPTION=2;;
fake | false ) OPTION=3;;
help | * ) OPTION=4;;
esac;;
esac
done
if [ $OPTION -eq 1 ]; then
echo "adresse detectee : $LOCAL_ADDRESS"
MAJ_ADD $LOCAL_ADDRESS
fi
if [ $OPTION -eq 2 ]; then
#$2 contient dans ce cas l'adresse!
echo "adresse transmise : $2"
MAJ_ADD $2
fi
#option FAKE par defaut
if [ $OPTION -eq 3 ] || [ $OPTIND -lt 2 ]; then
ADDRESS=$(FAKE_ADD $LOCAL_ADDRESS)
echo "adresse creee : $ADDRESS"
MAJ_ADD $ADDRESS
fi
if [ $OPTION -eq 4 ]; then
echo "-a/--address X.X.X.X : forcer a une adresse precisee"
echo "-l|t/--local/--true : forcer a l'adresse locale"
echo "-h/--help : aide"
echo "-f/--fake/--false et choix par default : casser le lien reel"
fi
exit 0
else
echo "Serveur(s) DOWN, ABANDON"
exit 1
fi
Bon, question à cent balles, que fait donc cette machine à café??? :ane: ben en fait c’est relatif à mon topic… celui-çi http://www.clubic.com/forum/index.php?showtopic=292763
Donc, voilà ça met l’adresse du site no-ip à jour, et ça permet de casser le lien pour les fanas de sécurité lorsqu’on en a plus besoin…!
Bon, vous me direz que mettre les login et mdp dans le code, y’a mieux côté sécurité… Mais, bon c’est un bon début, je pense…même si on aurait pu faire plus simple et moins usine à gaz je pense!
Merci Swife ! :hello:
:bounce:
en tous les cas, je trouve ce topic intéréssant, et utile si on veut apprendre le bash ou se perfectionner!
Bonne idée swife!
pour ceux que ça interesse, j’ai completé et corrigé l’utilitaire de conversion de ldif en vcf… voir plus haut!
:pt1cable: en plus ça marche! :ane:
bye
#!/bin/bash
# convertis des fichiers musicaux au format mp3 ou ogg
# argument 1 le format de convertion
# le script doit être dans le même répertoire que les fichiers à convertir
if [ $# -lt 1 ]; then
echo -e "Usage: toconvert 'extention de convertion'\ntoconvert mp3"
exit
fi
ext=$1
function toconvert () {
if [ ! -f "$1" ]; then
echo "Fichier $1 n'existe pas"
else
file=`echo $1 | cut -d '.' -f1`
mplayer -ao pcm:file="${file}.wav" "$1"
if [ ${2} = "mp3" ]; then
lame -h -b 192 "${file}.wav" "${file}.${2}"
fi
if [ ${2} = "ogg" ]; then
oggenc "${file}.wav" -b 256 "${file}.${2}"
fi
rm -f "${file}.wav"
fi
}
for file in *
do
toconvert "$file" "$ext"
done
exit
#! /bin/sh
export LDIFAMILYNAME="contactIPOD"
export DETECTIONCARD="begin:vcard"
declare LDIFILE="$1"
#is $1 really LDIFILE?
if [ -n "$LDIFILE" ] && [ "${LDIFILE##*.}" == "ldif" ] || [ "${LDIFILE##*.}" == "LDIF" ] && [ -e "$LDIFILE" ]; then
echo "$LDIFILE to be cut in $LDIFAMILYNAME[0-9].vcf, work in progress..."
#translation from LDIF into VCF, in order to cut standard output in vcf files...
#DETECTIONCARD is the pattern
#converting into vcf stream | detection of VCF card, and writing
ldif2vcf2.sh < "$LDIFILE" | awk 'BEGIN{RS=ENVIRON["DETECTIONCARD"]; VCFILE=""} NF!=0{VCFILE = ENVIRON["LDIFAMILYNAME"] (NR-1) ".vcf"; print VCFILE " being created..."; print ENVIRON["DETECTIONCARD"] $0 > VCFILE }'
if [ "$?" != "0" ]; then
echo "An error occured, exiting..."
exit 1
fi
echo "done!"
exit 0
else
echo "Syntax : `basename $0` FILE.ldif"
echo "Beware not to share the same family name with old vcf files; no one precaution"
echo "is taken, so files will be overwritten."
echo "Beware of not using letters with accents..."
exit 1
fi
export -n LDIFAMILYNAME
export -n DETECTIONCARD
ldif2vcf2.sh
#! /usr/bin/awk -f
#if newline = "+n" therefore, "\n" is added in the end of the line...
function PRINT(addedstring, newline) {
ENTRY=ENTRY addedstring
(newline == "+n")?ENTRY=ENTRY "\n":ENTRY}
function INIT_VAR() {
DELETE=""
ENTRY=""
ZIPCODE=""
CITY=""
ADDRESS=""
NOTE=""}
BEGIN{
INIT_VAR()}
/objectclass: groupOfNames/ {DELETE="OK"}
/^cn:/ {if ( ! $2 ) {$2="NOFIRSTNAME"
$3="NONAME"}
#DELETE? I hesitated...if that's what you want, set DELETE to "OK"
PRINT("begin:vcard\nversion:3.0\nn:" $2 ";" $3 ";;;\nfn:" $3 " " $2, "+n")}
/^xmozillanickname:/ {PRINT("nickname:" $2, "+n")}
/^mail:/ {PRINT("url;type=work:" $2, "+n")}
/^mozillaSecondEmail:/ {NOTE="2nd mail: "$2}
/^homePhone:/ {PRINT("tel;type=home:" $2, "+n")}
/^mobile:/ {PRINT("tel;type=cell:" $2, "+n")}
/homePostalAddress:/ {for ( i = 2; i<=NF; i++)
ADDRESS = ADDRESS $i " "}
/mozillaHomeLocalityName:/ {for ( i = 2; i<=NF; i++)
CITY = CITY $i " "}
/mozillaHomePostalCode:/ {for ( i = 2; i<=NF; i++)
ZIPCODE = ZIPCODE $i " "}
#if NOTE not empty, so add "," in the end; else nothing's done!
/^custom1:/ {NOTE?NOTE=NOTE "; ":NOTE
for ( i = 2; i<=NF; i++)
NOTE = NOTE $i " "}
#End of the record...so:
(NF==0) {if ( ADDRESS && ZIPCODE && CITY ) {
PRINT("adr;type=home:;;" ADDRESS ZIPCODE CITY, "+n")
PRINT("label;type=home:" ADDRESS ZIPCODE CITY, "+n")}
if ( NOTE ) {
PRINT("note:" NOTE, "+n")}
PRINT("end:vcard", "-n")
if ( ! DELETE ) { #write on the standard output, the whole card...
print ENTRY}
INIT_VAR()} #prepare to start again...
END{exit 0}
… c’est super rapide!!! chez moi presque immediat pour une cinquantaine de fiches! (J’ai ajouté au passage la prise en compte des surnoms, et les noms apparaissent mieux dans la liste de contacts!)