1168 private links
grep -vE '^\s*#' /path/to/the/file | sed '/^\s*$/d'
La boucle doit être alimentée par un process au même niveau.
Par exemple, cette boucle ne peut modifier la variable globale unformatted
.
#!/bin/bash
unformatted=""
lsblk -dn -o NAME,TYPE,SIZE | while read name type size
do
if [ "$type" == "disk" ]
then
parts=$(lsblk -n /dev/$name | grep part)
if [ -z "$parts" ]
then
unformatted="$unformatted /dev/$name,$size"
fi
fi
done
Dans la boucle while
la variable unformatted
est locale et ne modifie donc pas la variable globale du même nom définie plus haut car la boucle ne s'exécute pas au même niveau que le shell principal, mais dans un subshell à cause du pipe |
.
Une solution pour l'exécuter au même niveau, utiliser <<<
. On remplace donc la boucle par celle-ci.
#!/bin/bash
unformatted=""
while read name type size
do
if [ "$type" == "disk" ]
then
parts=$(lsblk -n /dev/$name | grep part)
if [ -z "$parts" ]
then
unformatted="$unformatted /dev/$name,$size"
fi
fi
done <<< $(lsblk -dn -o NAME,TYPE,SIZE)
Ce wiki est destiné au partage de connaissance entre utilisateurs francophones de FreeBSD.
C'est de fait, une tentative de résurrection de feu Diablotins.org, un wiki sur le même thème disparu à la fin des années 2000.
Impossible de lister les partages Samba du serveur TrueNAS depuis une Debian. A priori ce serait pour cette raison.
Pour contourner il suffit d'activer le support de SMB1 au niveau du service SMB sur le serveur TrueNAS.
En somme c'est lié au fait que les buffers de NGINX sont sous-dimensionnés.
A ajuster dans la conf, par ex. : /etc/nginx/nginx.conf
server {
proxy_busy_buffers_size 512k;
proxy_buffers 4 512k;
proxy_buffer_size 256k;
}
Fichier en lecture seule malgré tout
Je suis tombé sur un cas où je ne pouvais écrire dans un fichier malgré que :
- je sois root
- le owner du fichier est root
- les droits positionnés sur le fichier permettent l'écriture (-rw-r--r--)
- le filesystem est monté avec les droits d'écriture (rw)
J'ai donc d'abord vérifié les ACLs sur le fichier
# getfacl /etc/monfichier.conf
getfacl: Removing leading '/' from absolute path names
# file: etc/monfichier.conf
# owner: root
# group: root
user::rw-
group::r--
other::r--
Tout semblait bon, j'étais un peu pris au dépourvu.
En fait il y avait un attribut positionné sur le fichier pour le protéger de toute suppression/modification. Attribut positionné à l'aide de chattr
.
lsattr /etc/monfichier.conf
----i----------- /etc/monfichier.conf
L'attribut i
permet de protéger le fichier, même du compte root. Il faut donc le retirer pour pouvoir modifier le fichier.
chattr -i /etc/monfichier.conf
Pour remettre l'attribut et protéger le fichier
chattr +i /etc/monfichier.conf
Le man
de chattr
précise les attributs
Cet article m'a aidé : https://debian-facile.org/doc:systeme:chattr
Petite note rapide sur la configuration d'un serveur httpd d'Apache avec PHP et Let's Encrypt pour chiffrer le flux (SSL/TLS).
Prérequis
pkg inst py39-certbot apache24 mod_php80 php80 php80-extensions
Certbot
Générer un certificat avec Certbot
- example.com
- www.example.com
Nécessite qu'un enregistrement DNS (A/alias) pointe vers le serveur pour chaque certificat
certbot certonly --standalone -d example.com,www.example.com
Les certificats sont enregistrés dans /usr/local/etc/letsencrypt/live
Configurer le renouvellement automatique des certificats
Le process de renouvellement ne renouvelle que lorsque c'est nécessaire. Donc il peut être exécuté une fois par jour sans problème.
Ajouter dans la crontab
de root la ligne suivante pour lancer le process tous les jours à 02h50
50 2 * * * /usr/local/bin/certbot renew --pre-hook "service apache24 stop" --post-hook "service apache24 start"
Les options pre-hook
et post-hook
permettent de contrôler l'arrêt et le redémarrage du service Apache avant et après le process de renouvellement.
Apache
Création du répertoire des logs Apache
mkdir /var/log/apache
chmod 750 /var/log/apache
Edition de /usr/local/etc/apache24/httpd.conf
ServerName localhost:80
LoadModule rewrite_module libexec/apache24/mod_rewrite.so
LoadModule ssl_module libexec/apache24/mod_ssl.so
LoadModule socache_shmcb_module libexec/apache24/mod_socache_shmcb.so
Include etc/apache24/extra/httpd-vhosts.conf
ErrorLog "/var/log/apache/httpd-error.log"
CustomLog "/var/log/apache/httpd-access.log" common
Activation de PHP
Ajouter les lignes suivantes dans le fichier /usr/local/etc/apache24/modules.d/080_mod_php.conf
AddType application/x-httpd-php .php
DirectoryIndex index.php index.html
Copie du fichier de configuration php.ini
de production
cp -a /usr/local/etc/php.ini-production /usr/local/etc/php.ini
Configuration SSL dans /usr/local/etc/apache24/modules.d/070_mod_ssl.conf
Listen 443
SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
SSLHonorCipherOrder on
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLProxyProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLPassPhraseDialog builtin
SSLSessionCache "shmcb:/var/run/ssl_scache(512000)"
SSLSessionCacheTimeout 300
SSLOptions +StrictRequire
Exemple de configuration d'un VirtualHost
avec SSL dans /usr/local/etc/apache24/extra/httpd-vhosts.conf
# example.com
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
ServerAdmin postmaster@example.com
ErrorLog "/var/log/apache/example-error_log"
CustomLog "/var/log/apache/example-access_log" common
RewriteEngine on
RewriteCond %{SERVER_NAME} =www.example.com [OR]
RewriteCond %{SERVER_NAME} =example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<IfModule mod_ssl.c>
# example.com
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
ServerAdmin postmaster@example.com
DocumentRoot "/var/www/example"
# /
<Directory "/var/www/example">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog "/var/log/apache/example-error_log"
CustomLog "/var/log/apache/example-access_log" common
SSLEngine on
SSLCertificateFile /usr/local/etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /usr/local/etc/letsencrypt/live/example.com/privkey.pem
</VirtualHost>
</IfModule>
Activation du service
sysrc clear_tmp_enable=YES
sysrc apache24_enable=YES
La directive clear_tmp_enable
permet de vider /tmp
au reboot. Utile pour supprimer automatiquement les anciens fichiers de session PHP après un reboot.
Démarrage du service
service apache24 start
Test SSL : https://www.ssllabs.com/
kldload zfs
sysctl vfs.zfs.min_auto_ashift=12
gpart add -l fbsd-swap -t freebsd-swap -a 4k -s 1G ada0
gpart add -l fbsd-zfs -t freebsd-zfs -a 4k ada0
geli init -g -s 4k -l 256 ada0p5
geli attach ada0p5
zpool create \
-o ashift=12 \
-O compression=lz4 \
-O atime=off \
-m none \
-R /mnt \
zroot \
ada0p5.eli
zfs create -o canmount=off zroot/os
zfs create -o canmount=noauto -o mountpoint=/ zroot/os/main
zfs mount zroot/os/main
zfs create -o mountpoint=/usr -o canmount=off zroot/usr
zfs create -o setuid=off zroot/usr/ports
zfs create zroot/usr/src
zfs create -o mountpoint=/usr/home zroot/home
zfs create -o mountpoint=/var -o canmount=off zroot/var
zfs create -o exec=off -o setuid=off zroot/var/audit
zfs create -o exec=off -o setuid=off zroot/var/crash
zfs create -o exec=off -o setuid=off zroot/var/log
zfs create -o atime=on zroot/var/mail
zfs create -o setuid=off zroot/var/tmp
zpool set bootfs=zroot/os/main zroot
chmod 1777 /mnt/var/tmp
printf "/dev/ada0p4.eli\tnone\tswap\tsw,late\t0\t0\n" >> /tmp/bsdinstall_etc/fstab
printf "tmpfs\t/tmp\ttmpfs\trw,mode=1777\t0\t0\n" >> /tmp/bsdinstall_etc/fstab
mount -t msdosfs /dev/ada0p1 /media
mkdir /media/EFI/freebsd
cp /boot/loader.efi /media/EFI/freebsd/loader.efi
efibootmgr --create --activate --label "freebsd" --loader "/media/EFI/freebsd/loader.efi"
umount /media
exit
Final modifications
sysrc -f boot/loader.conf cryptodev_load=YES
sysrc -f boot/loader.conf zfs_load=YES
sysrc -f boot/loader.conf geom_eli_load="YES"
sysrc -f boot/loader.conf aesni_load=YES
sysrc -f etc/rc.conf zfs_enable=YES
Liens utiles
Une page se tourne, je cède mon ThinkPad X201, après de nombreuses années de loyaux services (et quelques moments pénibles).
Sécuriser et monter /tmp
et /var/tmp
en mémoire (tmpfs)
kldload tmpfs
sysrc -f /boot/loader.conf tmpfs_load=YES
rm -rf /tmp /var/tmp
mkdir /tmp /var/tmp
mount -t tmpfs tmpfs -o rw,nosuid,noexec,mode=01777 /tmp
mount -t tmpfs tmpfs -o rw,nosuid,noexec,mode=01777 /var/tmp
Dans /etc/fstab
# Device Mountpoint FStype Options Dump Pass#
tmpfs /tmp tmpfs rw,nosuid,noexec,mode=01777 0 0
tmpfs /var/tmp tmpfs rw,nosuid,noexec,mode=01777 0 0
Par exemple, pour lister les liens symboliques sur la racine /
et afficher uniquement leur cible :
find / -maxdepth 1 -type l -printf "%p %l\n"
-maxdepth 1
détermine la profondeur de la recherche à un seul niveau pour ne pas rechercher récursivement
-printf
pour formater la sortie
%p
affiche le nom du fichier/dossier
%l
récupère uniquement les éléments de type lien symbolique
\n
saut de ligne
Tout est dans man find
CDE (Common Desktop Environment) est un vieil environnement de bureau historiquement réalisé pour UNIX et qui encore aujourd'hui bénéficie d'un soutien de la communauté.
The Common Desktop Environment, the classic UNIX desktop. The Common Desktop Environment was created by a collaboration of Sun, HP, IBM, DEC, SCO, Fujitsu and Hitachi. Used on a selection of commercial UNIXs, it is now available as open-source software for the first time.
Sources : https://sourceforge.net/projects/cdesktopenv/
Installation et configuration de CDE sur FreeBSD
pkg inst xorg dbus cde ksh93
sysrc dbus_enable=YES
sysrc dtcms_enable=YES
sysrc dtspc_enable=YES
sysrc inetd_enable=YES
sysrc rpcbind_enable=YES
Ajouter dans /etc/rc.local
/usr/local/dt/bin/dtlogin
Pour le compte root et le compte utilisateur
ln -s /usr/local/dt/bin/Xsession ~/.Xsession
Ajouter dans /etc/inetd.conf
dtspc stream tcp4 nowait root /usr/local/dt/bin/dtspcd /usr/local/dt/bin/dtspcd
cmsd/2-5 dgram rpc/udp4 wait root /usr/local/dt/bin/rpc.cmsd rpc.cmsd
Ajouter dans ~/.dtprofile
LANG=en_US.UTF-8
regular expression - How can I use sed to replace a multi-line string? - Unix & Linux Stack Exchange
Pour faire suite à mon précédent post, j'ai besoin d'activer la compression de logrotate en décommentant la ligne #compress
juste après le commentaire explicatif # uncomment this if you want your log files compressed
.
Pour ce faire :
sed '/# uncomment this if you want your log files compressed/{n;/#compress/{s/#compress/compress/;p;d;}}' /etc/logrotate.conf
Quelques explications :
- On recherche le pattern
# uncomment this if you want your log files compressed
- Si on trouve, on passe à la ligne suivante
n;
- On recherche le pattern
#compress
- Si on trouve, on substitut
#compress
parcompress
- On imprime
p;
- On supprime l'occurence
d;
Cheatsheet :
: # label
= # line_number
a # append_text_to_stdout_after_flush
b # branch_unconditional
c # range_change
d # pattern_delete_top/cycle
D # pattern_ltrunc(line+nl)_top/cycle
g # pattern=hold
G # pattern+=nl+hold
h # hold=pattern
H # hold+=nl+pattern
i # insert_text_to_stdout_now
l # pattern_list
n # pattern_flush=nextline_continue
N # pattern+=nl+nextline
p # pattern_print
P # pattern_first_line_print
q # flush_quit
r # append_file_to_stdout_after_flush
s # substitute
t # branch_on_substitute
w # append_pattern_to_file_now
x # swap_pattern_and_hold
y # transform_chars
On envoi un demi giga environ pour voir à quelle vitesse c'est transféré.
dd if=/dev/zero bs=1024k count=512 | ssh user@remote.host 'cat >> /dev/null'
- How can I use dd command on a Linux to test I/O performance of my hard disk drive?
- How do I check the performance of a hard drive including the read and write speed on a Linux operating systems?
- How can I use the dd command under Linux I/O performance test?
Exemple de test de performance écriture disque avec dd
dd if=/dev/zero of=test.file bs=64M count=16 oflag=dsync
Alimenter un script depuis stdin :
#!/bin/bash
# Check to see if a pipe exists on stdin.
if [ -p /dev/stdin ]; then
echo "Data was piped to this script!"
# If we want to read the input line by line
while IFS= read line; do
echo "Line: ${line}"
done
# Or if we want to simply grab all the data, we can simply use cat instead
# cat
else
echo "No input was found on stdin, skipping!"
# Checking to ensure a filename was specified and that it exists
if [ -f "$1" ]; then
echo "Filename specified: ${1}"
echo "Doing things now.."
else
echo "No input given!"
fi
fi