Problème de lecture / exécution d'un fichier sous Linux créer sous Windows.
Sous Windows (DOS), les lignes de fichier se terminent par les caractères spéciaux "\r\n".
Sous UNIX, les lignes de fichier se terminent par les caractères spéciaux "\n".
Les caractères spéciaux permettant le retour chariot étant différents sous Windows (DOS) et sous Linux (UNIX), il faut penser à les convertir.
Différentes méthodes permettent de le faire.
Avec la commande sed :
$ sed -i 's/\r//g' /nom_du_fichier
Sinon, le caractère "\r" est représenté par "^M" qui s'obtient par la séquence de touches suivantes : "CTRL-V" + "CTRL-M"
$ sed -i 's/^M//' /nom_du_fichier
Avec la commande tr :
$ tr -d '\r' < /mon_fichier_source > /mon_fichier_destination
A l'inverse, convertir un fichier UNIX vers DOS
$ sed 's/$/^M/' /nom_du_fichier
Source : http://www.commentcamarche.net/faq/5978-sed-conversion-retours-chariots-...
Pour rendre un fichier exécutable
$ sudo chmod +x ./nom_du_fichier
Pour afficher la somme MD5 d'un fichier afin d'en assurer son intégrité, il suffit d'utiliser la commande md5sum.
Exemple avec le fichier "test.txt" :
$ cat test.txt
ceci est une ligne
$
Calcul de la somme MD5 du fichier "test.txt" :
$ md5sum test.txt
2f378979d16de47b9d439149be5623db test.txt
$
Modification du fichier "test.txt" :
$ echo "une nouvelle ligne" >> test.txt
$ cat test.txt
ceci est une ligne
une nouvelle ligne
$
Re-calcul de la somme MD5 du fichier "test.txt" :
$ md5sum test.txt
5c69442bc1b1084b60a81190a75c6a0e test.txt
$
Après modification du fichier, la somme MD5 du fichier n'est plus la même.
Il est également possible d'enregistrer la somme MD5 d'un fichier dans un fichier :
$ md5sum test.txt > test.md5
$ cat test.md5
5c69442bc1b1084b60a81190a75c6a0e test.txt
$
De cette manière, il est possible de controler la somme MD5 d'un fichier :
Utilisation de la commande md5sum avec l'option -c et le fichier contenant la somme MD5 en paramètre.
$ md5sum -c test.md5
test.txt: OK
$
Attention : Les 2 fichiers (celui à controler et celui contenant la somme MD5) doivent être au même endroit.
Si le fichier à controler a été altéré :
$ md5sum -c test.md5
test.txt: FAILED
md5sum: WARNING: 1 of 1 computed checksum did NOT match
$
Sous Unix, les fichiers comportant des espaces dans le nom sont très compliqués à gérer sachant que l'espace est interprété comme étant un séparateur.
Voici un exemple qui permet d'afficher la somme MD5 d'une liste de fichiers dont les noms comportent des espaces.
# ls -1
20160524 leclerc 1264.pdf
20160528 boulanger 3290.pdf
20160528 cofiroute 620.pdf
20160529 la mie caline 790.pdf
20160529 le marché aux fleurs 2050.pdf
20160601 cordonnerie leclerc 1000.pdf
20160601 leclerc 990.pdf
20160601 pharmacie 3830.pdf
Les 8 fichiers ci-dessus comportent tous des espaces dans leurs noms.
# while read f; do md5sum "$f"; done <<< $(ls)
57709e696d14838ceeff6500728d1569 20160524 leclerc 1264.pdf
9f870fb12e598c7345cb74c6db15afee 20160528 boulanger 3290.pdf
5bb71357967db84baf6ed4a5fb56c552 20160528 cofiroute 620.pdf
690471607356b9ea798d3d44d69f478d 20160529 la mie caline 790.pdf
519a250059f5d8bc93af22d2ae02512f 20160529 le marché aux fleurs 2050.pdf
a08e6094bc01a34c508761ebbdae6418 20160601 cordonnerie leclerc 1000.pdf
c8f36624113710939365dd0a4daeb30c 20160601 leclerc 990.pdf
387ce36eaa18d383bd1950ee17a4fdff 20160601 pharmacie 3830.pdf
La commande read, dans la boucle while, interprète correctement les noms de fichiers provenant de la commande ls.
Ne pas oublier les 3 chevrons vers la gauche "<<<" entre la commande ls et la boucle while
mcrypt & mdecrypt sont des programmes qui permettent de chiffrer / déchiffer des fichiers avec un mot de passe.
Le programme mcrypt créé un nouveau fichier portant l'extension .nc avec des permissions 0600
Pour l'installer :
Pour chiffrer un fichier
$ mcrypt monFichier
Enter the passphrase (maximum of 512 characters)
Please use a combination of upper and lower case letters and numbers.
Enter passphrase:
Enter passphrase:
File monFichier was encrypted.
$ ls -l monFichier*
-rw-r--r-- 1 ronan ronan 0 2011-11-05 15:24 monFichier
-rw------- 1 ronan ronan 109 2011-11-05 15:24 monFichier.nc
$
Pour chiffrer un fichier et supprimer le fichier source
$ mcrypt -u monFichier
Enter the passphrase (maximum of 512 characters)
Please use a combination of upper and lower case letters and numbers.
Enter passphrase:
Enter passphrase:
File monFichier was encrypted.
$ ls -l monFichier*
-rw------- 1 ronan ronan 109 2011-11-05 15:24 monFichier.nc
$
Pour chiffrer un fichier avec une compression gzip
$ mcrypt -z monFichier
Enter the passphrase (maximum of 512 characters)
Please use a combination of upper and lower case letters and numbers.
Enter passphrase:
Enter passphrase:
File monFichier was encrypted.
$ ls -l monFichier*
-rw-r--r-- 1 ronan ronan 0 2011-11-05 15:31 monFichier
-rw------- 1 ronan ronan 141 2011-11-05 15:31 monFichier.gz.nc
$
Lister tous les algorithmes utilisable par mcrypt
$ mcrypt --list
cast-128 (16): cbc cfb ctr ecb ncfb nofb ofb
gost (32): cbc cfb ctr ecb ncfb nofb ofb
rijndael-128 (32): cbc cfb ctr ecb ncfb nofb ofb
twofish (32): cbc cfb ctr ecb ncfb nofb ofb
arcfour (256): stream
cast-256 (32): cbc cfb ctr ecb ncfb nofb ofb
loki97 (32): cbc cfb ctr ecb ncfb nofb ofb
rijndael-192 (32): cbc cfb ctr ecb ncfb nofb ofb
saferplus (32): cbc cfb ctr ecb ncfb nofb ofb
wake (32): stream
blowfish-compat (56): cbc cfb ctr ecb ncfb nofb ofb
des (8): cbc cfb ctr ecb ncfb nofb ofb
rijndael-256 (32): cbc cfb ctr ecb ncfb nofb ofb
serpent (32): cbc cfb ctr ecb ncfb nofb ofb
xtea (16): cbc cfb ctr ecb ncfb nofb ofb
blowfish (56): cbc cfb ctr ecb ncfb nofb ofb
enigma (13): stream
rc2 (128): cbc cfb ctr ecb ncfb nofb ofb
tripledes (24): cbc cfb ctr ecb ncfb nofb ofb
$
Chiffrer un fichier en utilisant l'algorithme "DES"
$ mcrypt -a des monFichier
Enter the passphrase (maximum of 512 characters)
Please use a combination of upper and lower case letters and numbers.
Enter passphrase:
Enter passphrase:
File monFichier was encrypted.
$ ls -l monFichier*
-rw-r--r-- 1 ronan ronan 0 2011-11-05 15:31 monFichier
-rw------- 1 ronan ronan 84 2011-11-05 15:31 monFichier.nc
$
Obtenir des infos sur le fichier chiffré
$ file monFichier.nc
monFichier.nc: mcrypt 2.5 encrypted data, algorithm: des, keysize: 8 bytes, mode: cbc,
$
Déchiffrer un fichier
$ ls -l monFichier*
-rw------- 1 ronan ronan 84 2011-11-05 15:31 monFichier.nc
$ mcrypt -d monFichier.nc
Enter passphrase:
File monFichier.nc was decrypted.
$ ls -l monFichier*
-rw------- 1 ronan ronan 0 2011-11-05 15:31 monFichier
-rw------- 1 ronan ronan 84 2011-11-05 15:31 monFichier.nc
$
Ou en utilisant le programme mdecrypt
$ ls -l monFichier*
-rw------- 1 ronan ronan 84 2011-11-05 15:31 monFichier.nc
$ mdecrypt monFichier.nc
Enter passphrase:
File monFichier.nc was decrypted.
$ ls -l monFichier*
-rw------- 1 ronan ronan 0 2011-11-05 15:31 monFichier
-rw------- 1 ronan ronan 84 2011-11-05 15:31 monFichier.nc
$
Comment savoir si les fichiers présents dans le dossier "DOSSIERX" du serveur "SERVEURA" sont exactement les mêmes que ceux présents dans le dossier "DOSSIERY" du serveur "SERVEURB" ?
Grâce à la commande sha256sum et une connexion ssh correctement configurée.
Exécuter le commande suivante sur le serveur "SERVEURA".
$ find /DOSSIERX -type f -exec sha256sum {} \; | ssh SERVEURB 'cd /DOSSIERY && sha256sum --quiet -c -'
Idem, mais en excluant un dossier de la recherche (.git par exemple):
$ find /DOSSIERX -type f -not -path */.git/* -exec sha256sum {} \; | ssh SERVEURB 'cd /DOSSIERY && sha256sum --quiet -c -'
Pour connaitre la taille d'un dossier :
$ sudo du -hs /nom_du_dossier
Rechercher tous les fichiers *.jpg présents dans le répertoire ~/images (sous-répertoires inclus) et les copier dans le répertoire imagesJPG.
$ find ~/images -name '*.jpg' -print0 | xargs -I '{}' -0 cp {} ~/imagesJPG/
L'option -print0 de la commande find et -0 de la commande xargs permet de prendre en compte les fichiers comportant des espaces dans leurs noms.
La commande dd permet de créer des fichiers d'une taille bien précise.
Créer un fichier vide de 1 Mo (1024 blocs de 1Ko):
$ dd if=/dev/zero of=zzz bs=1k count=1024
1024+0 enregistrements lus
1024+0 enregistrements écrits
1048576 octets (1,0 MB) copiés, 0,0108743 s, 96,4 MB/s
$ ls -l zzz
-rw-r--r-- 1 r.quennec mkpasswd 1,0M 23 mai 10:53 zzz
$
Créer un fichier avec des données aléatoires de 1 Mo (1024 blocs de 1Ko):
$ dd if=/dev/urandom of=zzz bs=1k count=1024
1024+0 enregistrements lus
1024+0 enregistrements écrits
1048576 octets (1,0 MB) copiés, 0,239581 s, 4,4 MB/s
$ wc zzz
4074 23182 1048576 zzz
$
Lire un fichier PDF en ligne commande est possible grâce à la commande less
$ less Verne-Le_tour_du_monde_en_80_jours.InLibroVeritas.net_oeuvre18616.pdf
Jules Verne
LE TOUR DU
MONDE EN
QUATRE-VINGTS
JOURS
- Collection Romans / Nouvelles -
Retrouvez cette oeuvre et beaucoup d'autres sur
http://www.inlibroveritas.net
^L^LTable des matières
LE TOUR DU MONDE EN QUATRE-VINGTS JOURS......................1
I - DANS LEQUEL PHILEAS FOGG ET PASSEPARTOUT
S'ACCEPTENT RÉCIPROQUEMENT L'UN COMME
MAÎTRE, L'AUTRE COMME DOMESTIQUE...............................2
II - OU PASSEPARTOUT EST CONVAINCU QU'IL A ENFIN
TROUVE SON IDEAL......................................................................8
III - OU S'ENGAGE UNE CONVERSATION QUI POURRA
COUTER CHER A PHILEAS FOGG.............................................12
IV - DANS LEQUEL PHILEAS FOGG STUPEFIE
PASSEPARTOUT, SON DOMESTIQUE.......................................21
V - DANS LEQUEL UNE NOUVELLE VALEUR APPARAÎT
SUR LA PLACE DE LONDRES
...................
$
Pour modifier le propriétaire d'un fichier ou d'un dossier
$ sudo chown root /u
change le propriétaire de /u en « root ».
$ sudo chown root:staff /u
même chose en changeant également le groupe en « staff ».
$ sudo chown -hR root /u
change le propriétaire de /u et ses sous-fichiers en « root ».
Changer le propriétaire et/ou le groupe de chaque FICHIER en PROPRIÉTAIRE et/ou GROUPE. Avec l’option --reference, modifier le propriétaire et le groupe de chaque fichier en celui du FICHIER-R.
-c, --changes utiliser le mode bavard en ne signalant que les modifications --dereference affecter la cible de chaque lien symbolique (comportement par défaut) plutôt que le lien symbolique lui-même -h, --no-dereference modifier les liens symboliques au lieu des fichiers référencés (utile seulement sur les systèmes permettant de changer le propriétaire d’un lien symbolique) --from=PROPRIETAIRE_COURANT:GROUPE_COURANT changer le propriétaire et/ou le groupe de chaque fichier seulement s’il y a concordance avec le propriétaire et/ou le groupe courant spécifié. Les deux peuvent être omis, auquel cas la concordance n’est pas requise pour le paramètre non spécifié --no-preserve-root ne pas traiter « / » de manière spéciale (par défaut) --preserve-root ne pas opérer récursivement sur « / » -f, --silent, --quiet supprimer la plupart des messages d’erreur --reference=FICHIER-R utiliser le propriétaire et le groupe du FICHIER-R au lieu de valeurs explicites PROPRIÉTAIRE:GROUPE -R, --recursive modifier récursivement fichiers et répertoires -v, --verbose afficher un diagnostic pour chaque fichier traité Les options suivantes modifient la façon dont est parcourue la hiérarchie lorsque l’option -R est également spécifiée. Si plus d’une option est spécifiée, seule la dernière est prise en compte. -H si un paramètre de la ligne de commande est un lien symbolique vers un répertoire, le parcourir -L parcourir chaque lien symbolique rencontré menant à un répertoire -P ne parcourir aucun lien symbolique (par défaut) --help afficher l’aide-mémoire et quitter --version afficher le nom et la version du logiciel et quitter Le propriétaire n’est pas modifié s’il n’est pas spécifié. Le groupe reste inchangé s’il n’est pas spécifié, sauf si cela est implicitement demandé avec un « : » suivant un PROPRIÉTAIRE symbolique, auquel cas il sera modifié en ce nom de propriétaire. Le PROPRIÉTAIRE et le GROUPE peuvent être numériques ou symboliques.
Pour modifier les permissions d'un fichier ou d'un dossier
$ sudo chmod 777 ./nom_du_fichier
modifie les permissions pour le fichier
$ sudo chmod 777 ./nom_du_dossier
modifie les permissions pour le dossier
$ sudo chmod -R 777 ./nom_du_dossier
modifie les permissions pour le dossier et tous les fichiers du dossier
Les permission sont données dans l'ordre user - groupe - autre
La lecture = 4
L'écriture = 2
L'exécution = 1
Tous les droits = 7
Pour connaitre le nom du dossier courant, saisir dans une console la commande :
$ pwd
Pour se rendre dans son répertoire personnel saisir dans une console l'une des 2 commandes suivantes:
$ cd
$ cd ~
Pour retourner au dossier précédent :
$ cd -
Rechercher les dossiers modifiés dans les dernières 24 heures et lister leurs contenus :
$ find /dossier_origine/* -mtime 0 -type d -exec ls -lht {} \;
l'option -mtime permet de spécifier le nombre de période de 24 heures.
l'option -type d permet d'indiquer que la recherche s'effectue uniquement sur les dossiers.
l'option -exec ls -lht {} \; permet d'exécuter la commande ls pour chaque dossier trouvé.
Le principe est simple. La commande find recherche tous les fichiers comportant un espace puis exécute pour chaque fichier trouvé la commande rename qui remplace tous les espaces par des underscores.
$ find ./ -depth -name "* *" -exec rename 's/ /_/g' "{}" \;
Pour renommer un fichier, il suffit d'utiliser la commande mv.
Exemple :
$ mv ./foo ./bar
Cette commande va renommer le fichier foo en bar.
Voici une petite astuce bien sympa qui consiste à renommer un fichier en y ajoutant une extension quelconque.
$ mv ./foo{,.txt}
Cette commande va donc renommer le fichier foo en foo.txt
En utilisant l'option -delete
$ sudo find /mon-repertoire -name mon-document -delete
ou en utilisant l'option -exec et la fonction rm
$ sudo find /mon-repertoire -name mon-document -exec rm {} \;
la chaine de caractère "{}" est remplacée par le résultat de la recherche
ou en combinant les commandes find, xargs et rm
$ find /mon-repertoire -name '*.txt' -print0 | xargs -0 rm -f
$ find /mon-repertoire -name '*.txt' -print0 | xargs -I '{}' -0 rm -f {}
L'option -print0 de la commande find et -0 de la commande xargs permet de prendre en compte les fichiers comportant des espaces dans leurs noms.
La synchronisation de dossiers et/ou de fichiers se fait via le programme RSYNC
$ sudo rsync -av --del /source_a_sauvegarder/ /destination_de_la_sauvegarde/
-a : préserve l'intégralité des dossiers et fichiers
-v : verbose (affiche le détail à l'écran)
--del : supprime les fichiers et dossiers de destination qui ne sont plus dans source
rsync via SSH
$ rsync -a /source/ login@serveur.org:/destination/
SCP (Secure Copy Protocol) est un protocole permettant le transfert de fichiers en toute sécurité d'une machine locale vers une machine distante et inversement. Tous les transferts de fichiers sont effectués via le protocol SSH.
Transférer le fichier local file1.txt vers le répertoire courant de la machine distante 192.168.1.100
$ scp ./file1.txt user@192.168.1.100:./
Transférer le fichier file1.txt de la machine distante vers le répertoire courant de la machine locale
$ scp user@192.168.1.100:./file1.txt ./
Transférer tout le répertoire local /var/test vers le répertoire /tmp de la machine distante 192.168.1.100
$ scp -r /var/test user@192.168.1.100:/tmp/
SSH permet d'utiliser des pipelines de commandes, et d'utiliser des tubes d'entrées/sorties comme toute autre commande, a ceci prêt que la redirection se fait vers, ou depuis la machine distante.
Celà peut, entre autre, servir à transférer des fichiers:
$ ssh serveur "cat fichier_distant" > fichier_local
L'utilité d'une telle commande est discutable, la commande scp faisant exactement la même chose.
Maintenant, imaginons un fichier de plusieurs mégas, et une bande passante assez limitée:
$ ssh serveur "gzip -c fichier_distant" > fichier_local.gz
ici, le serveur compresse le fichier, la commande écrit le fichier compressé sur le client.
On peut pousser encore plus loin, si l'on ne veut pas récupérer un fichier gzipé, mais diminuer quand même l'utilisation de la bande passante:
$ ssh serveur "gzip -c fichier_distant" |gunzip > fichier_local