Tag Archives: shell

Copying a binary and it’s shared libraries to a chrooted directory

Today, I needed to construct a command for copying the rsync binary and it’s library dependencies to a chrooted directory. Since this might come in handy in the future, and might help other people to achieve the same as well, I decided to post it on here.

cp /usr/bin/rsync /var/www/vhosts/example.com/bin/;\
ldd /usr/bin/rsync|awk '{print $3}'|grep -e '^/'|xargs -I{} cp -v --parent '{}' /var/www/vhosts/example.com/

A quick breakdown. At first, we just do a plain copy of the rsync binary. After that, we fire up ldd on the rsync binary, then use awk to only return the third word of each output line of ldd (which should be the location to the binary). To make sure it’s a full path, a grep -e on that result should make sure the output starts with a slash (if ldd returns only a name rather than a full path, the binary will probably not work in the chrooted environment, so this method is not 100% fool-proof). Finally, we copy the matches into our chrooted environment using the –parent option (and -v for verbosity so you can see what is actually copied), so that the paths are entirely copied, e.g.: /lib64/somelib.so.1 would become /var/www/vhosts/example.com/lib64/somelib.so.1. Rather than putting it hardcoded into /lib or /usr/lib, the –parent option adopts the relative path the library should have within the chrooted environment.

In my case, this command worked perfectly for getting rsync to run. But again, it might not be 100% fool-proof for everything. Any additions/suggestions to make it so are welcome.

Simpel mysqldump script

Voor één van mijn servers wilde ik een script dat elke nacht een dump van alle databases die op de machine draaien apart zet. Een simpele mysqldump van alle databases dus. Om dat snel en makkelijk voor alle databases voor elkaar te krijgen heb ik onderstaande batch script gemaakt. Optioneel kan de flag –cron worden meegegeven om de output van het script te minimaliseren tot alleen mislukte backups (als je bijv. de output van cronjobs naar jezelf laat mailen, maar alleen mails wilt ontvangen op het moment dat er iets mislukt). Zonder deze flag wordt de status van alle backups getoond.

De source:

#!/bin/bash
if [[ $1 == "--cron" ]]; then
    # Cron mode, minimize output to only show failures
    mysql -u user -p pass -B -e "SHOW DATABASES"|sed 1d|while read db
    do
        mysqldump -u user -p pass $db|gzip>"/home/db_backup/$db.sql.gz"
        if [[ $? != 0 ]];then echo "Backup of database $db FAILED!";fi
    done
else
    # Default mode, be verbose
    mysql -u user -p pass -B -e "SHOW DATABASES"|sed 1d|while read db
    do
        echo -n "Backing up database $db: "
        mysqldump -u user -p pass $db|gzip>"/home/db_backup/$db.sql.gz"
        if [[ $? == 0 ]];then echo "OK.";else echo "FAILED!";fi
    done
fi

Op zich redelijk straight-forward. De mysql client wordt aangeroepen met de user/pass combinatie en het commando show databases wordt uitgevoerd om een lijst van huidige databases te krijgen. Vervolgens wordt ‘sed 1d’ gebruikt om de eerste regel van de output, namelijk “Databases” te verwijderen. In deze header zijn we toch niet geïnteresseerd.

Vervolgens gaan we met een while loop deze lijst van databases doorsturen naar de mysqldump utility. De output wordt geredirect naar gzip, omdat op SQL dumps een redelijk hoge compressie kan worden behaald en dus ruimte kan worden bespaard. Dat geheel schrijven we weg naar een bestand in /home/db_backup.

Ten slotte wordt de exit code van het mysqldump commando nog uitgelezen (deze staat opgeslagen in $?). Als het 0 is zijn we tevreden en is de dump succesvol. Als het iets anders dan 0 is, dan is er schijnbaar ergens iets mis gegaan en wordt er “FAILED” aangegeven.

wget batch script

Vandaag liep ik tegen een “probleem” aan dat ik een serie van 125 afbeeldingen, die allemaal opvolgende bestandsnamen hadden wilde downloaden vanaf een website. Omdat ik liever lui dan moe ben heb ik hiervoor een “quick and dirty” bash scriptje geschreven, wat in principe kan worden ingezet voor elke soortgelijke situatie.

#!/bin/bash
for (( x=1; x<=125; x++ )) do
        if [ $x -lt 10 ]; then
                PFX="000"
        elif [ $x -lt 100 ]; then
                PFX="00"
        elif [ $x -lt 1000 ]; then
                PFX="0"
        else
                PFX=""
        fi
        wget "http://somesite.com/galleries/SomeGallery/gallery_image_$PFX$x.jpg"
done

We beginnen met een for-loop met variabele $x die van 1-125 gaat. Vervolgens kijken we of de waarde van $x kleiner dan 10, 100 of 1000 is, vervolgens geven we PFX al dan geen waarde. PFX staat voor prefix en is bedoeld om “extra” nullen te genereren om zo strings als 0001 en 0027 terug te krijgen, in plaats van 1 of 27, wat 404 errors zou opleveren. Vervolgens sturen we wget de URL met de juiste PFX en $x waardes, om zo binnen een paar seconden de hele boel binnen te halen wat anders een hoop handwerk zou zijn.

Attachments versturen met uuencode

Soms wil het wel eens gebeuren dat je vanaf je Linux shell een bestand naar jezelf wilt mailen (bij gebrek aan SCP of FTP mogelijkheden of simpelweg omdat dat te omslachtig is in sommige situaties). Gelukkig is daar een mogelijkheid voor middels de tool uuencode. Op machines met yum kun je deze tool verkrijgen door de sharutils package te installeren.

yum install sharutils

Nadat deze package is geïnstalleerd heb je de beschikking over de uuencode tool. Het versturen van een attachment is daarna vrij eenvoudig. Stel dat we een bestand willen mailen genaamd core.5741, dan zouden we dat met het volgende commando kunnen doen.

uuencode core.5741 core.5741|sendmail devnull@example.com

We sturen de output van de uuencode direct door naar sendmail, deze verstuurt het dan direct naar het opgegeven e-mail adres.