Travailler en ligne de commande, ou terminal, n’est pas pénible… Dès lors qu’il est configuré pour répondre à vos besoins. Je décris ici ma configuration minimale pour la console sur tous les types de machine : recherche de fichiers, recherche dans l’historique à l’aide des flèches, multiplexage de session, assistance aux paquetages manquants, invite de commande puissante et configuration minimale de vim.

mlocate pour trouver des fichiers dans le système

dpkg -S est pratique pour trouver des fichiers dans le système… à condition que ces fichiers appartiennent à un paquetage installé. Absolument inutile pour rechercher des fichiers qui ne font pas partie d’un paquetage .deb. locate remplit cette tâche.

apt-get install -y mlocate
updatedb

Screen pour multiplexer les connexions au terminal

TODO Détecter les sessions screen en cours et les lister à la connexion dans le motd

Je me connecte parfois à mes machines alors que je voyage en train ou en voiture, avec une connexion réseau faible et instable. screen est mon outil favori pour gérer et garder ouvertes mes sessions de terminal, même en cas de déconnexion. Je pourrais utiliser tmux, mais j’en ai moins l’habitude.

apt-get install -y screen

command-not-found pour identifier les paquetages manquants

Qui n’a jamais saisi netstat et eu en retour le message d’erreur command not found, il faut ensuite identifier le paquetage contenant la commande et l’installer. Avec command-not-found, si la commande n’est pas disponible, le message d’erreur tente de corriger les éventuelles fautes de frappe et de suggérer les paquetages qui pourraient fournir cette commande. Un gain de temps pour éviter de rompre un flux de pensée.

netstat.gif

apt-get install -y command-not-found apt-file

Cette mise à jour devrait avoir été exécutée pendant l’installation et sera exécutée à intervale régulier. Néanmoins, cela ne coute rien de l’exécuter maintenant et cela permettra de rafraîchir automatiquement la base de données de command-not-found.

apt-file update

Invite de commande, historique croisé et déconnexion automatique

Mon invite de commande affiche l’identifiant utilisateur, le nom de machine, le dossier courant mais aussi le niveau d’imbrication de shell, le dernier code retour, la date et l’heure. Essayez-la et vous comprendrez pourquoi ces informations sont utiles.

Les niveaux d’imbrications vous permettent de mieux gérer vos variables d’environnement, une fois que vous les utiliserez. Le dernier code retour met en évidence lorsqu’une commande a échoué. La date et l’heure horodatent automatiquement les commandes et donnent une idée des temps d’exécution lorsque vous oubliez d’utiliser time.

Cette personnalisation sauvegarde et restaure automatiquement l’historique à chaque commande. Ainsi, dès que vous lancez une commande dans un shell, elle est disponible dans l’historique de tous les autres shells sans devoir les relancer. Plus simplement, cela donne presque un unique historique trans-sessions en temps-réel.

J’ajoute enfin un compteur qui déconnecte la session en cours de l’utilisateur (root) au bout de 10 minutes d’inactivité.

cat << EOF >> ~/.bashrc

export PS1='[ \[\033[1;36m\]\u@\h\[\033[0m\]\[\033[1;31m\] ShLvl:$SHLVL\[\033[0m\] \[\033[1;35m\]Cmd:\!\[\033[0m\]\[\033[1;34m\] Ret:$?\[\033[0m\] \[\033[1;33m\]\d \t\[\033[0m\] ]\n\[\033[1;32m\]\w\[\033[0m\] # '
export PROMPT_COMMAND="\${PROMPT_COMMAND:+\$PROMPT_COMMAND\$'\n'}history -a; history -c; history -r"
export TMOUT=600 # 10m auto logout
EOF

Recherche dans l’historique readline avec les flèches du curseur

L’historique de Readline est merveilleur, il est utilisé dans chaque outil interractif, tel que les shells. Malgré l’efficacité de sa fonction de recherche à l’aide de Ctrl-R, readline peut aussi rechercher dans l’historique pour compléter automatiquement une commande. Si je souhaite réutiliser une de anciennes commandes ssh, je peux juste saisir ssh et naviguer parmis uniquement les commandes commençant par ssh dans l’historique. À essayer et adopter !

readline.gif

cat << EOF >> ~/.inputrc
"\e[A": history-search-backward
"\e[B": history-search-forward
EOF

vim et sa configuration

vim est le seul éditeur de texte. Il peut être personnalisé pour avoir de la colorisation syntaxique, des numéros de ligne, une barre d’état, la surbrillance des recherches, les onglets, fenêtres, …. Installons-le.

apt-get install -y vim-nox vim-addon-manager vim-scripts

Voici ma configuration, trop longue pour tout décrire, mais il y a quelques commentaires.

mkdir -p ~/.vim/backup
cat << EOF >> ~/.vimrc
" Source a global configuration file if available
if filereadable("/etc/vim/vimrc")
    source /etc/vim/vimrc
endif

set nocompatible  " Use Vim defaults (much better!)
set autoindent
set autowrite  " Automatically save before commands like :next and :make
set background=dark
set backspace=2 " Allow backspacing over everything (eol,indent,start)
set hidden  " Hide buffers when they are abandoned
set ruler " show the cursor position all the time
set smartcase  " Do smart case matching
set scrolloff=10 " minimal number of line to keep at top/bottom when scrolling
set suffixes=.jpg,.png,.jpeg,.gif,.bak,~,.swp,.o,.info,.aux,.log,.dvi,.bbl,.blg,.brf " low prio suffixes when tabbing
set fileformats=unix
set formatoptions=rtql
set mouse= " Enable mouse usage (all modes)
set expandtab
set tabstop=4
set shiftwidth=4
set softtabstop=4
set hlsearch " "highlight" le dernier motif de recherche
set ignorecase  " Do case insensitive matching
set incsearch  " Incremental search
set showmatch  " Show matching brackets.
set matchtime=2  " show matching brackets 2 secondes
set textwidth=0 "dont wrap words by defaults
set wrapmargin=8
set history=50 " 50 line of history
set autoread " Relecture automatique des fichiers modifiés en dehors de vim
set errorbells
set visualbell
set shortmess+=r " use "[RO]" for "[readonly]"
set showmode " display the current mode
set showcmd  " Show (partial) command in status line.
set modeline "Allow modeline in files to overwrite te vimrc settings
set whichwrap=b,s,<,>,[,] " Allow use of L/R arrow to navigate between lines
"set encoding=utf-8
"set fileencoding=utf-8
set statusline=%t%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [FENC=%{&fileencoding}]\ [POS=%04l,%04v]\ [%p%%]\ [LEN=%L]
set laststatus=2

colorscheme darkblue
set bg=dark

set number 
highlight LineNr ctermbg=black ctermfg=gray

set cursorline
"highlight CursorLine term=reverse cterm=reverse

highlight TabLine term=none cterm=none
highlight TabLineSel ctermbg=darkblue

" remember all of these between sessions, but only 10 search terms; also
" remember info for 10 files, but never any on removable disks, don't remember
" marks in files, don't rehighlight old search patterns, and only save up to
" 100 lines of registers; including @10 in there should restrict input buffer
" but it causes an error for me:
set viminfo=/10,'10,r/mnt/zip,r/mnt/floppy,f0,h,\"100

" Write backup files in ~/.vim/backup
if filewritable(expand("~/.vim/backup")) == 2
  " comme le répertoire est accessible en écriture,
  " on va l'utiliser.
  set backupdir=$HOME/.vim/backup
else
  if has("unix") || has("win32unix")
    " C'est c'est un système compatible UNIX, on
    " va créer le répertoire et l'utiliser.
    call system("mkdir $HOME/.vim/backup -p")
    set backupdir=$HOME/.vim/backup
  else
    set nobackup "Dont do backup files
  endif
endif

" Vim5 and later versions support syntax highlighting. Uncommenting the next
" line enables syntax highlighting by default.
" Vim5 comes with syntaxhighlighting. If you want to enable syntaxhightlighting
" by default uncomment the next three lines.
if has("syntax")
  syntax on  " Default to no syntax highlightning
endif

if has("autocmd")
  " Uncomment the following to have Vim load indentation rules according to the
  " detected filetype. Per default Debian Vim only load filetype specific
  " plugins.
  filetype indent on
  filetype plugin on
  " Uncomment the following to have Vim jump to the last position when
  " reopening a file
  au BufReadPost *
    \ if line("'\"") > 0 && line("'\"") <= line("$") |
    \   exe "normal g'\"" |
    \ endif
endif


""""""""""""""""""""""""""""""""""""""""""""""""""
"Mapping pour naviguer dans les lignes wrappées
""""""""""""""""""""""""""""""""""""""""""""""""""
map <A-DOWN> gj
map <A-UP> gk
imap <A-UP> <ESC>gki
imap <A-DOWN> <ESC>gkj

""""""""""""""""""""""""""""""""""""""""""""""""""
"Chargement des types de fichiers
""""""""""""""""""""""""""""""""""""""""""""""""""
autocmd BufEnter *.txt set filetype=text " chargement du type de fichier pour le format txt
autocmd BufEnter *.todo set filetype=todo " chargement du type de fichier pour le format todo

EOF

Supervision des disques durs SMART

Pour être complètement honête, J’installe la supervision SMART des disques, mais je ne la configure pas et je ne mets pas d’alertes. Ce paragraphe est complètement inutile dans cette série d’article, mais je recommande fortement d’installer cet outil et d’investir du temps dans sa configuration.

apt-get install -y smartmontools
sed -i 's/^#\(.*start_smartd.*\)/\1/' /etc/default/smartmontools
systemctl restart smartd
systemctl restart smartmontools

Fin de la base

Maintenant, le système est prêt pour devenir soit un serveur, soit une station de travail. La configuration, la sécurité, … seront différentes en fonction de l’usage de la machine, mais à ce stade, toutes les installations et configurations communes à tous les usages sont faites. Il reste à choisir ce que l’on veut en faire et utiliser la bonne série d’articles.