Différence entre ‘+’ et ‘\;’ à la fin de la commande -exec

Différence entre ‘+’ et ‘\;’ à la fin de la commande -exec

Bonjour à tous, j’écris juste un petit billet car je me suis demandé quelle était la différence entre l’utilisation du + et \; à la fin de -exec lors de l’utilisation de la commande find ? -exec ... \;  lance une commande après l’autre. Si vous avez trois fichiers, la ligne de commande va être exécuter trois fois. -exec ... {} +  est utilisé pour les commandes qui peuvent prendre en argument plus d’un fichier à la fois (exemple : cat, stat, ls). Le fichier trouvé par find sont chaîné ensemble comme avec la commande xargs . Voici un petit comparatif entre les deux commandes sur 10 000 fichiers : Shell morgan@morgan-Studio-1749$ cd /tmp morgan@morgan-Studio-1749:/tmp$ mkdir testdir morgan@morgan-Studio-1749:/tmp$ touch testdir/{0000..9999} morgan@morgan-Studio-1749:/tmp$ time find testdir/ -type f -exec cat {} \; real 0m10.779s user 0m0.691s sys 0m9.908s morgan@morgan-Studio-1749:/tmp$ time find testdir/ -type f -exec cat {} + real 0m0.055s user 0m0.018s sys 0m0.037s morgan@morgan-Studio-1749:/tmp$ 12345678910111213141516 morgan@morgan-Studio-1749$ cd /tmpmorgan@morgan-Studio-1749:/tmp$ mkdir testdirmorgan@morgan-Studio-1749:/tmp$ touch testdir/{0000..9999} morgan@morgan-Studio-1749:/tmp$ time find testdir/ -type f -exec cat {} \; real 0m10.779suser 0m0.691ssys 0m9.908s morgan@morgan-Studio-1749:/tmp$ time find testdir/ -type f -exec cat {} + real 0m0.055suser 0m0.018ssys 0m0.037smorgan@morgan-Studio-1749:/tmp$ On peux voir que l’utilisation du + (opérateur de concaténation) améliore grandement la vitesse d’exécution (attention, cela ne fonctionne que sur les commandes qui accepte plusieurs fichiers en paramètres). Qu’est-ce qu’il se passe vraiment ? Avec \; , la commande exécuté seras : cat 1; cat 2; cat 3 . Avec + , la commande exécuté seras : cat 1 2 3...

Read More

Empêcher un fichier d’être modifié ou supprimé

Empêcher un fichier d’être modifié ou supprimé

Il est possible d’empêcher n’importe quel fichier d’être modifié, supprimé ou même renommé, et ce, par par n’importe quel utilisateur, root y compris. Comment faire ? Pour faire cela il faut utiliser la commande : chattr qui modifie les attributs d’un fichier. L’option qui nous intéresse est l’option « i » : « +i » pour activer la protection et « -i » pour désactiver cette protection . Le « i » signifie immuable (ou immutable en anglais) qui veux dire « ne peuvent pas être modifiés ». chattr peut aussi protéger des répertoires entiers. chattr doit être utilisé avec les privilèges root. Protéger un fichier : sudo chattr +i <fichier ou repertoire> Retirer la protection d’un fichier protéger sudo chattr -i <fichier ou repertoire> Si vous appliquez ces commandes sur un répertoire, vous pouvez utilisez l’option « -R » pour exécutez la commande récursivement. Exemples : créons un fichier quelconque : echo "Ceci est un fichier tres important." >important.txt avec les droits root, utiliser chattr : sudo chattr +i important.txt Est-ce que l’utilisateur root peut modifier le fichier ? Est-ce que je peux renommé le fichier avec les droits super utilisateurs ? Est-ce que je peux le supprimé ? Si vous voulez pouvoir effectuer l’une de ces actions il faudra donc enlever la protection du fichier avec l’attribut « -i » comme nous l’avons-vu précédemment : sudo chattr -i important.txt   traduction de l’article suivant :...

Read More

Comment utiliser le système de notification avec qml et unity

Comment utiliser le système de notification avec qml et unity

Comment utiliser le système de notification d’ubuntu (et d’autres distribution) depuis QML ? Autant que je le sache, il n’existe pas d’API QML pour accéder au système de notification. Pour éviter d’avoir à créer un plugin C++ pour avoir les notifications sur une application desktop, il est plus simple d’utiliser pyotherside et d’appeler un petit module python pour effectuer le travail. Pré-requis : Vous l’aurez compris, il suffit de s’assurer que pyotherside est installé. D’abbord, assuré vous d’avoir les bon ppa Shell sudo add-apt-repository ppa:ubuntu-sdk-team/ppa sudo add-apt-repository ppa:checkbox-dev/ppa sudo apt-get update 123 sudo add-apt-repository ppa:ubuntu-sdk-team/ppasudo add-apt-repository ppa:checkbox-dev/ppasudo apt-get update puis lancer l’installation Shell sudo ap-get install pyotherside 1 sudo ap-get install pyotherside Au boulot : Et voici la petite application QML : JavaScript import QtQuick 2.0 import Ubuntu.Components 1.1 import io.thp.pyotherside 1.2 /*! \brief MainView with a Label and Button elements. */ MainView { // objectName for functional testing purposes (autopilot-qt5) objectName: "mainView" // Note! applicationName needs to match the "name" field of the click manifest applicationName: "com.ubuntu.developer.username.notification" /* This property enables the application to change orientation when the device is rotated. The default is false. */ //automaticOrientation: true // Removes the old toolbar and enables new features of the new header. useDeprecatedToolbar: false width: units.gu(100) height: units.gu(75) Page { title: i18n.tr("Simple") Column { spacing: units.gu(1) anchors { margins: units.gu(2) fill: parent } Label { id: label objectName: "label" text: i18n.tr("Hello..") } Button { objectName: "button" width: parent.width text: i18n.tr("Tap me!") onClicked: { //label.text = i18n.tr("..world!") py.call('notify.pressme', [], function() {}); } } Python { id: py Component.onCompleted: { addImportPath(Qt.resolvedUrl('.')); importModule('notify', function() {}); } } } } } 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 import QtQuick 2.0import Ubuntu.Components 1.1import io.thp.pyotherside 1.2/*!    \brief MainView with a Label and Button elements.*/ MainView {    // objectName for functional testing purposes (autopilot-qt5)    objectName: "mainView"     // Note! applicationName needs to match the "name" field of the click manifest    applicationName: "com.ubuntu.developer.username.notification"     /*     This property enables the application to change orientation     when the device is rotated. The default is false.    */    //automaticOrientation: true     // Removes the old toolbar and enables new features of the new header.    useDeprecatedToolbar: false     width: units.gu(100)    height: units.gu(75)     Page {        title: i18n.tr("Simple")         Column {            spacing: units.gu(1)            anchors {                margins: units.gu(2)                fill: parent            }             Label {                id: label                objectName: "label"                 text: i18n.tr("Hello..")            }             Button {                objectName: "button"                width: parent.width                 text: i18n.tr("Tap me!")                 onClicked: {                    //label.text = i18n.tr("..world!")                      py.call('notify.pressme', [], function() {});                }            }            Python {                  id: py                  Component.onCompleted: {                      addImportPath(Qt.resolvedUrl('.'));                      importModule('notify', function() {});                  }              }        }    }} ensuite créer un fichier nommé notify.py dans le même répertoire que le fichier qml Python #!/usr/bin/env python3 import subprocess def pressme(): subprocess.call(["notify-send", "hello morgan", "http://morgan-durand.com"]) 123456 #!/usr/bin/env python3 import subprocess def pressme():    subprocess.call(["notify-send", "hello morgan", "http://morgan-durand.com"]) Et voila le...

Read More

Comment utiliser « cat » ou « less » sur un fichier libreoffice .odt ?

Comment utiliser « cat » ou « less » sur un fichier libreoffice .odt ?

Bonjour à tous, aujourd’hui je vais vous présenter un petit logiciel bien sympas, il va vous permettre de lire les fichiers libreoffice en console. C’est une petite astuce qui s’avérer très utile lorsqu’on veux voir le contenue d’un fichier .odt en mode console (pour une application avec python / php / whatever). La soltuion est d’utiliser « odt2txt ». Cette ligne de commande est fournis dans deux packages différent. Le premier est nomé odt2txt que vous pouvez installé : sudo apt-get install odt2txt  et par le package unoconv (qui offre un plus large éventails de choix pour les formats libreoffice), que vous pouvez installé comme ceci : sudo apt-get install unoconv Si vous avez les deux, vous pouvez choisir lequel utiliser en utilisant le système de commande alternartive : sudo update-alternatives --config odt2txt Si vous utilisez « odt2txt » fournis par le paquet « odt2txt », vous avez juste à utiliser : odt2txt file.odt Si vous utilisez celui fournir par le package : « unoconv« , vous devez l’utiliser comme ceci : odt2txt --stdout file.odt Utiliser le pipe pour utiliser less : odt2txt file.odt | less NB : si vous n’utiliser pas l’option --stdout, unoconv va écrire le résultat dans un fichier appelé « file.txt ».  ...

Read More

Comment parser une chaine JSON en ligne de commande

Comment parser une chaine JSON en ligne de commande

Pour pouvoir parser du JSON avec sont terminal, il vous faudra un petit logiciel bien sympa (qui n’est pas présent dans les dépôts), j’ai nommé : jq Shell wget http://stedolan.github.io/jq/download/linux32/jq (32-bit) wget http://stedolan.github.io/jq/download/linux64/jq (64-bit) chmod +x ./jq sudo cp jq /usr/bin 1234 wget http://stedolan.github.io/jq/download/linux32/jq (32-bit)wget http://stedolan.github.io/jq/download/linux64/jq (64-bit)chmod +x ./jqsudo cp jq /usr/bin Les fichiers binaires de jq sont aussi disponible pour windows et OS X. Le code source est disponible sous licence MIT. Voici une liste d’exemple pour illustré le fonctionnement de jq : $ cat json.txt { "name": "Google", "location": { "street": "1600 Amphitheatre Parkway", "city": "Mountain View", "state": "California", "country": "US" }, "employees": [ { "name": "Michael", "division": "Engineering" }, { "name": "Laura", "division": "HR" }, { "name": "Elise", "division": "Marketing" } ] } 12345678910111213141516171819202122232425 {        "name": "Google",        "location":                {                        "street": "1600 Amphitheatre Parkway",                        "city": "Mountain View",                        "state": "California",                        "country": "US"                },        "employees":                [                        {                                "name": "Michael",                                "division": "Engineering"                        },                        {                                "name": "Laura",                                "division": "HR"                        },                        {                                "name": "Elise",                                "division": "Marketing"                        }                ]} Pour parser l’objet  : cat json.txt | jq '.name' retour : "Google" Pour récupérer un attribut de l’objet : cat json.txt | jq '.location.city' retour Shell "Mountain View" 1 "Mountain View" Pour parser une array :   cat json.txt | jq '.employees[0].name' retour : Shell "Michael" 1 "Michael" Pour extraire des champs spécifique : cat json.txt | jq '.location | {street, city}'   Shell { "city": "Mountain View", "street": "1600 Amphitheatre Parkway" } 1234 {  "city": "Mountain View",  "street": "1600 Amphitheatre Parkway"}     Voir l’article...

Read More

Comment sniffer le trafic en ligne de commande avec httpry

Comment sniffer le trafic en ligne de commande avec httpry

Bonjour à tous,   Aujourd’hui je vous présente un petit outil bien sympa qui permet de sniffer le trafic http. Ce petit logiciel peut-être bien utiles pour plusieurs applications : Tester un webservice REST Vérifier que sa machine n’est pas infestée par un malware Vérifier que les utilisateurs ne téléchargent pas de fichier dangereux Analyser le trafic et en faire des statistiques etc …   Cette outil magique s’appel HTTPRY.   Installation du logiciel : Sur ubuntu (14.04 et supérieur) Il suffit de passer par les dépôts officiel sudo apt-get install httpry Sur Fedora, CentOS, RHEL Le logiciel est aussi dans les dépôts sudo yum install httpry Sur debian httpry n’est pas présent dans les dépôts, vous devez le compiler à la main : Shell $ sudo apt-get install gcc make git libpcap0.8-dev $ git clone https://github.com/jbittel/httpry.git $ cd httpry $ make $ sudo make install 12345 $ sudo apt-get install gcc make git libpcap0.8-dev$ git clone https://github.com/jbittel/httpry.git$ cd httpry$ make$ sudo make install Utilisation de httpry  Utilisation basique sudo httpry -i <network-interface>   Dans la plupart des cas on va vouloir sauvegarder des paquets pour pouvoir les « rejoué » plus-tard. Pour cela vous avez l’option ‘-b’ ou ‘-o’. L’option ‘-b’ permet de sauvegarder les paquets HTTP dans un fichier binaire qui pourras être « rejoué » plus tard. L’option ‘-o’ permet de sauvegarder l’output avec l’option « human readable » dans un fichier texte.   Pour sauvegarder les paquets dans un fichier binaire : sudo httpry -i wlan0 -b output.dump Pour pouvoir rejouer des paquets sauvegarder : httpry -r output.dump avec l’option ‘-r’ vous n’avez pas besoin de privilège root. Pour sauvegarder les paquets en dans un fichier texte : sudo httpry -i wlan0 -o output.txt   Utilisation avancé de httpry Si vous voulez filtrer une requete HTTP par méthode (comme GET, POST, PUT, HEAD, CONNECT, etc…) il faut utiliser l’option ‘-m’ : sudo httpry -i wlan0 -m get,head   Si vous avez installer httpry depuis les sources GIT, vous avez une petite collection de script perl qui permettent d’analyser les données fournie par httpry. Voici une petite liste (non exhaustive)  des possibilités fournies par ces script : hostnames : Afficher une liste contenant tout les host names (sans duplications) avec un compteur. find_proxies : Detecter les webproxies. search_terms : Cherche et compte les motifs entrés dans le service de recherche content_analysis : Recherche les urls qui contiennent un certain mot clé. xml_output...

Read More

Avoir deux claviers dans deux langues différentes

Avoir deux claviers dans deux langues différentes

Comment avoir deux claviers dans deux langues différentes ?   Vous avez deux claviers dans des langues différentes ? Par exemple un querty et un azerty sans avoir à spécifier à chaque fois. 1. Il vous suffit d’utiliser xinput pour lister vos clavier : Shell xinput -list | grep key 1 xinput -list | grep key Exemple :   Shell $ xinput -list | grep key ⎣ Virtual core keyboard id=3 [master keyboard (2)] ↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)] ↳ Power Button id=6 [slave keyboard (3)] ↳ Video Bus id=7 [slave keyboard (3)] ↳ Power Button id=8 [slave keyboard (3)] ↳ Sleep Button id=9 [slave keyboard (3)] ↳ 2.4GHz 2way RF Receiver id=10 [slave keyboard (3)] ↳ HP Webcam id=12 [slave keyboard (3)] ↳ AT Translated Set 2 keyboard id=13 [slave keyboard (3)] ↳ HP WMI hotkeys id=15 [slave keyboard (3)] ↳ USB Keyboard id=16 [slave keyboard (3)] ↳ USB Keyboard id=17 [slave keyboard (3)] 12345678910111213 $ xinput -list | grep key⎣ Virtual core keyboard                         id=3    [master keyboard (2)]    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]    ↳ Power Button                              id=6    [slave  keyboard (3)]    ↳ Video Bus                                 id=7    [slave  keyboard (3)]    ↳ Power Button                              id=8    [slave  keyboard (3)]    ↳ Sleep Button                              id=9    [slave  keyboard (3)]    ↳ 2.4GHz 2way RF Receiver                   id=10   [slave  keyboard (3)]    ↳ HP Webcam                                 id=12   [slave  keyboard (3)]    ↳ AT Translated Set 2 keyboard              id=13   [slave  keyboard (3)]    ↳ HP WMI hotkeys                            id=15   [slave  keyboard (3)]    ↳   USB Keyboard                            id=16   [slave  keyboard (3)]    ↳   USB Keyboard                            id=17   [slave  keyboard (3)]   Puis utilisez setxkbmap pour setter une langue par defaut à ce clavier Shell setxkbmap -device <key_ID> -layout <layout_name> 1 setxkbmap -device <key_ID> -layout <layout_name> Exemple : setxkbmap -device 3 -layout fr #clavier principal en françaist setxkbmap -device 10 -layout us #Le clavier avec id=10 en anglais (US) setxkbmap -device 16 -layout ru #Le clavier avec id=16 en russe 123 setxkbmap -device 3 -layout fr    #clavier principal en françaistsetxkbmap -device 10 -layout us   #Le clavier avec id=10  en anglais (US)setxkbmap -device 16 -layout ru   #Le clavier avec id=16  en russe  ...

Read More

Configurer apt-get pour un nettoyage automatique après chaque installation

Configurer apt-get pour un nettoyage automatique après chaque installation

Comment configurer apt-get pour un nettoyage automatique après chaque installation   Enfaîte rien de très compliquer, il suffit de tapez cette ligne dans votre terminal : Shell sudo sh -c "echo 'DSELECT::Clean "always";' >> /etc/apt/apt.conf.d/99AutomaticClean" 1 sudo sh -c "echo 'DSELECT::Clean "always";' >> /etc/apt/apt.conf.d/99AutomaticClean" La commande s’exécutera automatiquement après chaque apt-get upgrade. Plus d’information :...

Read More

Nautilus – ajouter l’option « ouvrir le terminal ici »

Nautilus – ajouter l’option « ouvrir le terminal ici »

Nautilus – Ouvrir le terminal ici   Pour ce faire vous avez juste à installer le paquet : nautilus-open-terminal Shell sudo apt-get install nautilus-open-terminal 1 sudo apt-get install nautilus-open-terminal Assurez-vous d’avoir tuer tous les processus de nautilus (il  y a toujours un processus invisible lancé, donc utiliser pgrep nautilus pour trouver le processus et ensuite le tuer avec la commande kill Shell pgrep nautilus | xargs kill 1 pgrep nautilus | xargs kill Relancez nautilus et voila le travail...

Read More

Executer la commande d’un script dans le shell courant

Executer la commande d’un script dans le shell courant

Si vous voulez exécuter une commande (ou plusieurs) contenue d’un script, celle-ci ne s’exécute pas dans le shell courant, démonstration : 1. Voici un simple script (nome ch_dir) qui se déplace dans le répertoire /usr Shell #!/bin/bash cd /usr 123 #!/bin/bashcd /usr  2. Essayons de l’exécuter depuis le shell Shell morgan@morgan-pc:~$ ./ch_dir morgan@morgan-pc:~$ 12 morgan@morgan-pc:~$ ./ch_dirmorgan@morgan-pc:~$ On peux voir que je ne me suis pas déplacer dans le répertoire car un script s’exécute sur un fork du shell actuelle.   Pour pouvoir faire cela, il existe la commande source Shell morgan@morgan-pc:~$ help -m source NAME source - Execute des commandes depuis un fichier dans le shell actuel. SYNOPSIS source nom_fichier [arguments] DESCRIPTION Execute des commandes depuis un fichier dans le shell actuel. Lit et exécute des commandes depuis NOMFICHIER dans le shell actuel. Les éléments dans $PATH sont utilisés pour trouver le répertoire contenant NOMFICHIER. Si des ARGUMENTS sont fournis, ils deviennent les paramètres de position lorsque NOMFICHIER est exécuté. Code de sortie : Renvoie le code de la dernière commande exécutée dans NOMFICHIER, ou le code d'échec si NOMFICHIER ne peut pas être lu. SEE ALSO bash(1) IMPLEMENTATION GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu) Copyright (C) 2013 Free Software Foundation, Inc. Licence GPLv3+ : GNU GPL version 3 ou ultérieure <http://gnu.org/licenses/gpl.html> 1234567891011121314151617181920212223242526 morgan@morgan-pc:~$ help -m sourceNAME    source - Execute des commandes depuis un fichier dans le shell actuel. SYNOPSIS    source nom_fichier [arguments] DESCRIPTION    Execute des commandes depuis un fichier dans le shell actuel.        Lit et exécute des commandes depuis NOMFICHIER dans le shell actuel.  Les    éléments dans $PATH sont utilisés pour trouver le répertoire contenant NOMFICHIER.    Si des ARGUMENTS sont fournis, ils deviennent les paramètres de position    lorsque NOMFICHIER est exécuté.        Code de sortie :    Renvoie le code de la dernière commande exécutée dans NOMFICHIER, ou le code    d'échec si NOMFICHIER ne peut pas être lu. SEE ALSO    bash(1) IMPLEMENTATION    GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)    Copyright (C) 2013 Free Software Foundation, Inc.    Licence GPLv3+ : GNU GPL version 3 ou ultérieure <http://gnu.org/licenses/gpl.html>   Maintenant si je ré-exécute la même commande avec source, elle s’exécute bien dans le shell courant   Shell morgan@morgan-pc:~$ source ch_dir morgan@morgan-pc:/usr$ 12 morgan@morgan-pc:~$ source...

Read More