Bash commands
Sommaire
Manuel
man {CommandName}
Bases : fichiers et répertoires
cd changer le répertoire courrant find ./ -name {Filename} recherche touch {FileName} créer un fichier vide mv {FileName} {NewFileName} déplacer un fichier ou répertoire cp {FileName} {NewFileName} copier un fichier ou répertoire (-R option pour répertoire / -V option pour mode verbose) mkdir -P créer un répertoire (-P option ne pas faire d'avertissement si existe déjà) rm -R {FolderName} supprimer un fichier ou répertoire wget http://filetarget.ext télécharge un fichier cat /etc/passwd affiche le contenu d'un fichier grep {Text} {FileName} recherche Text dans FileName tail -n {Number} {FileName} affiche les n dernières ligne d'un fichier (tail -f affiche un fichier un stream) head -n {Number} {FileName} affiche les n premières ligne d'un fichier ls -slash affiche le contenu d'un répertoire -t trier par date -s affiche la taille -h taille lisible par l'humain -l affichage long -a tout le contenu (inclu les fichiers commencant par .) -d seulement les repertoires (ajouter ./*/) -r inverser
Bases : disques
df -h affiche l'occupation du disque dur du -km --max-depth=1 | sort -nr affiche la taille d'un répertoire (se placer dedans avant de lancer la commande) dd if={ImageName}.img of=/dev/sd{DriveId} appliquer une image disque à un disque lsblk détail des disques udevadm info -a -n /dev/sd{b1} encore plus de détail sur le disque choisi fdisk outil permettant de gérer les partitions : http://www.howtogeek.com/106873/how-to-use-fdisk-to-manage-partitions-on-linux/
Bases : utilisateur
su - {UserName} change l'utilisateur courrant sudo avant une commande ex: sudo gedit /etc/network/interfaces sudo -i passer en mode root passwd {UserName} demande le nouveau mot de passe pour l'utilisateur groupadd {group} ajoute un groupe à un utilisateur gpasswd -a {user} {group} créer/modifie un utilisateur useradd {user} créer un utilisateur useradd -d /data/{user} {user} créer un utilisateur avec une home dir spécifiée useradd -u {number} {user} créer un utilisateur avec un ID spécifié useradd -M {user} créer un utilisateur sans home dir useradd -s /sbin/nologin {user} créer un utilisateur sans accès au shell useradd -f 45 {user} créer un utilisateur avec un mot de passe qui expire dans 45 jours useradd -e AAAA-MM-DD {user} créer un utilisateur avec une date d'expiration useradd -c "{Custom Comment}" {user} créer un utilisateur avec un commentaire spécifié userdel {usser} -r Supprime un utilisateur (et son home dir) mkhomedir_helper {user} créer home dir par défaut de l'utilisateur usermod {user} -G {group} ajouter l'utilisateur au groupe chown {User:Group} -R {Folder} change l'utilisateur du répertoire (-R pour récursion) chmod 777 -R {Folder} change les droits du répertoire (-R pour récursion) htpasswd -b -m /Usr/passwd {User} {Pass} change/créer un utilisateur et mot de passe pwHash=$( echo -n {pass} | openssl sha1 ) sha1 encoder un mot de passe
Bases : divers
echo "{Text}" affiche un texte (option -e pour \n) cat "{Text}" concaténation du texte vers output set affiche les variables d’environnements sync rafraîchi la mémoire /etc/init.d/networking restart redémarre les interfaces réseaux ln -s {FolderName} {NewFolderName} créer un lien symbolique rm -f {SymbolicLink} Supprimer un lien symbolique (option -f pour ne pas demander de confirmation) a2enmod {ModuleName} activer un module pour apache2 export {VAR}="{Value}" créer une variable d’environnement read -p "{text}" {VAR} capture la saisie utilisateur echo "MSG" | mail -s "Subject" admin@frogg.fr envoyer un mail c=$a"text"$b concatenation de variables + texte
Structure
les espaces sont important dans la syntaxe /!\
a=$b assigne une valeur, sans espace sinon ca ne marche pas $((a + b)) addition
if [ ! $a = $b ]; then avec les espaces et il faut au moins une instruction entre "then" et "fi" {Script to execute} elif [ ! $a = $c ]; then {Script to execute} else {Script to execute} fi [ $a = $b ] && return 1 || return 0 alternative d'affichage (si instruction unique) if [ $a = $b -o $b = $c ] -o pour OU if [ $a = $b -a $b = $c ] -a pour ET if [ $a = $b -o $b = $c ] || [ $a = $b -a $a = $c ] plusieurs conditions OU if [ $a = $b -o $b = $c ] && [ $a = $b -a $a = $c ] plusieurs conditions ET if [ -z $a ] est vide ou null if [ ! -z $a ] n'est pas egal à "" if [ -n $a ] n'est pas vide if [ $a -eq $b ] égal if [ $a -ne $b ] pas égal if [ $a -gt $b ] plus grand if [ $a -ge $b ] plus grand ou égal if [ $a -lt $b ] plus petit if [ $a -le $b ] plus petit ou égal if [ -d $a ] est un répertoire if [ -e $a ] fichier existe if [ -f $a ] est un fichier if [ -g $a ] groupe autorisé pour le fichier if [ -r $a ] est lisible if [ -s $a ] fichier non vide (> 0kb) if [ -u $a ] utilisateur autorisé pour le fichier if [ -w $a ] est écrivable if [ -x $a ] est exécutable if [[ "$a" =~ "$b" ]] contient (format reg exp) if [[ $a == *$b* ]] contient (format glob) if [ "${a/$b}" = $a ] contient (format string) if [ -z "${a##*$b*}" ] contient (format string, compatible dropbox !) if [ ${a/$b} = $a ] contient (format string)
for file in {Folder}/* boucle for do {Script à exécuter} done for i in {$START..$END} boucle for (autre notation) for (( i=0; i<=$END; i++ )) boucle for (autre notation)
plus d'infos: http://www.cyberciti.biz/faq/bash-for-loop/
while true; do boucle while {Script à exécuter} done
http://www.cyberciti.biz/faq/bash-while-loop/
case $1 in boucle case 0) {Script à exécuter} ;; sort du case (ne teste rien d'autre) 7) {Script à exécuter} ;;& continuer pour voir si d'autre case corresponde * ) tous les cas {Script à exécuter} ;; esac
cat <<EOF >> {FileName} écrit tel quel tout ce qui suit dans un fichier, les retour à la ligne inclus {StringToWrite} il ne faut pas d'espace entre le début de ligne et le texte {StringToWrite} {StringToWrite} EOF
Fonction
functionName() déclare un fonction { {Script à exécuter} $1 $1 premier paramètre $2 $2 second paramètre }
functionName "Param1" $param2 appel de la fonction
function fun1() récupérer le resultat d'une fonction via echo { echo 34 } res=$(fun1) res = le retour de la fonction
function fun2() récupérer le resultat d'une fonction via return { return "OUTPUT" } if func2;then si résultat alors c'est 1 sinon c'est 0 echo "FOUND OUTPUT" else echo "NO OUTPUT or returned value=FALSE" fi
Compression
tar -cvzf {Archive.tgz} {TargetFolder} créer une archive tar tar -C {TargetFolder} -xvzf {Archive.tgz} extrait une archive tar zip -r {Archive.zip} {TargetFolder} créer une archive zip unzip {Archive.zip} -d {TargetFolder} extrait une archive zip unrar {Archive.rar} extrait une archive rar (paquet unrar-free) 7z x {Archive.ext} extrait n'importe quelle archive (paquet 7zip-full)
Commandes spéciales
$0 nom du script ${0##*/} = $(echo $0 | rev | cut -d/ -f1 | rev) tout après / ${0%/*} = $(echo $0 | sed "s/\/$Path//g") tout avant le dernier / ${0#*/} supprime tout avant le premier / ${0%/*} supprime tout après le dernier / ${0%%/*} supprime tout après le premier / ${1%?} supprime le dernier caractère ${0:0:1} premier caractère ${0/a/b} remplace le premier a par b ${0//a/b} remplace tout a par b ${0//@/ } replace les @ par espace (découpe une chaîne comme un split) ${0//[[:alpha:]]/X} remplace alpha par X (marche aussi avec [[:digit:]]) ${0//[a-zA-Z]/X} et aussi avec des expressions régulières ${0^^} en majuscule ${0,,} en minuscule ${#0} taille d'une variable ${!var} créer une variable dynamique DATE=`date '+%Y%m%d'` affiche la date au format AAAAMMJJ DATE=`date '+%Y/%m/%d %H:%M:%S'` affiche la date au format AAAA/MM/JJ HH:MM:SS (${PATH}/*) créer un tableau de donnée avec tout le contenu du répertoire ${PATH} . {FileName} inclus filename dans un script bash {ScriptToExecute} > /dev/null stdout {ScriptToExecute} 2> /dev/null stderr {ScriptToExecute} 2>&1 /dev/null stderr to stdout {ScriptToExecute} 1>&2 /dev/null stdout to stderr {ScriptToExecute} >> /dev/null add to {ScriptToExecute} &> /dev/null stderr and stdout {ScriptToExecute} >> {ToFile} 2>&1 stderr to stdout to file printf '2.4.5a\n2.8b\n2.4.5zz.1\n' | sort -V trier une liste (asc) $(printf "%03d\n" 7) formater un nombre, ici le masque est 3 chiffres: 007 $(expr ${a} + ${b})) forcer l'addition de deux chaines de caractère en numérique echo ${a}| tr -d '\n' supprimer les retour à la ligne d'une variable ((i++)) incrémentation & après l'appel d'un script le lancera en tache de fond
- manipulation des chaîne de caractère
http://tldp.org/LDP/abs/html/string-manipulation.html
- copier un fichier entre deux serveurs ssh
scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-S program][[user@]host1:]file1 ... [[user@]host2:]file2
- supprimer les ^M (chr(10)chr(13) = retour à la ligne windows) d'un fichier
sed -i -e "s/\r//g" filename
- convertir un texte en tableau
ARR=($0) cas basique (string séparé d'espace ou de :)
ARR=(`echo $0 | tr " " "\n"`) avec tr (string séparé par des saut de ligne)
IFS=" " read -ra ARR <<< "$0 avec IFS (string séparé d'espace)
ARR=(`echo $0 | sed -e 's/ /\n/g'`) avec sed (string séparé par des saut de ligne)
pour tester le tableau:
for k in "${ARR[@]}";do echo "[$k]";done
longueur du tableau:
size=${#ARR[@]}
- copier un fichier a distance via ssh
ssh <user>@<ip_du_serveur> -p <port> "echo $(cat ~/.ssh/id_rsa.pub) >> .ssh/authorized_keys"
Rechercher
grep -R "TEXT" ./ rechercher TEXT dans le repertoire courant & sous répertoire find ./ -name "filename" -type f -exec grep montexte {} \;
Explications :
find ./ rechercher à partir du répertoire courant -name "filename" on cherche un fichier correspondant au pattern -type f on cherche un fichier -exec on execute une commande à chaque fichier trouvé grep montexte {} on recherche "montexte" dans les fichiers ( {} remplace le nom des fichiers trouvés). \; fin de l'option exec ( \ permet d'ajouter à la suite d'autres commandes)
- le plus rapide:
grep -r -n -i --include="*.htm *.php" "TEXTSTRING" . "-i" makes it case insensitlve "./" at the end means you want to start from your current directory, this could be substituted with any directory. "-r" means do this recursively, right down the directory tree "-n" prints the line number for matches. "--include" lets you add file names, extensions. Wildcards accepted
Système
halt poweroff reboot shutdown
mémoire
free -m cat /proc/meminfo top
swap
swapoff -a swapon -a
Autres
pinky
Réseau
nslookup domaine.example.com
nc -zv 127.0.0.1 80
Envoyer un Mail via netcat
echo "HELO esxi.frogg.fr" > mail.txt echo "AUTH LOGIN" >> mail.txt echo "BASE64encodedEMAIL" >> mail.txt echo "BASE64encodedPASS" >> mail.txt echo "MAIL FROM:esxi@frogg.fr" >> mail.txt echo "RCPT TO:admin@frogg.fr" >> mail.txt echo "DATA" >> mail.txt echo "From: admin@frogg.fr" >> mail.txt echo "To: admin@frogg.fr" >> mail.txt echo "Subject: FroggPT BackUP result" >> mail.txt echo "" >> mail.txt echo "THIS IS A TEST" >> mail.txt echo "" >> mail.txt echo "." >> mail.txt echo "QUIT" >> mail.txt # Send the mail /usr/bin/nc smtp-auth.Register.eu 25 < mail.txt
Cryptage
encryptage
echo -n "password" | md5sum md5 encrypt echo -n "password" | openssl dgst -sha1 sha1 encrypt echo "password" | base64 base64 encrypt
decryptage
echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode