Bash commands

De FroggDev - Fr
Aller à : navigation, rechercher

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