Bash
Commands, Scripte etc.
- Einzeiler
- Hacks und Commands
- Konfiguration
- ffmpeg
- Old commands and their replacements
- wttr.in
- Rechte im Dateisystem mehr als nur r,w,x
Einzeiler
grep -RnisI *
rename 'y/A-Z/a-z/' *
for i in ?.ogg; do mv $i 0$i; done
convert single digit to double digits
from 1.ogg 01.ogg
mount /path/to/file.iso /mnt/cdrom -oloop
DISPLAY=:0.0 import -window root /tmp/shot.png
mount |column -t sshfs name@server:/path/to/folder /path/to/mount/point mount -t tmpfs tmpfs /mnt -o size=1024m -Ausgabe, mount sshfs, RAM-Disk
python3 -m SimpleHTTPServer
net rpc shutdown -I ipAddressOfWindowsPC -U username%password
ping -i 60 -a IP_address (keep alive)
Uhrzeit einblenden:
while sleep 1;do tput sc;tput cup 0 $(($(tput cols)-29));date;tput rc;done &
Fortschrittsbalken:
echo "You can simulate on-screen typing just like in the movies" | pv -qL 10 tar cf - /home/ | pv | gzip > home.tar.gz
Netzverbindungen
lsof -i lsof -P -i -n
echo "!!" > foo.sh Create a script of the last executed command Sometimes commands are long, but useful, so it's helpful to be able to make them permanent without having to retype them. An alternative could use the history command, and a cut/sed line that works on your platform.
ifconfig | convert label:@- ip.png save command output to image
sudo touch /forcefsck dd if=/dev/mem | cat | strings
"Matrix"
ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'
man -t manpage | ps2pdf - filename.pdf
ffmpeg -f x11grab -r 25 -s 800x600 -i :0.0 /tmp/outputFile.mpg
Generate a random password 30 characters long
strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 30 | tr -d '\n'; echo
Mysql-Live
watch -n 1 mysqladmin --user= --password= processlist
watch -t -n1 "date +%T|figlet"
du -s * | sort -n | tail
Busdurchsatz
dd if=/dev/zero of=/dev/null bs=1M count=32768
Fakework
cat /dev/urandom | hexdump -C | grep "ca fe"
for i in {0..600}; do echo $i; sleep 1; done | dialog --gauge "Install..." 6 40
export GREP_COLOR='1;32'; cat /dev/urandom | hexdump -C | grep --color=auto "ca fe"
j=0;while true; do let j=$j+1; for i in $(seq 0 20 100); do echo $i;sleep 1; done | dialog --gauge "Install part $j : sed $(perl -e "print int rand(99999)")"q;d" /usr/share/dict/words" 6 40;done
set Permissions
find ./ -type f -exec chmod 644 {} \; find ./ -type d -exec chmod 755 {} \;
grep ^Dirty /proc/meminfo
print ip connected
sudo tcpdump -i wlan0 -n ip | awk '{ print gensub(/(.)../,"\1","g",$3), $4, gensub(/(.)../,"\1","g",$5) }' | awk -F " > " '{print $1"\n"$2}'
ahttp://www.commandlinefu.com/commands/browse/sort-by-votes/25/50
grep -RnisI <pattern> *
------------
rename 'y/A-Z/a-z/' *
for i in ?.ogg; do mv $i 0$i; done
convert single digit to double digits
from 1.ogg 01.ogg
------------
mount /path/to/file.iso /mnt/cdrom -oloop
DISPLAY=:0.0 import -window root /tmp/shot.png
mount |column -t
sshfs name@server:/path/to/folder /path/to/mount/point
mount -t tmpfs tmpfs /mnt -o size=1024m
-Ausgabe, mount sshfs, RAM-Disk
------------
python3 -m SimpleHTTPServer
net rpc shutdown -I ipAddressOfWindowsPC -U username%password
ping -i 60 -a IP_address (keep alive)
#### Uhrzeit einblenden:
while sleep 1;do tput sc;tput cup 0 $(($(tput cols)-29));date;tput rc;done &
#### Fortschrittsbalken:
echo "You can simulate on-screen typing just like in the movies" | pv -qL 10
tar cf - /home/ | pv | gzip > home.tar.gz
#### Netzverbindungen
lsof -i
lsof -P -i -n
------------
echo "!!" > foo.sh
Create a script of the last executed command
Sometimes commands are long, but useful, so it's helpful to be able to make them permanent without having to retype them. An alternative could use the history command, and a cut/sed line that works on your platform.
------------
ifconfig | convert label:@- ip.png
save command output to image
sudo touch /forcefsck
dd if=/dev/mem | cat | strings
------------
##### "Matrix"
ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'
man -t manpage | ps2pdf - filename.pdf
ffmpeg -f x11grab -r 25 -s 800x600 -i :0.0 /tmp/outputFile.mpg
------------
##### Generate a random password 30 characters long
strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 30 | tr -d '\n'; echo
------------
##### Mysql-Live
watch -n 1 mysqladmin --user=<user> --password=<password> processlist
watch -t -n1 "date +%T|figlet"
du -s * | sort -n | tail
------------
##### Busdurchsatz
dd if=/dev/zero of=/dev/null bs=1M count=32768
##### Fakework
cat /dev/urandom | hexdump -C | grep "ca fe"
for i in {0..600}; do echo $i; sleep 1; done | dialog --gauge "Install..." 6 40
export GREP_COLOR='1;32'; cat /dev/urandom | hexdump -C | grep --color=auto "ca fe"
j=0;while true; do let j=$j+1; for i in $(seq 0 20 100); do echo $i;sleep 1; done | dialog --gauge "Install part $j : `sed $(perl -e "print int rand(99999)")"q;d" /usr/share/dict/words`" 6 40;done
##### set Permissions
find ./ -type f -exec chmod 644 {} \;
find ./ -type d -exec chmod 755 {} \;
grep ^Dirty /proc/meminfo
##### print ip connected
sudo tcpdump -i wlan0 -n ip | awk '{ print gensub(/(.*)\..*/,"\\1","g",$3), $4, gensub(/(.*)\..*/,"\\1","g",$5) }' | awk -F " > " '{print $1"\n"$2}'
Hacks und Commands
**Images mit dd:**
Komprimiertes Image Vom Laufwerk erstellen:
dd if=/dev/sda | gzip --best >kodi-Image.gz
Zurückschreiben:
gunzip -c kodi-Image.gz | dd of=/dev/sda
**Dateiliste erstellen und die Liste mit einem Befehl abarbeiten:
**
*#/bin/bash
find /media/usbhd/Multimedia/Video/recordings/ -name "*.mpeg">liste
for f in $(cat liste) ; do
rm $f
done
***Encodieren nach Liste***
*#/bin/bash
find /Media/Video/recordings/ -mtime 90 -name "*.mpeg">mpeg_liste
for mpeg in $(cat mpeg_liste) ; do
mencoder -ovc x264 -oac mp3lame -ofps 25 -o $mpeg.mp4 $mpeg
done
--------------------------------------------------------------------
Find and do something...serial
find -iname '*.pdf' -exec cp {} /home/willi/pdf/ \;
-----------------------------------------------------------------------
**Audio extraieren aus *.mp4**
ffmpeg -i "The Eagles - Hotel California.mp4" -vn -acodec flac file.flac
**JPG aus *mp4 extraieren**
ffmpeg -i "vlc-record.mp4" -an -f image2 "output_%05d.jpg"
**mp4 aus jpg + Text einfügen
Insert Text in Video:
ffmpeg -i output_Montag2.mp4 -vf drawtext="fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSerif.ttf:text='12.04.21':fontsize=20:fontcolor=blue:x=1800:y=10" with_text3.mp4
ffmpeg -framerate 25 -start_number 4 -i Photo/Montag/image-%04d.jpg -c:v libx264 -profile:v high -crf 20 -pix_fmt yuv420p /home/willi/Montag_16-20output.mp4
ffmpeg -framerate 25 -i install/MO/image%04d.jpg -c:v libx264 -profile:v high -crf 20 -pix_fmt yuv420p /home/willi/Montag_19output.mp4
------------
**Video kodieren x265**
ffmpeg -i "Der Auftragskiller - Zimmer 164.mp4" -c:v libx265 -preset medium -x265-params crf=25 -c:a aac -strict experimental -b:a 128k output.mp4
------------
**HD-Streams bearbeiten**
1. ffmpeg -i 'vlc-record-.ts' -vcodec copy -acodec copy 'Wallander.ts'
-korrigiert Fehler im Stream
2. ffmpeg -ss 00:05:55 -i 'Wallander.ts' -vcodec copy -acodec copy -bsf:a aac_adtstoasc -f mp4 'Wallander.mp4'
- ss: schneidet die ersten 34 Sekunden ab
- t : Schnitt an Streamposition 1:35:44 (gemessen ab -ss)
- bsf: behebt Fehler in der Audiospur
------------
Permissions von Files numerisch anzeigen:
stat -c "%A %a %N" *
-----------------
**Leerzeichen in Dateinamen entfernen**
*#/bin/bash
for i in *\ *
do mv "$i" "${i// /_}"
done*
oder:
*#/bin/bash
for i in /media/usbhd/Multimedia/Video/recordings/Deutsches_Europa_Kino/*.mp4
do mv "$i" "${i// /_}"
done
------------
**Installation nach Paketliste**
#/bin/bash
for pkg in $(cat installed_packages.list) ; do
apt-get -y install $pkg
done
#Paketliste erstellt mit: dpkg -l|grep ii|awk '{print$2}'>installed_packages.list
------------
**Verschlüsseln/entschlüsseln mit ssl**
*
*#!/bin/bash*
*# make sure we get a file name*
if [ $# -lt 1 ]; then
echo "Usage: $0 filename"
exit 1
fi
openssl enc -e -aes256 -in "$1" -out "$1".enc*
*#!/bin/bash*
*# make sure we get 2 files*
if [ $# -lt 2 ]; then
echo "Usage: $0 encrypted_file decrypted_file"
exit 1
fi
openssl enc -d -aes256 -in "$1" -out "$2"
------------
**Streaming mit vlc**
**
**#/bin/bash
cvlc .mplayer/Sender.conf --extraintf http --sout udp:172.16.1.164&
exit
------------
#### Phpmyadmin für weiteren Server einrichten:
**Datei: /etc/phpmyadmin/config.inc.php**:
<?php
$cfg['blowfish_secret']='multiServerExample70518';
//any string of your choice (max. 46 characters)
$i = 0;
$i++; // server 1 :
$cfg['Servers'][$i]['auth_type'] = 'cookie'; // needed for pma 2.x
$cfg['Servers'][$i]['verbose'] = 'no1';
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['extension'] = 'mysqli';
// more options for #1 ...
$i++; // server 2 :
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['verbose'] = 'no2';
$cfg['Servers'][$i]['host'] = 'banapi';//or ip:'10.9.8.1'
// this server must allow remote clients, e.g., host 10.9.8.%
// not only in mysql.host but also in the startup configuration
$cfg['Servers'][$i]['extension'] = 'mysqli';
// more options for #2 ...
// end of server sections
$cfg['ServerDefault'] = 0; // to choose the server on startup
// further general options ...
?>
------------
#### Teamviewer auf 64bit
Vielleicht zur Erklärung:
Das 64-Bit-Paket verwendet zum installieren das Paket Debiania32-libs, welches seit Wheezy nicht mehr vorhanden ist.
Du musst also die 32Bit Version installieren und vorher Multiarch freischalten mit:
dpkg --add-architecture i386
Danach ein
apt-get update
Jetzt das Paket herunterladen:
wget http://download.teamviewer.com/download/teamviewer_i386.deb
Das Paket installieren:
dpkg -i teamviewer_i386.deb
Und fehlende Abhängigkeiten installieren:
apt-get install -f
Steht auch sonst alles hier:
-> http://www.teamviewer.com/en/help/363-How-do-I-install-TeamViewer-on-my-Linux-distribution.aspx
------------
#### Samba meckert uber Cups -das gar nicht installiert ist...
#####prevent logsentries about cups####
load printers = no
printing = bsd
printcap name = /dev/null
disable spoolss = yes
------------
#### NATNAT: Dem Kernel das Weiterleiten beibringen
Wir möchten also dem Kernel das folgende mitteilen: Bei Paketen aus dem lokalen Netz, dessen IP-Adresse
nicht mit seiner übereinstimmt, soll er die Absender-Adresse auf sich selbst ändern. Dazu machen wir noch
die Annahme, dass das erste Netzwerk-Interface des Linux-Routers "eth0" mit dem lokalen Netz verbunden ist
und die Internet-Verbindung am zweiten Interface "eth1" verfügbar ist.
Der Befehl zur Freigabe der Internet-Verbindung lautet dann:
*Anbinden eines LAN an das Internet*
$> iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables-Tabellen speichern
**Beispiel um iptables-Tabellen zu speichern**:
sudo iptables-save > /etc/iptables_01.save
**Beispiel um iptables-Tabellen wieder zu laden. Vorhandenen Regeln werden dabei gelöscht bzw. überschrieben.**
sudo iptables-restore < /etc/iptables_01.save
**So werden bereits vorhandene Regeln nicht gelöscht:**
sudo iptables-restore -n < /etc/iptables_01.save
sudo iptables-restore --noflush < /etc/iptables_01.save
So können natürlich auch mehrere Tabellen gespeichert und je nach Bedarf wieder geladen werden.
**iptables-Tabellen löschen**
sudo iptables --flush
#### [Linux Nat Toutorial](http://www.karlrupp.net/de/computer/nat_tutorial "Linux Nat Toutorial")
------------
#### Mit sed alle Zeilen löschen, die "pattern" enthalten
sed '/pattern to match/d' ./infile
To directly modify the file (and create a backup):
sed -i.bak '/pattern to match/d' ./infile
#/bin/bash
mount -t cifs //fritz.box/fritz.nas /home/willi/smb -o username=Maria,password=oma
**SSH Passwordless Login**
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote-system
** Dateiberechtigungen sichern**
To back up permissions in the current directory and its subdirectories recursively:
getfacl -R >permissions.facl
To restore permissions:
setfacl --restore=permissions.facl
**Filesystemcheck:**
umount /media/veracrypt1
fsck /dev/mapper/veracrypt1
**Splitten von MP3:**
mp3splt:
Automatisch:
mp3splt -c query file.mp3
Manuell
mp3splt -s -p min=2 file.mp3
**Mount Winfreigabe:**
mount -t cifs //fritz.box/fritz.nas /home/willi/smb -o username=Maria,password=oma
wget komplette Seite
wget -r -l 0 -p -k -D alan-g.me.uk -L -np http://www.alan-g.me.uk/l2p/
PiHole Docker Unbound – Error starting userland proxy: listen tcp4 0.0.0.0:53: bind: address already in use
systemctl disable systemd-resolved.service systemctl stop systemd-resolved.service rm /etc/resolv.conf echo 1.1.1.1 > /etc/resolv.conf
----------------------------------------------------------------------------------------------
Symbolic links
ln -s {source-filename} {symbolic-filename}
---------------------------------------------------------------------------------------------------------------------------------------------
Performance VPS-Server
apt update
apt upgrade -y
apt install sysbench fio bpytop iperf3
lscpu
lspci
ping ipv4.ipv64.net
ping ipv6.ipv64.net
iperf3 -c speedtest.myloc.de -p 5200 -P 10 -4
iperf3 -c speedtest.myloc.de -p 5200 -P 10 -4 -R
sysbench cpu run
sysbench memory run
dd if=/dev/zero of=/root/test.iso bs=128k count=10000
## Schreib- / Lesetests
fio --name=write-test --size=1G --filename=/tmp/fio-testfile --bs=128k --rw=write --direct=1 --numjobs=1 --time_based --runtime=30 --group_reporting
fio --name=read-test --size=1G --filename=/tmp/fio-testfile --bs=128k --rw=read --direct=1 --numjobs=1 --time_based --runtime=30 --group_reporting
fio --name=realistic-test --filename=/tmp/fio-testfile --size=2G --bs=64k --rw=randrw --rwmixread=70 --direct=1 --iodepth=16 --numjobs=4 --time_based --runtime=60 --group_reporting
Konfiguration
Größe von /var/log/journal begrenzen
Über die Zeit wächst das Verzeichnis /var/log/journal deutlich an. Gerade auf kleinen vServern ist das unangenehm. Dies kann schnell auf mehrere Gigabyte anwachsen. Dies kann man in der Datei /etc/systemd/journald.conf begrenzen:
[Journal]
SystemMaxUse=32M
Einmalig kann dies auch mit folgenden Befehl aufgeräumt werden.
journalctl --vacuum-size=32M
Add User to sudoers:
usermod -aG sudo username
Automatische Updates:
Alternativ ist im Anacron bereits ein entsprechender Mechanismus implementiert: /etc/cron.daily/apt .
Nach Erstellen der Datei /etc/apt/apt.conf.d/02periodic sollte eine tägliche Systemaktualisierung starten. Hier der Inhalt der Datei 02periodic:
APT::Periodic::Enable "1"; APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Download-Upgradeable-Packages "1"; APT::Periodic::AutocleanInterval "7"; APT::Periodic::Unattended-Upgrade "1"; APT::Periodic::Verbose "2"; APT::Periodic::RandomSleep "11";
Owncloud-Client ist nicht in den Repos:
wget -nv https://download.owncloud.com/desktop/ownCloud/stable/latest/linux/Debian_11/Release.key -O - | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/owncloud.gpg > /dev/null
echo 'deb https://download.owncloud.com/desktop/ownCloud/stable/latest/linux/Debian_11/ /' | sudo tee -a /etc/apt/sources.list.d/owncloud.list
apt-get update -y
___________________________________________________________________________________________________________________________
Teamviewer Debian 12
apt-get update
apt install curl apt-transport-https
curl -fSsL https://download.teamviewer.com/download/linux/signature/TeamViewer2017.asc | sudo gpg --dearmor | sudo tee /usr/share/keyrings/teamview.gpg > /dev/null
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/teamview.gpg] http://linux.teamviewer.com/deb stable main" | sudo tee /etc/apt/sources.list.d/teamviewer.list
apt-get update
Armbian - WIFI
use NMCLI
$ nmcli device status DEVICE TYPE STATE CONNECTION enp1s0 ethernet connected Wired connection 1 wlp2s0 wifi disconnected -- lo loopback unmanaged --
to check radio
$ nmcli radio WIFI-HW WIFI WWAN-HW WWAN enabled enabled enabled enabled
Let's see what's out there... scan for AP's
$ nmcli dev wifi list SSID MODE CHAN RATE SIGNAL BARS SECURITY MYSSID Infra 11 54 Mbit/s 100 ▂▄▆█ WPA2 MYSSID Infra 132 54 Mbit/s 100 ▂▄▆█ WPA2 SOMEOTHERSSID Infra 52 54 Mbit/s 49 ▂▄__ WPA2 MYSSID Infra 149 54 Mbit/s 45 ▂▄__ WPA2 MYSSID Infra 11 54 Mbit/s 42 ▂▄__ WPA2 SOMEOTHERSSID Infra 1 54 Mbit/s 27 ▂___ WPA2
Now, let's connect to WiFi (note, one must be root or sudo access)
Connecting to an open AP
$ nmcli device wifi connect <SSID|BSSID>
For a password protected AP, see below
$ nmcli device wifi connect <SSID|BSSID> password <password>
To set up a device as an AP - this assumes that WLAN0 is the wireless interface...
$ nmcli dev wifi hotspot ifname wlan0 <SSID> password "<password>"
---------------------------------------------------------------------------------------------------------
Mutimedia Repository einbinden
- Add the following line to /etc/apt/sources.list:
deb http://www.deb-multimedia.org trixie main - Update the package index:
$ sudo apt-get update -oAcquire::AllowInsecureRepositories=true - Install GPG key of the repository:
$ sudo apt-get install deb-multimedia-keyring - Install deb-multimedia-keyring deb package:
$ sudo apt-get install deb-multimedia-keyring
ffmpeg
- How to split video into 30 seconds chunks. This example creates 3 segments from the beginning of video starting at time 0 seconds of original video. i.e. <30s><30s><30s><... long big chunk>.
Code:ffmpeg -ss 00:00:30 -vsync 0 -t 00:00:30 -i webcam_2012-03-18_00_33_58.mp4 -vcodec copy -acodec copy sub_video1.mp4 ffmpeg -ss 00:01:00 -vsync 0 -t 00:00:30 -i webcam_2012-03-18_00_33_58.mp4 -vcodec copy -acodec copy sub_video2.mp4 ffmpeg -ss 00:01:30 -vsync 0 -t 00:00:30 -i webcam_2012-03-18_00_33_58.mp4 -vcodec copy -acodec copy sub_video3.mp4
- How to split video into 30 seconds chunks. This example creates 3 segments from the beginning of video starting at time 0 seconds of original video. i.e. <30s><30s><30s><... long big chunk>.
- How to extract a still JPEG image from a video at the 20 second spot.
Code:ffmpeg -i webcam_2012-03-18_00_33_58.mp4 -r 0.1 -t 20 image%3d.jpg
- How to extract a still JPEG image from a video at the 20 second spot.
- Here are some other examples to save you time:
19-FFmpeg commands for all needs - Good articles and examples here:
FFMpeg – The swiss army knife of Internet streaming – part I
FFMpeg – The swiss army knife of Internet streaming – part II
FFMpeg – The swiss army knife of Internet streaming – part III
FFMpeg – The swiss army knife of Internet streaming – part IV - Screencasting: How to capture your desktop screen and audio.
Nice examples here. - How to overlay text on the video at a specific window position.
Code:ffmpeg -i sub_video3.mp4 -vf \ drawtext="fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSerif.ttf: \
text='Text to write is this one, overlaid':fontsize=20:fontcolor=red:x=100:y=100" \ with_text3.mp4
- Here are some other examples to save you time:
- How to grab audio from your desktop/laptop microphone.
Code:ffmpeg -f alsa -ac 2 -i pulse mic_test.mp3
- How to grab audio from your desktop/laptop microphone.
- Two examples that overlays text over video which timestamps the output video to start at the specified time (timecode).
Code:#Begin at 1:00 ffmpeg -y -i in_video.mp4 \ -vf "drawtext=fontcolor=white: fontsize=16: \ fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf: \ box=1:boxcolor=black@0.3:x=50:y=20: \ timecode='00\\:01\\:00\\;02':rate=30000/1001" \ out.mp4 #Begin at 3:59, with a specified codec ffmpeg -i in_video.mp4 \ -vf "drawtext=fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf: \ x=10: y=20: fontsize=32: boxcolor=black@0.5:box=1: \ rate=30000/1001:timecode='00\\:03\\:59\\;27'" \ -r 30000/1001 \ -vcodec mpeg4 \ nostra_timecode.mp4
- Two examples that overlays text over video which timestamps the output video to start at the specified time (timecode).
- A example that overlays text over video which shows updating timestamps on the output video.
Code:ffmpeg -i video.mp4 -vf drawtext="fontfile=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf: \
text='%T %D': x=10: y=10: fontsize=24: fontcolor=black" \
-vcodec libx264 -preset fast -crf 34 -threads 0 \
strftime.mp4
- A example that overlays text over video which shows updating timestamps on the output video.
- A example that overlays text over an mjpeg input stream generated with mjpeg_streamer from a usb webcam.
Code:ffmpeg -fflags +genpts -t 600 -f mjpeg -r 8 -s 640x480 \ -i http://localhost:8080/?action=stream -vcodec mpeg4 \ -vf drawtext="fontfile=/usr/share/fonts/TTF/mitra.ttf:x=70:y=455: \ text='\%H\:\%M\:\%S | \%a \%d/\%b/\%Y | S500ATV | camera 0': \ fontcolor=0xFFFFFFFF:fontsize=18: \ shadowcolor=0x000000EE:shadowx=1:shadowy=1" \ -b 1500000 -r 8 \ video_file.avi
- A example that overlays text over an mjpeg input stream generated with mjpeg_streamer from a usb webcam.
- If you want to add subtitles to a video file (in_video.avi) with audio to a new output video with subtitles. Note that since video had audio we are not passing the audio file we just map audio to the 2nd (0:1) component of the output. Input had 2 components, 0 and 1. Output has three (3) components, 0, 1, and 2. So, we are mapping the 1st input component to the 1st and 2nd output components (0:0) and (0:1). We also map the 2nd input component to the 3rd out put component (1:2).
Code:ffmpeg -i in_video.avi -c:v libx264 -vpre ipod640 -s 480x240 -b 256k -map 0:0 \ -c:a libfaac -ar 48000 -ab 128k -ac 2 -map 0:1 \ -i in_subtitles.srt -c:s copy -map 1:2 out_video_with_titles.m4v #That is, follow this type of command format: ffmpeg -i Input_1.avi -c:v copy -map 0:0 \ -i Input_2.wav -c:a copy -map 1:1 \ -i Input_3.srt -c:s copy -map 2:2 Output.mp4
- If you want to add subtitles to a video file (in_video.avi) with audio to a new output video with subtitles. Note that since video had audio we are not passing the audio file we just map audio to the 2nd (0:1) component of the output. Input had 2 components, 0 and 1. Output has three (3) components, 0, 1, and 2. So, we are mapping the 1st input component to the 1st and 2nd output components (0:0) and (0:1). We also map the 2nd input component to the 3rd out put component (1:2).
- ffmpeg: the mother of all command-lines
Nice complex command explained!
Re: HOWTO: Proper Screencasting on Linux
Note: This was the original post not done by me, but i will try to update if anything new comes up
While many screencasting tools exist on Linux, none of them is able to really pull a high-quality screencast. I’ve tried almost all existing tools such as recordmydesktop, xvidcap, istanbul, wink etc.. and all of them produced poor results. Horrible video/audio quality, bad sync, lots of limitations, and some even simply segfault while doing the recording. The real solution and the ultimate answer to all your screencasting needs on Linux has been there for quite a long time. It is called FFmpeg. I am surprised to see that many people would just overlook this awesome piece of software.Demo Video http://www.youtube.com/watch?v=Ewxm6T6rXP0
What is FFmpeg?
From the official website:
Quote:
In this tutorial, I’ll suppose you’re using Ubuntu Linux Karmic or Lucid, but the tutorial should also work for other versions with slight modifications.FFmpeg is a complete, cross-platform solution to record, convert and stream audio and video. It includes libavcodec – the leading audio/video codec library.
Preparation:
For this tutorial, you’ll need FFmpeg (preferably a recent revision) compiled with "--enable-x11grab" and the following libraries:
* libx264
* libfaac
* libvpx
* libvorbis
* libxvid
* libmp3lame
* libtheora
Because the version of FFmpeg that is available in the repositories is not compiled with these libraries, you need to compile it yourself. There is an easy-to-follow guide for compiling FFmpeg on ubuntu with those libraries here:
At this point, you should have the latest FFmpeg built with the needed encoding libraries. Let’s go to our main subject:
Screencasting:
We will do screencasting in 2 steps:
* Capture a lossless, crystal-clear video stream with lossless audio.
* Encode the resulting lossless file to a compressed version suitable for internet use.
The reason we’re doing it in a 2-step scheme (instead of just encoding directly as we capture) is that compressing a video with good quality takes some time and processing power that isn’t possible on the fly. The idea is to use the first step to only capture lossless audio/video feeds as fast as possible and store them, then use the 2nd step to do the real compression and get a better result. The 2nd step is needed because the losslessly-captured file is tremendously large to be used on the web.
Step 1:
Just for the record, basic ffmpeg syntax is:
Code:
Learn by example, fire up your terminal application and enter the following command:ffmpeg [input options] -i [input file] [output options] [output file]
Code:
ffmpeg -f alsa -ac 2 -i pulse -f x11grab -r 30 -s 1024x768 -i :0.0 -acodec pcm_s16le -vcodec libx264 -preset ultrafast -crf 0 -threads 0 output.mkv
Then press Enter to start the capturing process. To stop recording, go back to the terminal and press q.
In the above command, we capture audio from pulse (pulseaudio sound server) and encode it to lossless raw PCM with 2 audio channels (stereo). Then, we grab a video stream from x11 at a frame rate of 30 and a size of 1024×768 from the display :0.0 and encode it to lossless h264 using libx264. Using -threads 0 means automatic thread detection. If your distribution does not use the pulseaudio sound system, see FAQ section. The resulting streams will be muxed in a Matroska container (.mkv). The output file “output.mkv” will be saved to the current working directory.
Before we move to step 2, let’s look at things you can change in step 1. Obviously, the most important of which is the resolution. If you want to capture your entire desktop, then you have to enter the screen resolution you’re working at. It is also possible to capture a specific area of the screen by specifying a capture size that is smaller than the resolution. You can optionally offset this area by adding +X,Y after :0.0 which means it will look something like this:
Code:
This tells it to capture a rectangle of 800×600 with an X offset of 200 pixels and a Y offset of 100 pixels (the offset starting point is the top-left corner of the screen). Note that if you offset the capture area out of the screen, it will give you an error.-s 800x600 -i :0.0+200,100
Another thing you can change is the video frame rate (FPS). In the example above we used -r 30 which means capture at 30 FPS. You can change this value to whatever frame rate you want.
Step 2:
Now that we have the lossless file, let’s encode it to suit our needs. From here on, it all depends on what you’re planning to do with your screencast, but we’ll provide some basic examples and from there you move on.
Example 1:
Code:
In the above example, we encode the audio to AAC at a bitrate of 128k with 2 audio channels (stereo). We encode the video to the high quality H.264 video compression standard. We use the preset "slow" and a CRF value of 22 for rate control. The output file will be named “our-final-product.mp4″ and will be muxed in an .mp4 container. Note that FFmpeg determines the container format of the output file based on the extension you specify (i.e. if you specify the extension as .mkv, your file will be muxed into an .mkv matroska container). You can tweak the CRF value to get different results. The lower you set the CRF value, the better your video’s quality will be, and consequently the file size and encoding time will increase, and vice-versa.ffmpeg -i output.mkv -acodec libfaac -ab 128k -ac 2 -vcodec libx264 -preset slow -crf 22 -threads 0 our-final-product.mp4
Example 2:
WebM is a new, high-quality, free/open format that can be played in modern web browsers that support the HTML5 <video> tag. Since libvpx does not have a constant quality mode yet, we're doing the encode in 2 passes:
Pass 1:
Code:
Pass 2:ffmpeg -i output.mkv -an -vcodec libvpx -b 1000k -pass 1 our-final-product.webm
Code:
Change the bitrate (-b 1000k) to control the size/quality tradeoff. Also, change the number of threads (-threads 2) to suit the number of threads your CPU has. If your CPU is not multi-threaded, you can omit the -threads option completely. If you have a modern web browser, you can open the file and play it natively inside it. A WebM file consists of VP8 video and Vorbis audio mulitplexed into a .webm container (which is basically a subset of the Matroska container, aka .mkv).ffmpeg -i output.mkv -acodec libvorbis -ab 128k -ac 2 -vcodec libvpx -b 1000k -threads 2 -pass 2 our-final-product.webm
Example 3:
Code:
Usually when you start screencasting, there will be a few moments of “getting ready” that you may want to cut out of your final product. Same thing near the end. It is possible to only encode a specific range of the original lossless file you captured using the -ss and -t options. These options can come before the input file option (i.e. before -i output.mkv) or after it. If they are specified after it, seeking will be more accurate but a lot slower. In the above example, we specified the starting point of the encoding of our final product after 10 seconds from the start of the original input file using -ss 00:00:10. We also specify the duration of the encoding to be 7 minutes and 22 seconds, because we want to effectively cut something at the end we don’t want to show. If there isn’t anything you want to hide at the end, you can just omit the -t option altogether. We use Vorbis and H.264 for the audio and video respectively and mux the entire thing to an .mkv container. This mix of Vorbis/H.264/Matroska is my favorite .ffmpeg -ss 00:00:10 -t 00:07:22 -i output.mkv -acodec libvorbis -ab 128k -ac 2 -vcodec libx264 -preset slow -crf 22 -threads 0 our-final-product.mkv
Example 4:
Code:
Here we have a typical avi with xvid and mp3. The options from “-me_method full” to “-trellis 1″ are encoding parameters for libxvid. You can see that we used libmp3lame to encode the audio with the same options we used for the other examples. For video, tweaking the value of -qscale will give different results. Smaller value means higher video quality but increased file size and encoding time (Similar to libx264’s -crf in the first example) . The output file is muxed into an .avi container.ffmpeg -i output.mkv -acodec libmp3lame -ab 128k -ac 2 -vcodec libxvid -qscale 8 -me_method full -mbd rd -flags +gmc+qpel+mv4 -trellis 1 -threads 0 our-final-product.avi
Example 5:
Code:
In the above example, we have a completely free file , with vorbis for audio and theora for video. The video is encoded at 1000k bitrate and the output file is muxed to an .ogg container. The audio quality should be great since vorbis is a great audio codec, but the video quality will not be as good. Theora lags behind in almost every aspect of video compression. See the WebM example above (example 2) for a better free and open alternative.ffmpeg -i output.mkv -acodec libvorbis -ab 128k -ac 2 -vcodec libtheora -b 1000k our-final-product.ogg
There are many tricks you can use with step 2. You can record your entire desktop at step 1 and then crop it in step 2 to only cover the area you worked on. You can also resize your screencast in step 2. Dealing with these situations and many others is beyond the scope of this tutorial.
FAQ:
Q: How do I get the exact size and coordinates of a specific window I want to capture?
A: Use a command called “xwininfo“. Basically, you run this command and then click on the window that you want to capture. It will then print the window information to the terminal. This command prints a lot of information, but what you need are the following lines:
Absolute upper-left X:
Absolute upper-left Y:
Width:
Height:
If the command, for example, prints:
Absolute upper-left X: 383
Absolute upper-left Y: 184
Width: 665
Height: 486
Then, you will adapt it to FFmpeg like this:
-s 664x486 -i :0.0+383,184
Note that we used 664 instead of 665 for the width since ffmpeg only accepts resolutions divisible by 2.
You can use the following command line combination with "xwininfo" to only print the information you’ll be needing:
Code:
Q: How can I control PulseAudio input? (e.g. capture application audio instead of mic)xwininfo | grep -e Width -e Height -e Absolute
A: Install “pavucontrol“. Start recording with ffmpeg. Start pavucontrol. Go to the “Recording” tab and you’ll find ffmpeg listed there. Change audio capture from “Internal Audio Analog Stereo” to “Monitor of Internal Audio Analog Stereo“.
Now it should record system and application audio instead of microphone.
This setting will be remembered. The next time you want to capture with FFmpeg, it will automatically start recording system audio. If you want to revert this, use pavucontrol again to change back to microphone input.
Q: What are the recommended codecs/container to use if I’m planning to upload my screencast to YouTube?
A: YouTube recommends uploading clips using H.264 for the video and AAC for the audio in an .mp4 container (as in example 1 of step 2). This is the safest format to upload into because some codecs do have issues with YouTube. Refer to this page for other recommended codecs and containers for YouTube.
Q: What do I do if my system does not use the PulseAudio sound server?
A: Most recent Linux distributions have PulseAudio installed by default, but if your system does not have PulseAudio, then try replacing “-f alsa -ac 2 -i pulse” with something like:
-f alsa -ac 2 -i hw:0,0
Many users of this guide reported success with the above options. You might have to change the 0,0 to match that of your sound device. You could also try:
-f alsa -ac 2 -i /dev/dsp
Other users reported success with:
-f oss -ac 2 -i /dev/dsp
Basically there are many ways to do it, and it depends on your system’s sound configurations and hardware.
Q: How can I pause/resume screencasting?
A: That isn’t possible with ffmpeg yet, but you can use mkvmerge to achieve the same result. You can install this program from your distribution’s package management system under the package name mkvtoolnix, or download it from the official website. This program allows you to concatenate mkv files with identically-encoded streams to a single file. Meaning that if you want to make a pause from screencasting, you’ll just stop recording part 1, then start recording part 2 as another file, and finally concatenate (i.e. add) these 2 parts into a single screencast ready for final compression. You can do this for as many parts as you like. Example:
Code:
This command pruduces a video file named “complete.mkv” that has all the parts put together in the order they were specified into on the command line.mkvmerge -o complete.mkv part1.mkv +part2.mkv +part3.mkv +part4.mkv
However, note that all the parts you want to concatenate must have exactly the same size/framerate/encoding parameters, otherwise it won’t work. You can’t add files with different encoding options to each other.
Final note, before you start recording part 2 of your screencast, be sure to change the output file name, or else your previous precious work might be overwritten.
Q: I want to select an area of the screen with my mouse and get ffmpeg to record it. Is it possible?
A: Yes! There is a simple tool called "xrectsel" that you can use to select an area of the screen by drawing with your mouse, and it will print your selection coordinates which you can then use in ffmpeg. This tool comes as an auxiliary tool with the "FFcast2" bash script that wraps around ffmpeg's screencasting abilities
Q: How do I hide the mouse cursor?
A: Add "+nomouse" after ":0.0" to look like this:
Code:
(thanks again FakeOutdoorsman):0.0+nomouse
Q: I have a problem, error message, or ffmpeg doesn't work the way I expected it to do. How do I get help?
A: The best way to get help with ffmpeg is to login to the official IRC support channel for ffmpeg #ffmpeg @ irc.freenode.net, because 1) you will get an instant reply or engage in discussion about your problem and provide realtime feedback 2) the developers of ffmpeg know more about ffmpeg and its problems than we do (and they almost always hang around there and help people). If you want to ask for help here, you're most welcome. We'll try our best to support you, but bear in mind that the answer might come late, or we may not be able to help you with your problem.
Credits
verb3k
Dark_Shikari
FakeOutdoorsman
Updates:
Added FFcast2 reference link
changed syntax for new presets format on step1 (Thanks FakeOutdoorsman)
Removed all broken links, other junks
Old commands and their replacements
wttr.in
Benutzung:
$ curl wttr.in # aktuelle Position
$ curl wttr.in/muc # Wetter, Flughafen München
Unterstütze Ortstypen:
/paris # Stadtname
/~Eiffel+tower # wählbarer Ort
/Москва # Unicode Name von einem Ort in irgendeiner Sprache
/muc # IATA-Flughafencode (3 Buchstaben)
/@stackoverflow.com # Domainname
/94107 # Area code (nur für USA)
/-78.46,106.79 # GPS Koordinaten
Spezielle Orte:
/moon # Mondphase (bei Benutzung von z.B. ,+US oder ,+France wird die Phase des jeweiligen Ortes angezeigt)
/moon@2016-10-25 # Mondphase eines Tages (@2016-10-25)
Maßeinheiten:
?m # metrisch (SI) (standard überall außer bei Orten in den USA)
?u # USCS (standard in den USA)
?M # Windgeschwindigkeiten in m/s
Ansichteinstellungen:
?0 # Zeige nur aktuelles Wetter
?1 # Zeige aktuelles Wetter + 1 Tag
?2 # Zeige aktuelles Wetter + 2 Tage
?n # Kleine Version (nur Tag & Nacht)
?q # Schmale Version (kein 'Wetter Report' Text)
?Q # Superschmale Version (kein 'Wetter Report' Text und Ortsname)
?T # Keine Farben
PNG optionen:
/paris.png # generiert eine PNG Datei
?p # fügt einen Rahmen hinzu
?t # Transparenz von 150
transparency=... # Transparenz von 0 bis 255 (255 = nicht transparent)
Optionen können kombiniert werden:
/Paris?0pq
/Paris?0pq&lang=fr
/Paris_0pq.png # wird eine PNG benutzt, dann werden diese Optionen nach einem _ (Unterstrich) hinzugefügt
/Rome_0pq_lang=it.png # einzelne Optionen werden mit einem _ (Unterstrich) getrennt
Lokalisierung:
$ curl fr.wttr.in/Paris
$ curl wttr.in/paris?lang=fr
$ curl -H "Accept-Language: fr" wttr.in/paris
Unterstützte Sprachen:
am ar af be bn ca da de el et fr fa gl hi hu ia id it lt mg nb nl oc pl pt-br ro ru ta tr th uk vi zh-cn zh-tw (supported)
az bg bs cy cs eo es eu fi ga hi hr hy is ja jv ka kk ko ky lv mk ml mr nl fy nn pt pt-br sk sl sr sr-lat sv sw te uz zh zu he (in progress)
Spezialseiten:
/:help # zeigt diese Seite an
/:bash.function # zeigt empfehlenswerte bash Funktion wttr() an
/:translation # zeigt Informationen der Übersetzer an
Rechte im Dateisystem mehr als nur r,w,x
Erfahren Sie, wie Sie einfacher Verzeichnisstrukturen für Mitarbeiter bereitstellen und diese mit den benötigten Rechten und ACLs versehen können.
Stefan Kania 08. September 2015
Jeder der schon mal mit Linux auf der Kommandozeile gearbeitet hat und dort administrativ tätig war, kennt diese drei Buchstaben: "rwx" und das pro Eintrag im Dateisystem dreimal. Die Dateisystemberechtigungen! Aber was verbirgt sich noch hinter dem Begriff "Dateisystemberechtigungen"? Weit mehr als nur die drei Berechtigungen "read", "write" und "execute". Mit diesem Artikel werde ich weitere Facetten der Dateisystemberechtigungen wie "special Bits", "Access Control Lists" und "erweiterte Attribute" ansprechen.
Immer wieder höre ich in den Grundlagenseminaren zu Linux von Teilnehmern, dass man mit den drei einfachen Rechten "read", "write" und "execute" nicht viel anfangen kann. Dass komplexe Abbildungen von Zugriffsrechten unter Windows viel besser seien. Wo reicht es denn heute noch aus, dass man nur einem Benutzer und einer Gruppe Rechte an einem Verzeichnis oder einer Datei geben kann? Aber nicht nur Einsteiger, auch so mancher Admin stößt immer wieder an seine Grenzen.
Ich will in diesem Artikel nicht nur erklären, wie die Rechte funktionieren, was man mit den Rechten alles machen kann, sondern ich will auch praktische Tipps geben, die vielleicht das Leben mit den Dateisystemrechten etwas angenehmer machen können. Neben den bekannten Dateisystemrechten gehören auch noch die "special Bits", die "Access Contol Lists (ACL)" und die erweiterten Attribute in ein gut geplantes Berechtigungskonzept. Auch diese Themen werde ich in diesem Artikel ansprechen.
Die altbekannten Buchstaben "r","w","x"
Im Schnelldurchlauf will ich hier noch mal die Rechte "read", "write" und "execute" erklären, wobei ich dabei auch die unterschiedlichen Bedeutungen der Rechte an Dateien und Verzeichnissen erläutern werde:
- read
Das "read"-Recht an einer Datei bedeutet, die Datei kann zum Lesen geöffnet werden. Der Anwender der dieses Recht hat, kann den Inhalt lesen, aber nicht verändern. Das "read"-Recht an einem Verzeichnis erlaubt es, dass ein Anwender sich den Inhalt des Verzeichnisses mit "ls" anzeigen lassen kann. - write
Das "write"-Recht an einer Datei erlaubt es dem Anwender, den Inhalt einer Datei zu verändern. Er hat dadurch nicht das Recht, den Dateinamen zu ändern oder gar eine Datei zu löschen. Erst wenn ein Anwender das "write"-Recht an einem Verzeichnis hat, kann er die Einträge im Verzeichnis löschen, umbenennen und neue Einträge erstellen. Die Vergabe des "write"-Rechts an einem Verzeichnis sollte daher immer gut überlegt sein. Das Recht erlaubt es einem Anwender, alle Einträge in dem Verzeichnis zu löschen, auch wenn er an den Einträgen selbst keine Rechte hat. In allen heutigen Unix/Linux-Systemen muss der Anwender aber alle drei Rechte besitzen, um Einträge löschen, umbenennen oder erstellen zu können. - execute
Das "execute"-Recht erlaubt es einem Anwender, eine Datei auszuführen. Auf Binärdateien und Shell-Skripte muss immer das "execute"-Recht gesetzt sein, damit ein Anwender das Programm oder Shell-Skript ausführen kann. Hat ein Anwender das "execute"-Recht an einem Verzeichnis, kann er mit dem Kommando "cd" in das Verzeichnis wechseln.
user, group, other
Neben den Rechten selbst gibt es dann noch die Zuordnung der Rechte. Es gibt drei Berechtigungszuordnungen: Da wäre als erstes der Besitzer einer Datei (user), dann die besitzende Gruppe (group) und abschließend noch der Rest der Welt (other). Jeder dieser Berechtigungszuordnungen können die Rechte "read", "write" und "execute" zugeordnet werden. Ein Anwender kann aber immer nur die Rechte über eine der Berechtigungszuordnungen erhalten. Er ist also entweder der Besitzer einer Datei, dann erhält er die Rechte von "user", oder er ist Mitglied der besitzenden Gruppe, dann erhält er die Rechte von "group". Wenn er weder Besitzer noch Mitglied der besitzenden Gruppe ist, erhält er immer die Rechte von "other". Sie sehen schon, Rechte über "other" zu vergeben ist keine gute Lösung, da Sie den Zugriff auf Dateisystemeinträge nicht wirklich steuern können.
Immer alles Oktal
Systeme können nichts mit Buchstaben wie "r", "w" oder "x" anfangen, Systeme benötigen Zahlen und die am besten im Binärformat. Deshalb werden die Berechtigungen intern in Binärwerten mit drei Stellen abgebildet. Daraus entstehen dann die Oktalwerte für die Rechte wie Sie sie in der Tabelle sehen können. Egal ob für "user", "group" oder "other" – die Rechte haben dabei die folgenden Wertigkeiten:
Recht Binärwert Oktalwert -------- ------------ ---------------- read 2^2 4 write 2^1 2 execute 2^0 1
Werden also alle Rechte an eine Berechtigungszuordnung vergeben, ergibt das einen Oktalwert von "7". Maximal also "777".
Woher kommen die Rechte im Dateisystem?
Wenn Sie eine Datei oder ein Verzeichnis anlegen, haben diese Einträge bereits Berechtigungen, aber wo kommen diese Berechtigungen her? Eine Vererbung wie Sie sie von Windows her kennen gibt es unter Linux nicht. Hier ist die "umask" für die Vergabe der Berechtigungen eines neuen Eintrags im Dateisystem verantwortlich. Sie können sich die Umask mit dem gleichnamigen Kommando anzeigen lassen. Hier ein Beispiel:
stefan@stefan:~% umask 022
Die drei Stellen der Umask stehen hier für eine Berechtigungszuordnungen. Die erste Stelle für "user", die zweite für "group" und die dritte für "other". Die Umask zeigt an, welche Rechte beim Anlegen eines neuen Eintrags im Dateisystem NICHT vergeben werden. Der Besitzer erhält immer alle Rechte, die besitzenden Gruppe alles außer dem Schreibrecht, genau wie der Rest der Welt. Das bedeutet in der Standardeinstellung kann der Rest der Welt immer in alle Verzeichnisse wechseln und sich den Inhalt aller Dateien anzeigen lassen. Jeder Anwender kann über die Kommandozeile die Einstellung der Umask mit dem Kommando "umask <wert>" selbst anpassen. Später in diesem Artikel werde ich noch auf die Planung eines Berechtigungskonzeptes eingehen, dabei werde ich zeigen, wie man die Umask auch systemweit setzen können. Doch sehen wir uns einmal je einen neuen Eintrag für eine Datei und ein Verzeichnis an und vergleichen dieses mit der gesetzten Umask:
stefan@stefan:~% ls -l insgesamt 4 -rw-r--r-- 1 stefan users 0 Aug 4 11:34 datei1 drwxr-xr-x 2 stefan users 4096 Aug 4 11:34 verzeichnis1
Hier sieht man, dass die Berechtigungen am Verzeichnis mit der Umask übereinstimmen. Der Gruppe und dem Rest der Welt wurde das Schreibrecht nicht vergeben. Der Besitzer hat alle Rechte. Aber was ist mit der Datei? Da fehlt bei allen drei Berechtigungszuordnungen das Execute-Recht. Das ist auch korrekt so! Denn das Betriebssystem überprüft beim Anlegen einer neuen Datei, ob es überhaupt Sinn macht, das Execute-Rechte an der Datei zu setzen. Bei allen nicht-binär-Dateien macht das Setzen des Execute-Rechts auch keinen Sinn, also setzt das System das Recht auch nicht. Nur wenn Sie einen Quellcode kompilieren und dabei eine ausführbare Datei entsteht, dann wird auch das Execute-Recht entsprechend der Umask gesetzt.
Wie werden Rechte gesetzt?
Nach dem Sie jetzt eine Einführung zu den Rechten erhalten haben, will ich jetzt erklären, wie die Rechte gesetzt werden und wer alles Rechte setzen kann. Auch das Ändern der besitzenden Gruppe und des Besitzer will ich in diesem Abschnitt erklären.
Die Rechte an einem Eintrag können immer vom "root" und dem Besitzer einer Datei geändert werden. Zum Ändern der Rechte wird das Kommando "chmod" verwendet. Das Kommando "chmod" kann dabei auf zwei verschiedene Arten angewendet werden: Einmal gibt es die relative Vergabe der Berechtigungen, bei der immer die derzeitige Berechtigung geändert wird. Dann gibt es noch die absolute Vergabe der Berechtigungen, bei der der komplette Satz an Berechtigungen für alle Berechtigungszuordnungen neu erstellt wird.
Relative Vergabe der Rechte im Dateisystem
Bei der relativen Vergabe der Berechtigungen können Sie jedes einzelne Recht für sich vergeben. Hier sehen Sie einige Beispiele:
stefan@stefan:~% chmod u+x datei1 stefan@stefan:~% ls -l datei1 -rwxr--r-- 1 stefan users 0 Aug 4 11:34 datei1 stefan@stefan:~% chmod g-r,o-r datei1 stefan@stefan:~% ls -l datei1 -rwx------ 1 stefan users 0 Aug 4 11:34 datei1 stefan@stefan:~% chmod a+r datei1 stefan@stefan:~% ls -l datei1 -rwxr--r-- 1 stefan users 0 Aug 4 11:34 datei1 stefan@stefan:~% chmod a+rx datei1 stefan@stefan:~% ls -l datei1 -rwxr-xr-x 1 stefan users 0 Aug 4 11:34 datei1
Wie Sie an den Beispielen sehen, können Sie jedes Recht einzeln setzen. Wenn Sie ein Recht zum Beispiel mit "chmod u+x datei1" ändern wollen, aber der Besitzer bereits das Execute-Recht an der Datei hat, ändert sich nichts. Auch sehen Sie in den Beispielen, dass Sie mit der Option "a+r" oder "a-r" ein oder mehrere Rechte für alle Berechtigungszuordnungen gleichzeitig ändern können.
Absolute Vergabe der Rechte im Dateisystem
Dabei gehen Sie ganz anders vor. Sie überlegen sich, welche Rechte Sie für alle drei Berechtigungszuordnungen vergeben wollen, diese rechnen Sie dann in den entsprechenden dreistelligen Oktalwert um und vergeben dann die Rechte für den Eintrag komplett neu. Als Beispiel:
stefan@stefan:~% ls -l datei1 -rwxr-xr-x 1 stefan users 0 Aug 4 11:34 datei1 stefan@stefan:~% chmod 600 datei1 stefan@stefan:~% ls -l datei1 -rw------- 1 stefan users 0 Aug 4 11:34 datei
Hier spielt es keine Rolle, welche Rechte vorher auf dem Eintrag gesetzt waren, alle Rechte werden überschrieben.
Ändern der besitzenden Gruppe
Die besitzende Gruppe kann sowohl vom "root" als auch vom Besitzer eines Eintrags geändert werden. Wobei es für den Besitzer eine Einschränkung gibt: Er kann einen Eintrag des Dateisystems nur an Gruppen übergeben, in denen er auch Mitglied ist. Für die Änderung der besitzenden Gruppe verwenden Sie das Kommando "chgrp". Das Beispiel zeigt, wie der Gruppenbesitz geändert wird:
stefan@stefan:~% chgrp cdrom datei1 stefan@stefan:~% ls -l datei1 -rw------- 1 stefan cdrom 0 Aug 4 11:34 datei1
Ändern des Besitzers
Den Besitzer eines Eintrages im Dateisystem - gleich ob Datei oder Verzeichnis - kann nur der "root" ändern. Mit dem Kommando "chown" kann der "root" nicht nur den Besitzer ändern, sondern auch gleichzeitig die besitzenden Gruppe. Auch hierfür einige Beispiele:
root@stefan:~# chown stka datei1 root@stefan:~# ls -l datei1 -rw------- 1 stka cdrom 0 Aug 4 11:34 datei1 root@stefan:~# chown stefan:users datei1 root@stefan:~# ls -l datei1 -rw------- 1 stefan users 0 Aug 4 11:34 datei1
Wie Sie sehen, wurde dieser Vorgang als Benutzer "root" durchgeführt.
Special Bits
Bis zu diesem Punkt ist das Thema für viele von Ihnen mehr oder weniger bekannt. Jetzt kommt die erste Erweiterung der Berechtigungen. In den letzten Abschnitten habe ich immer von drei Oktalgruppen für die Berechtigungen gesprochen. Aber es gibt vier dieser Gruppen. Vor den eigentlichen Dateisystemberechtigungen steht eine vierte Gruppe bestehend aus drei Bits, die zusätzliche Rechte geben oder auch Rechte nehmen kann. Die folgende Tabelle zeigt eine Übersicht der Bits:
Rechte Binärwerte Oktalwert ------------------------------------------ SUID 2^2 4 SGID 2^1 2 Sticky Bit 2^0 1
Das SUID-Bit
Werfen wir doch einmal einen Blick auf die Rechte die an der Datei "/etc/shadow" vergeben sind:
stefan@stefan:~% ls -l /etc/shadow -rw-r----- 1 root shadow 1360 Mai 27 08:52 /etc/shadow
Da sehen Sie, dass der "root" Lese- und Schreibrecht hat und die Gruppe "shadow" nur das Leserecht. In dieser Datei befinden sich die Passwortinformationen aller Benutzer des lokalen Systems. Nur aufgrund der Rechte an der Datei sieht es so aus, als hätte ein "normaler" Benutzer keine Rechte an dieser Datei. In dieser Datei befindet sich aber das Passwort eines jeden Benutzers. Ein Benutzer kann aber sein Passwort mit dem Kommando "passwd" ändern und greift damit schreibend auf die Datei zu. Wie kann das sein? Schauen wir deshalb mal auf die Berechtigungen des Programms "/usr/bin/passwd":
stefan@stefan:~% ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 47032 Jul 15 21:29 /usr/bin/passwd
Da fällt auf, dass an der Stelle, wo sonst beim Besitzer ein "x" steht, jetzt ein "s" steht. Dieses kleine "s" zeigt an, dass das SUID-Bit gesetzt ist. Was passiert jetzt, wenn ein "normaler" Benutzer das Programm "passwd" aufruft um sein Passwort zu ändern? Das System prüft, ob der Benutzer das Recht hat, das Programm zu starten. Da der Benutzer über "other" die Rechte "r-x" besitzt, kann der Benutzer das Programm aufrufen. Jetzt prüft das System zusätzlich, ob das SUID-Bit gesetzt ist. Ist das der Fall, wie bei dem Programm "passwd", erhält der Benutzer ein ZUSÄTZLICHE UID, nämlich die UID des Besitzers des Programms. Damit hat der Benutzer für die Laufzeit des Programms zwei UIDs, seine
eigene und die des "root". Da der "root" Schreibrechte an der Datei "/etc/passwd" hat, kann der Benutzer jetzt sein Passwort ändern. Programme, bei denen das SUID-Bit gesetzt ist, lassen sich nicht im Hintergrund starten. Das wäre auch fatal, da dann der Benutzer im Vordergrund "root"-Rechte hätte.
Das Setzen des SUID-Bits ist nur sinnvoll auf Binärdateien. Das Recht können Sie mit dem Kommando "chmod u+s <Programm>" setzen und entfernen mit "chmod u-s <Programm>". Damit das SUID-Bit genutzt werden kann, muss auch immer für den
Besitzer das "x"-Bit gesetzt sein. Da nach dem Setzen des SUID-Bits an der Stelle des "x" jetzt immer ein "s" steht, können Sie das gesetzte "x"-Bit daran erkennen, dass es sich bei dem "s" um ein kleines "s" handelt. Würde an der Stelle ein großes "S" stehen, wäre das "x"-Bit nicht gesetzt.
Das SGID-Bit
Mit dem SGID-Bit können Sie die Verwaltung der Rechtestruktur in Ihrem Dateisystem beeinflussen. Normalerweise gibt es bei Linux keine Vererbung der Berechtigungen im Dateisystem, aber durch den Einsatz des SGID-Bits können Sie das in einem bestimmten Rahmen ändern. Wenn Sie an einem Verzeichnis das SGID-Bit setzen, wird ab diesem Zeitpunkt jeder neue Eintrag unterhalb des Verzeichnisses immer der Gruppe gehören, die in diesem Verzeichnis als besitzende Gruppe eingetragen ist. Das SGID-Bit vererbt sich auch auf alle neu erstellten Unterverzeichnisse, die nach dem Setzen des SGID-Bits erzeugt werden. Wenn Sie auf Ihrer Verzeichnisstruktur das SGID-Bit an den einzelnen Abteilungsverzeichnissen setzen, gehören anschließend alle Einträge der entsprechenden Gruppe, ohne dass ein Benutzer seine Standardgruppe ändern müsste. Zusammen mit einer angepassten Umask können Sie dann bestimmte Verzeichnisse gezielt einer Gruppe zuordnen und die Rechte bestimmen. Mehr dazu folgt später im praktischen Teil dieses Artikels.
Der Einsatz des SGID-Bits ist nur sinnvoll, wenn es auf Verzeichnisse gesetzt wird. Es wird mit dem Kommando "chmod g+s <Verzeichnis>" gesetzt. Hier ein Beispiel:
stefan@stefan:~% chmod g+s verzeichnis1 stefan@stefan:~% ls -ld verzeichnis1 drwxr-sr-x 2 stefan users 4096 Aug 4 11:34 verzeichnis1 stefan@stefan:~% chgrp cdrom verzeichnis1 stefan@stefan:ueb~% cd verzeichnis1 stefan@stefan:~/verzeichnis1% mkdir verzeichnis1a stefan@stefan:~/verzeichnis1% ls -ld verzeichnis1a drwxr-sr-x 2 stefan cdrom 4096 Aug 4 17:31 verzeichnis1a
Hier sehen Sie, dass das neue Verzeichnis der neu zugeordneten Gruppe "cdrom" gehört und das SGID-Bit am Verzeichnis "verzeichnis1" gesetzt wurde. Auch das neue Unterverzeichnis "verzeichnis1/verzeichnis1a" hat das SGID-Bit gesetzt.
Das Sticky-Bit
Der Name dieses Bits stammt von seiner ursprünglichen Bedeutung. Wurde dieses Bit auf ein ausführbares Programm vom "root" gesetzt, dann blieb das Programm nach Beendigung im Arbeitsspeicher "kleben". Beim nächsten Aufruf wurde das Programm dann direkt aus dem Arbeitsspeicher gestartet. Dadurch wurde der Startvorgang des Programms beschleunigt. Linux nutzt das Sticky-Bit aber anders. Wenn Sie das Sticky-Bit an einem Verzeichnis setzen, kann nur noch der Besitzer einer Datei in dem Verzeichnis diese auch löschen. Auch wenn ein anderer Benutzer am Verzeichnis die Rechte "r,w,x" besitzt, ist er nicht berechtigt eine Datei zu löschen. Das Sticky-Bit macht nur Sinn, wenn es auf Verzeichnissen gesetzt wird. Das Sticky-Bit setzen Sie mit dem Kommando "chmod o+t <Verzeichnis>". Ein Beispiel:
stefan@stefan:~% mkdir verzeichnis2 stefan@stefan:~% chmod g+w,o+t verzeichnis2 stefan@stefan:~% ls -ld verzeichnis2 drwxrwxr-t 2 stefan users 4096 Aug 4 18:02 verzeichnis2 stefan@stefan:~% cd verzeichnis2 stefan@stefan:~/verzeichnis2% touch datei2 stefan@stefan:~/verzeichnis2% ls -l datei2 -rw-r--r-- 1 stefan users 0 Aug 4 18:04 datei2 stefan@stefan:berechtigungen-ia/verzeichnis2% su stka Passwort: stka@stefan:/home/stefan/verzeichnis2% rm datei2 rm: Normale leere Datei (schreibgeschützt) »datei2“ entfernen? y rm: das Entfernen von »datei2“ ist nicht möglich: Vorgang nicht zulässig
Sie sehen hier, obwohl der Benutzer "stka" alle Rechte am Verzeichnis "verzeichnis2" über die Gruppe "users" (in der er Mitglied ist) erhält, kann er die Datei in dem Verzeichnis nicht löschen. Auch die Meldung ist eine ganz andere, als wenn ihm das Recht fehlen würde. Hier wird jetzt auf Grund des Sticky-Bits der Vorgang untersagt. Das Sticky-Bit ist ein sehr gutes Mittel, um in Verzeichnissen auf die mehrere Benutzer Zugriff haben, ein versehentliches Löschen von Dateien durch Nichtbesitzer zu verhindern. Das Bit schützt aber nicht vor der Veränderung des Inhalts von Dateien.
Die erweiterten POSIX-ACLs
Aber was tun Sie, wenn Sie an einem Verzeichnis unterschiedliche Rechte für unterschiedliche Gruppen vergeben wollen? Diese Aufgabe können Sie nicht mehr mit den einfachen Dateisystemrechten lösen. Dafür benötigen Sie die Access Control Lists (ACL). Hier geht es darum, die Dateisystemrechte zu erweitern. Mithilfe der ACL ist es möglich, dass mehrere Gruppen oder Benutzer an einer Datei oder einem Verzeichnis unterschiedliche Rechte erhalten. Damit Sie die ACLs nutzen können, müssen Sie als Erstes das Dateisystem für die ACL-Unterstützung anpassen. Alle gängigen Dateisysteme wie ext2, ext3, ext4, reiserfs und xfs unterstützen ACLs. Aber die ACLs müssen eventuell beim Mounten des Dateisystems als Option mit angegeben werden. Sie können die entsprechende Option natürlich auch direkt in dem Eintrag der "/etc/fstab" mit angeben, so werden die ACLs auch bei einem Systemstart sofort wieder aktiviert.
Warum nur "eventuell"? Weil bei vielen aktuellen Distributionen die Dateisysteme schon so kompiliert wurden, dass sie ACLs unterstützen. Wenn Sie die in diesem Abschnitt besprochenen Beispiele auf Ihrem System nachvollziehen können, ohne die Datei "/etc/fstab" anpassen zu müssen, dann unterstützt Ihr Dateisystem die ACLs ohne dass Sie weitere Optionen angeben müssen. Sollte das nicht der Fall sein, müssen Sie die Einträge in Ihrer "/etc/fstab" wie folgt anpassen:
/dev/hdb1 /daten ext4 errors=remount-ro,acl 0 0
Hier wurde für eine Datenpartition die Option "acl" hinzugefügt. Nach einem "remount" mit dem Kommando "mount -o remount,rw /daten" stehen dann auf dieser Partition die ACLs zur Verfügung. Bei den ACLs wird zwischen den einfache ACLs und den default ACLs unterschieden. Zur Verwaltung der ACLs gibt es die Kommandos "setfacl" zum Setzen der ACLs und "getfacl" zum Auslesen der ACLs. Wenn diese Programme auf Ihrem System nicht vorhanden sind, müssen Sie das Paket "acl" nachinstallieren.
Die einfachen ACLs
Einfache ACLs gelten nur für das Verzeichnis oder die Datei, auf die sie angewendet wurden. Die einfachen ACLs werden nicht vererbt. Das folgende Listing zeigt, wie eine ACL auf ein Verzeichnis gesetzt wird:
stefan@stefan:~% mkdir verzeichnis3 stefan@stefan:~% ls -ld verzeichnis3 drwxr-xr-x 2 stefan users 4096 Aug 4 18:51 verzeichnis3 stefan@stefan:~% setfacl -m g:cdrom:rx verzeichnis3 stefan@stefan:~% ls -ld verzeichnis3 drwxr-xr-x+ 2 stefan users 4096 Aug 4 18:51 verzeichnis3 stefan@stefan:~% getfacl verzeichnis3 # file: verzeichnis3 # owner: stefan # group: users user::rwx group::r-x group:cdrom:r-x mask::r-x other::r-x
Im ersten Teil des Beispiels wird ein neues Verzeichnis angelegt und die Rechte aufgelistet. Im zweiten Teil wird dann mit dem Kommando "setfacl -m g:cdrom:rx verzeichnis3" ein ACL gesetzt. Die einzelnen Parameter haben dabei die folgende Bedeutung:
- -m
Mit dieser Option "-m" wird das Kommando "setfacl" angewiesen, die ACL eines Eintrages zu modifizieren. - - g:cdrom:rx verzeichnis3
Eine Gruppe (bestimmt durch den Parameter "g") "cdrom" erhält die Rechte "rx" am "verzeichnis3"
Die Reihenfolge der Parameter muss dabei eingehalten werden.
Im dritten Teil werden die Rechte des Verzeichnisses "verzeichnis3" nochmal aufgelistet. Hier sehen Sie, dass nach den Rechten jetzt ein "+" zu sehen ist. Dieses "+" weist darauf hin, dass an dem Eintrag im Dateisystem ACLs gesetzt sind. Dann wird die ACL des Verzeichnisses "verzeichnis3" aufgelistet. Hier sehen Sie jetzt, dass neben der Gruppe "users" die Gruppe "cdrom" Rechte erhalten hat.
ACHTUNG: Wenn Sie auf einem Eintrag im Dateisystem – egal ob bei einem Verzeichnis oder einer Datei – eine ACL gesetzt haben, dürfen Sie von dem Moment an keine Berechtigungen mehr mit dem Kommando "chmod" ändern. Denn dann ändern Sie nicht mehr die Rechte sondern nur eine ACL-Maske. Diese Maske kann nur Rechte ausfiltern. Sprich: ein Recht, das dort nicht gesetzt ist, kann auch keine Gruppe oder Benutzer erhalten.
Um das Verhalten zu verdeutlichen, folgt hier ein Beispiel:
stefan@stefan:~% chmod g-r verzeichnis3 stefan@stefan:~% getfacl verzeichnis3 # file: verzeichnis3 # owner: stefan # group: users user::rwx group::r-x #effective:--x group:cdrom:r-x #effective:--x mask::--x other::r-x
Hier sehen Sie, dass die Gruppen nur noch das effektive Recht "x" besitzen, durch die Maske wird das "r"-Recht ausgefiltert. Wenn das Recht mit "chmod" wieder zurückgesetzt wird, wird auch die Maske wieder zurückgesetzt. Was passiert aber, wenn die besitzende Gruppe (so wie im Beispiel) nur die Rechte "r-x" besitzt und Sie für eine andere Gruppe die Rechte "rwx" setzen wollen? Denn in der Standardberechtigung fehlt ja das "w"-Recht. Da es sich bei den Berechtigungen aber um einen Filter handelt, müsste das "w"-Recht auch für eine andere Gruppe nicht wirksam sein. Aber das ist nicht so, wie das folgende Listing zeigt:
stefan@stefan:~% setfacl -m g:cdrom:rwx verzeichnis3 stefan@stefan:~% getfacl verzeichnis3 # file: verzeichnis3 # owner: stefan # group: users user::rwx group::r-x group:cdrom:rwx mask::rwx other::r-x
Obwohl die besitzende Gruppe nur die Rechte "r-x" besitzt, hat die Gruppe "cdrom" alle Rechte am Verzeichnis. Erst eine nachträgliche Veränderung der Berechtigungsliste verändert die Maske. Selbstverständlich können Sie auch einem einzelnen Benutzer Rechte über ACLs vergeben. Das Listing zeigt diesen Vorgang:
stefan@stefan:~% setfacl -m u:stka:rwx verzeichnis3 stefan@stefan:~% getfacl verzeichnis3 # file: verzeichnis3 # owner: stefan # group: users user::rwx user:stka:rwx group::r-x group:cdrom:rwx mask::rwx other::r-x
Wenn Sie jetzt in dem Verzeichnis eine neue Datei oder Verzeichnis erstellen, werden Sie feststellen, dass die ACLs nicht auf die neuen Einträge übernommen wurden. Damit die ACLs auf neue Einträge vererbt werden, müssen Sie die "defaults ACLs" an Verzeichnissen setzen.
Die default ACLs
Bis jetzt waren alle ACLs immer nur für den Eintrag gültig, auf dem Sie die ACL gesetzt hatten. Mit den default ACLs können Sie jetzt Berechtigungen auf ein Verzeichnis setzen, die sich dann an alle darunter neu erstellten Einträge vererben. Das Listing zeigt wie Sie default ACLs setzen können:
stefan@stefan:~% mkdir verz-def-acl stefan@stefan:~% setfacl -d -m g:cdrom:rwx verz-def-acl stefan@stefan:~% ls -ld verz-def-acl drwxr-xr-x+ 2 stefan users 4096 Aug 6 10:57 verz-def-acl stefan@stefan:~% getfacl verz-def-acl # file: verz-def-acl # owner: stefan # group: users user::rwx group::r-x other::r-x default:user::rwx default:group::r-x default:group:cdrom:rwx default:mask::rwx default:other::r-x
Mit der setfacl-Option "-d" erstellen Sie ein default ACL. Wenn Sie sich das Verzeichnis mit "ls" anzeigen lassen, sehen Sie auch hier wieder das Pluszeichen am Ende der Rechteliste, welches auf das Vorhandensein von ACL hinweist. Lassen Sie sich jetzt die ACLs mittels "getfacl" anzeigen, sehen Sie, dass alle ACLs als "default ACLs" eingetragen wurden. Wenn Sie jetzt in dem Verzeichnis ein neues Verzeichnis oder eine neue Datei anlegen, werden diese Einträge die ACLs übernehmen. In nächsten Listing möchte ich Sie noch einmal auf das Verhalten beim Anlegen einer Datei hinsichtlich des x-Rechts aufmerksam machen. In den "default ACLs" ist ja das x-Recht immer mit gesetzt und wird somit auf alle neuen Einträge übernommen. Auch auf Dateien werden diese "default ACLs" gesetzt. Wenn Sie jetzt aber eine leere Datei oder eine Datei einer Anwendung erstellen, vergibt das Betriebssystem das x-Recht nicht an diese Datei. In den ACLs ist es aber gesetzt, deshalb sehen Sie bei dem Aufruf von "getfacl" den Hinweis "effective". Das ist kein Fehler, das ist das richtige Verhalten.
stefan@stefan:~% touch dat-acl stefan@stefan:~% getfacl dat-acl # file: dat-acl # owner: stefan # group: users user::rw- group::r-x #effective:r-- group:cdrom:rwx #effective:rw- mask::rw- other::r--
Löschen von ACLs
Sowohl die einfachen, als auch die default ACLs löschen Sie mit dem Kommando "setfacl". Beim Entfernen der ACLs wird zwischen den unterschiedlichen ACLs unterschieden. Sie müssen vor dem Löschen wissen, ob Sie ein einfache oder eine default ACL entfernen wollen. Das folgende Listing zeigt den Vorgang des Löschens einer default ACL:
stefan@stefan:~/verz-def-acl% setfacl -k verz-acl stefan@stefan:~/verz-def-acl% getfacl verz-acl # file: verz-acl # owner: stefan # group: users user::rwx group::r-x group:cdrom:rwx mask::rwx other::r-x stefan@stefan:berechtigungen-ia/verz-def-acl% ls -ld verz-acl drwxrwxr-x+ 2 stefan users 4096 Aug 6 11:05 verz-acl
Durch die Option "-k" werden alle default ACLs des Eintrags gelöscht, die einfachen ACLs bleiben erhalten. Mit der Option "-b" löschen Sie die einfachen ACLs:
stefan@stefan:~/verz-def-acl% setfacl -b verz-acl stefan@stefan:~/verz-def-acl% ls -ld verz-acl drwxr-xr-x 2 stefan users 4096 Aug 6 11:05 verz-acl
Und dann ist da noch das Folgende
Bis zu diesem Zeitpunkt haben wir immer nur ACLs auf einzelne Einträge gesetzt oder entfernt. Selbstverständlich können Sie die ACLs auch rekursiv über einen ganzen Teilbaum setzen oder löschen. Auch ein Sichern der ACLs mittels "getfacl" können Sie rekursiv durchführen und diese Sicherung später mittels "setfacl" wieder einspielen. Das ist besonders dann wichtig, wenn Sie eine Backup-Software einsetzen, die keine ACLs sichern kann. Dann können Sie die ACLs getrennt in eine Datei sichern und anschließend – bei einem eventuellen Recovery des Dateisystems – aus der Datei wieder einspielen. Sowohl das Kommando "setfacl" als auch das Kommando "getfacl" kennen die Option "-R" für das rekursive Löschen oder Anzeigen. Im folgenden Listing sehen Sie ein paar Beispiele für die Verwendung von "setfacl" und "getfacl":
stefan@stefan:~% getfacl -R verz-def-acl stefan@stefan:~% getfacl -R verz-def-acl > sicherung.acl stefan@stefan:~% setfacl -R -m g:cdrom:rwx verz-def-acl stefan@stefan:~% setfacl --restore=sicherung.acl
Im ersten Beispiel werden alle ACLs aller Einträge angezeigt. Im zweiten Beispiel werden die Einträge in eine Datei gesichert. Beim dritten Beispiel werden alle Einträge ab dem angegeben Verzeichnis mit einer ACL belegt. Das vierte Beispiel zeigt dann, wie Sie die ACLs aus einer Datei wieder einspielen können. Wenn Sie jetzt die ACLs in Ihrem Dateisystem anwenden wollen, dann stellen Sie schnell fest, dass Dateien und Verzeichnisse unterschiedliche ACLs benötigen. Zum Beispiel braucht ein Textdokument kein x-Recht, aber ein Verzeichnis benötigt dieses Recht auf jeden Fall, denn sonst kann nicht in das Verzeichnis gewechselt werden. Deshalb können Sie das Kommando "setfacl" sehr gut zusammen mit dem Kommando "find" einsetzen. Im nächsten Listing zeige ich Ihnen, wie Sie für alle Dateien und Verzeichnisse ab einem bestimmten Punkt ACLs setzen können:
stefan@stefan:~% find . -type d -exec setfacl -d -m g:cdrom:rwx {} \;
stefan@stefan:~% find . -type f -exec setfacl -m g:cdrom:r {} \;
Im ersten Beispiel werden alle Verzeichnisse ab dem aktuellen Verzeichnis gesucht und anschließend wird für jedes Verzeichnis die entsprechende default ACL gesetzt. Im zweiten Beispiel wird nach allen Dateien gesucht und die einfache ACL gesetzt. Die Option "-d" darf hier nicht verwendet werden, da sich default ACLs nur auf Verzeichnisse setzen lassen. Verwenden Sie trotzdem die Option "-d", werden für die Dateien Fehlermeldungen ausgeworfen.
Zusammen mit den Berechtigungen, den "special-Bits" und den ACLs stehen Ihnen jetzt eine Vielzahl von Möglichkeiten zur Verfügung, die Rechte in Ihrem Dateisystem gezielt zu setzen.
Die erweiterten Attribute
Auch Linux kennt im Dateisystem erweiterte Attribute mit denen Sie bestimmte Einschränkungen beim Zugriff auf Dateien einrichten können. Diese erweiterten Attribute möchte ich an dieser Stelle vorstellen. Um die Attribute verwenden zu können muss das Dateisystem vorbereitet werden. Denn auch für die Attribute gibt es eine Mountoption, die Sie wieder bei einigen älteren Distributionen in der Datei "/etc/fstab" setzen müssen. Das Listing zeigt Ihnen den angepassten Eintrag in der Datei:
/dev/hdb1 /daten ext4 errors=remount-ro,acl,user_xattr 0 0
Nach einem "remount" des Dateisystems stehen Ihnen dann die erweiterten Attribute zur Verfügung. Die Attribute setzen Sie mit dem Kommando "chattr". Auflisten können Sie die Attribute mit dem Kommando "lsattr", sollten diese Kommandos auf Ihrem System nicht vorhanden sein, müssen Sie das Paket "attr" nachinstallieren.
Bei den Attributen gibt es zwei Gruppen: Die Attribute der einen Gruppe können von "normalen" Benutzern gesetzt werden, die Attribute der anderen Gruppe können nur vom "root" gesetzt werden. Unter den Attributen gibt es einige, die sowieso selten benötigt werden, diese sollen hier nicht betrachtet werden. Aber einige der Attribute können im täglichen Umgang mit Dateisystemrechten nützlich sein. Diese werden ich Ihnen hier erklären.
Attribute, die jeder setzen kann
- Das Attribut "d"
Durch Setzen dieses Attributs verhindern Sie, dass die entsprechende Datei bei einer Datensicherung mit dem Kommando "dump" mitgesichert wird. - Das Attribut "s"
Wenn ein Benutzer dieses Attribut setzt, wird die Datei beim Löschen mit Nullen überschrieben. - Das Attribut "A"
Wenn Sie das Attribut "A" setzen, wird die "atime" der Datei nicht verändert. Das kann die Performance beim Schreiben erhöhen. Besser ist es aber, hier die Option "noatime" für das gesamte Dateisystem in der Datei "/etc/fstab" zu setzen.
Attribute die nur der "root" setzen kann
- Das Attribut "a"
Wenn Sie als "root" dieses Attribut auf eine Datei setzen, kann der Inhalt der Datei nicht mehr geändertwerden, es können nur noch Daten an die Datei angehängt werden. Hier sehen Sie dazu ein Beispiel:root@stefan:~# touch datei1.txt root@stefan:~# chattr +a datei1.txt root@stefan:~# lsattr datei1.txt -----a------------- datei1.txt root@stefan:~# echo "Eine neue Zeile" > datei1.txt -bash: datei1.txt: Die Operation ist nicht erlaubt root@stefan:~# echo "Eine neue Zeile anhängen " >> datei1.txt
Mit dem ersten Kommando wird einfach eine leere Datei erzeugt, bei der im zweiten Schritt das Attribut "a" gesetzt wird. Im Anschluss wird versucht, eine Zeile in die Datei mit einer einfachen Umleitung zu schreiben. Diese Operation wird aufgrund des Attributs verboten. Selbst der "root" kann den Inhalt der Datei nicht verändern, solange das Attribute "a" gesetzt ist. Erst im nächsten Schritt wird eine Zeile an die Datei angehängt, und jetzt ist das
Schreiben in die Datei möglich.
- Das Attribut "i"
Durch das Attribut "i" wird die Datei immun gegen das Ändern, Umbenennen und Löschen. Auch der "root" kann eine Datei mit diesem Attribut nicht löschen, ohne vorher das Attribut zurückzusetzen. Auch dazu sehen Sie ein Beispiel: root@stefan:~# chattr +i datei1.txt
root@stefan:~# lsattr datei1.txt ----i-------------- datei1.txt root@stefan:~# echo "Eine zweite Zeile anhängen " >> datei1.txt -bash: datei1.txt: Keine Berechtigung root@stefan:~# ls -l datei1.txt -rw-r--r-- 1 root stefan 27 27. Jul 18:02 datei1.txt root@stefan:~# rm datei1.txt rm: Entfernen von "datei1.txt" nicht möglich: Die Operation ist nicht erlaubt root@stefan:~# mv datei1.txt datei1a.txt mv: Verschieben von "datei1.txt" nach "datei1a.txt" nicht möglich: Die Operation ist nicht erlaubt root@stefan:~# chattr -i datei1.txt root@stefan:~# rm datei1.txt
Alle Aktionen wurden hier als Benutzer "root" durchgeführt. Wie Sie sehen, ist danach keine Aktion mit der Datei mehr möglich. Erst wenn das Attribut von der Datei entfernt wird, kann die Datei wieder gelöscht werden.
Weitere Attribute
Neben diesen Attributen gibt es noch weitere Attribute, die zum Teil experimentell oder nicht von so großer Bedeutung für den täglichen Gebrauch sind. Alle Attribute werden ausführlich in der Manpage zu "chattr" beschrieben. Wenn Sie die Attribute verwenden wollen, sollten Sie immer einen Blick auf diese Manpage werfen, um mögliche Komplikationen zu vermeiden, denn nicht alle Attribute funktionieren in allen Dateisystemen.
Ein praktisches Beispiel
Nach dem im ersten Teil die Grundlagen besprochen wurden, will ich Ihnen jetzt anhand eines Beispiels zeigen, wie Sie die Dateisystemrechte planen können. Natürlich ist es in so einem Artikel nicht möglich, alle Eventualitäten abzudecken, aber eine gewisse Planungsgrundlage kann ich Ihnen hier an die Hand geben. In dem Beispiel werde ich eine Verzeichnisstruktur erstellen, die sich auf ein Unternehmen mit mehreren Abteilungen bezieht, in dem jede Abteilung unterschiedliche Zugriffsrechte auf verschiedene Ordner benötigt. Desweiteren soll ein Verzeichnis für alle Mitarbeiter existieren, das als Austauschverzeichnis für Daten dient und in das alle Mitarbeiter schreiben dürfen, aber nur der Besitzer einer Datei soll diese auch löschen können. Um die Verzeichnisse hier abbilden zu können, werde ich das Kommando "tree" verwenden. Sollte das Kommando bei Ihnen nicht installiert sein, müssen Sie das Paket "tree" nachinstallieren.
Im Beispiel wird alles auf einer lokalen Maschine eingerichtet. In der Praxis werden Sie die Daten auf einem Server verwalten und die Benutzerverwaltung zentral durchführen. Da sich die ACLs und die Dateisystemrechte via NFS auf Clients exportieren lassen, können Sie das Beispiel auch auf einem Fileserver mit einer zentralen Benutzerverwaltung und angebundenen Clients einrichten und testen.
Beschreibung der Umgebung
Die Firma besteht aus drei Abteilungen: Der Verwaltung, der Produktion und der Geschäftsleitung. Jede Abteilung soll ein eigenes Verzeichnis erhalten, in der nur diese Abteilung Schreibrechte haben soll. Die Geschäftsleitung möchte auf allen Abteilungsverzeichnissen das Leserecht haben. Alle Dateien in den Abteilungsverzeichnissen sollen immer der Abteilungsgruppe gehören. Die Rechte aller neuen Einträge sollen immer mit der Umask 007 angelegt werden. Es soll ein Gruppe "mitarbeiter" geben, in der alle Mitarbeiter Mitglied sind. Über die Gruppe sollen die Rechte am Austauschverzeichnis gesteuert werden.
Setzen der Umask
Damit alle Mitarbeiter auf allen Clients die gewünschte Umask von 007 erhalten, müssen Sie, je nach Distribution, entweder direkt die Datei "/etc/profile" oder die Datei "/etc/login.defs" anpassen. Diese Anpassung müssen Sie an jedem Client durchführen.
Einrichten der Verzeichnisstruktur
Um die Berechtigungen gut staffeln zu können, wird ein übergeordnetes Verzeichnis für die Abteilungen eingerichtet. An diesem Verzeichnis erhalten alle Mitarbeiter über die Gruppe "mitarbeiter" die Rechte "rx", damit sie durch das Verzeichnis in das eigentliche Abteilungsverzeichnis wechseln können. Das wäre auf einem Server auch das Verzeichnis, das über NFS an alle Clients freigegeben würde. Das folgende Listing zeigt das Anlegen der Verzeichnisstruktur:
root@stefan:~# mkdir /abteilungen root@stefan:~# cd /abteilungen root@stefan:/abteilungen# mkdir verwaltung produktion geschaeftsleitung root@stefan:/abteilungen# mkdir /alle
Nach dem alle benötigten Verzeichnisse angelegt wurden, zeigt das nächste Listing, wie Sie die entsprechenden Rechte setzen müssen:
root@stefan:/# chmod 750 /abteilungen root@stefan:/# chmod 2770 /abteilungen/* root@stefan:/# chgrp mitarbeiter /abteilungen root@stefan:/# chgrp verwaltung /abteilungen/verwaltung root@stefan:/# chgrp produktion /abteilungen/produktion root@stefan:/# chgrp geschaeftsleitung /abteilungen/geschaeftsleitung root@stefan:/# tree -p abteilungen abteilungen --- [drwxrws---] geschaeftsleitung --- [drwxrws---] produktion --- [drwxrws---] verwaltung root@stefan:/# chgrp mitarbeiter /alle root@stefan:/# chmod 3770 /alle root@stefan:/# ls -ld /alle drwxrws--T 2 root mitarbeiter 4096 Aug 10 13:04 /alle
Jetzt kann jede Abteilung in ihrem Verzeichnis Daten speichern. Durch das gesetzte SGID-Bit gehören alle Dateien immer der Abteilungsgruppe. Über "other" werden keine Rechte vergeben. Am Verzeichnis "/alle" haben alle Mitarbeiter die Rechte "rwx". Dadurch können sie Einträge erzeugen und Inhalte ändern. Aber nur die Einträge, die ihnen gehören können sie löschen oder umbenennen. Jetzt fehlt nur noch, dass die Geschäftsleitung an allen anderen Abteilungsverzeichnissen das Leserecht an allen Einträge erhält. Das steuern Sie über die default ACLs an den Verzeichnissen. Das Listing zeigt die entsprechenden
Kommandos:
root@stefan:/# setfacl -d -m g:geschaeftsleitung:rx /abteilungen/verwaltung root@stefan:/# setfacl -d -m g:geschaeftsleitung:rx /abteilungen/produktion
Jetzt können alle Mitglieder der Gruppe "geschaeftsleitung" in allen Verzeichnissen mindestens lesen. Dadurch, dass die ACLs als default ACLs gesetzt wurden, vererben sich die ACLs immer weiter und auch in neu angelegten Unterverzeichnissen hat die Geschäftsleitung die gewünschten Rechte.
Fazit
Ich hoffe, ich konnte Ihnen mit diesem kleinen Artikel zum Thema Dateisystemberechtigungen etwas helfen, in Zukunft einfacher Verzeichnisstrukturen für Mitarbeiter bereitzustellen und diese mit den benötigten Rechten und ACLs zu versehen.
Autor
Publikationen
- Shell-Programmierung: Das umfassende Handbuch
- Linux-Server: Das Administrationshandbuch
- Linux-Server: Das umfassende Handbuch
- Samba 4: Das Handbuch für Administratoren