Linux FAQ
Linux FAQ
Wystarczy użyć skryptu takiego jak poniżej:
#!/bin/sh
find $1 -depth -type d -exec \
sh -c 'cd "{}"; for i in *; do mv "$i" "`echo $i | tr [:upper:] [:lower:]`";\
done' \;
Uruchomiony z parametrem - nazwą katalogu - zmieni nazwy wszystkich plików we wszystkich podkatalogach danego katalogu na pisane małymi literami. Można go (skrypt) zapisać do pliku i nazwać np. "tolower". Aby plik był wykonywalny trzeba nadać mu odpowiednie prawa chmod +x nazwa_pliku
Lub:
Z wielkich liter na małe:
for stary in *.HTM ; do
nowy="$(echo $stary | tr '[:upper:]' '[:lower:]')"
mv "$stary" "$nowy"
done
Z małych na wielkie:
for stary in *.HTM ; do
nowy="$(echo $stary | tr '[:lower:]' '[:upper:]')"
mv "$stary" "$nowy"
done
W niektórych dystrybucjach są do tego gotowe programy: unixtodos (ew. unix2dos) i dostounix (dos2unix). Jednak samodzielne napisanie takich skryptów nie jest trudne: konwersji dos->unix dokonuje się za pomocą jednolinijkowego polecenia:
cat plik_dosowy | tr -d '\r' > plik_unixowy
A to polecenie zmieniające pliki unixa na format dosa (przykład dla basha):
cat plik_unixowy | sed 's/$/'`echo -ne \\\r`'/' > plik_dosowy
Powyższy przykd (unix2dos) pochodzi z pliku "HANDY ONE-LINERS FOR SED", autorstwa (skompilowane przez) Erica Pementa. Plik można znaleźć
Jako shell daj użytkownikowi /usr/bin/passwd i dopisz /usr/bin/passwd do pliku /etc/shells. Dzięki temu będzie on mógł się zalogować aby zmienić hasło.
A jeżeli chcesz go i tej możliwości pozbawić to zamiast passwd daj mu jako shell program false.
Wysyłanie maila z lini poleceń:
echo "jakaś treść" | mail -s "temat wiadomości" adres@gdzies.pl
Wysyłanie maila z załącznikiem z linii poleceń:
uuencode plik.txt plik.txt | mail -s "temat wiadomości" adres@gdzies.pl
useradd -o -u 0 -g 0 nazwa_usera
Chcialbym aby pewna grupa userow miala dostep do pewnej sciezski dostepu do ktorej nie maja inne grupy jak to ustawic w sposob globalny?
W /etc/profile
if [ `id -g` -eq ]; then
PATH='ścieżka dla konkretnej grupy'
else
PATH='ścieżka dla reszty'
fi
export PATH
ls /home
lub
awk 'BEGIN{FS=":"} $3>499{print$1}' /etc/passwd
lub
cat /etc/passwd
Można zabić mu powłokę:
kill -9 pid_np_basha_usera
Do wylogowywania kogoś jest
skill -KILL -v pts/*
gdzie gwiazdka to numer konsoli
Zabijanie wszystkich procesów usera:
skill -9 nazwa_usera
chage -l uzytkownik
Tworzymy usera a następnie:
passwd -d
Chciałbym żeby rekursywnie zrobić:
- pliki na "rw-r--r--"
- katalogi na "rwxr-xr-x"
find www_root_dir -type d -exec chmod 755 {} \; -o -type f -exec chmod 644 {} \;
userdel -r uzytkownik
usermod -l
Zawartość /etc/motd jest wypisywana po zalogowaniu.
Zawartość /etc/issue i /etc/issue.net przed loginem.
W celu zapobieżenia przypadkowego skasowania plików /etc/passwd, /etc/shadow, /etc/group oraz /etc/gshadow należy dla tych plików ustawić tzw. "immutable bit". Robimy to wywołując komendę:
chattr +i plik
Sposób 1
Najprościej (jeśli mamy dostęp do sieci) wydajemy polecenie:
perl -MCPAN -e shell
system zada nam kilka pytan o lokazlizację wielkość katalogu cache itd., nasępnie gdy pojawi się znak zachęty: cpan> instalujemy moduły wydając polecenie:
install Date::Calc
gdzie Date::Calc to nazwa instalowanego modułu.
Sposób 2
1. Ściągamy Perl module z http://www.cpan.org/ lub innej strony.
2. Rozpakowujemy i wydajemy polecenia:
perl Makefile.PL
make
make test
make install
Można wyciąć resztę na firewallu:
iptables -A INPUT -p tcp -s 192.168.0.0/16 --dport 21 -j ACCEPT
iptables -A INPUT -p tcp -s 0/0 --dport 21 -j DROP
Wydajemy polecenie:
sleep 6h 30m; halt -p
gdzie: 6h 30m to 6 godzin 30 minut.
sed -e s/tekst/innyteks/ plik> plik.tmp; mv -f plik.tmp plik
lub np. za pomocą perla:
perl -pi -e "s/tekst/innytekst/" plik
sed -e s/tekst/innyteks/g plik> plik.tmp; mv -f plik.tmp plik
(powtorzenia wyrazu w jednej linijce tez zmieni)
Chcemy zamienić spacje w nazwach plików na podkreślenia, czyli zamienić nazwy: "nazwa pliku przed zmianą.txt" na "nazwa_pliku_po_zmianie.txt".
find ./ -type f -exec rename 's/ /_/g' {} \;
lub:
for i in *\ * ; do mv "$i" "${i//\ /_}" ; done
lub:
find . -name "* *" | while read; do
mv "$REPLY" "${REPLY// /_}"
done
Chcemy zamienić htm na html w nazwach wielu plików, czyli zamienić nazwy: "nazwa_pliku_przed_zmianą.htm" na "nazwa_pliku_po_zmianie.html".
Rozwiązanie 1:
for i in `find katalog_z_plikami_htm -name '*.htm'`; do mv "$i" "${i}l"; done
Uwagi: Zamiast katalog_z_plikami_htm może być też oczywiście np. kropka ".".
Rozwiązanie 2:
for a in *.htm; do mv $a `basename $a .htm`.html; done
Rozwiązanie 3:
mmv \*.htm #1.html
Uwagi: Program mmv ma większe możliwości niż pokazany trywialny przykład.
find . -type f -maxdepth 10 | wc -l
Uwagi: parametr f pozwala na nie branie pod uwagę dowiązań symbolicznych i katalogów; maxdepth określa jaka głębokość poziomu katalogów jest uwzględniana, wartość maxdepth 0 oznacza by testy i akcje stosować tylko do argumentów wiersza poleceń.
wc -l plik
Chcemy policzyć ile podkatalogów mamy w danym katalogu lub rekurencyjnie ile mamy katalogów w wielu podkatalogach danego katalogu.
Rozwiązanie 1:
ls -l| grep ^d| wc -l
Uwagi: Nie są uwzględniane w liczeniu dowiązania i katalogi ukryte; dodaj opcje -a po ls, żeby policzyć również katalogi ukryte w danym katalogu (niestety wraz z katalogami "." oraz ".."; jeśli nie chcesz ich liczyć patrz rozwiązanie 2 lub 3) oraz -R, jeśli chcesz liczyć rekurencyjnie.
Rozwiązanie 2:
ls -lAR| grep ^d| wc -l
Uwagi: Skrypt działa tak samo jak w "rozwiązaniu 1" dla opcji -laR do ls, ale nie liczy katalogów "." oraz "..".
Rozwiązanie 3:
ls -laR | grep ^d | awk '{print $9}' | egrep -v '^\.{1,2}$' | wc -l
Uwagi: Skrypt działa tak samo jak w "rozwiązaniu 1" dla opcji -laR do ls, ale nie liczy katalogów "." oraz "..".
Rozwiązanie 4:
find . -type d | wc -l
Uwagi: bez parametru -maxdepth liczy bez ograniczeń wgłąb struktury katalogów rekurencyjnie, ponadto uwzględnia zawsze katalogi ukryte oraz katalog ".".
Rozwiązanie 5:
find . -type d | egrep -v '^\.{1,2}$' | wc -l
Uwagi: Skrypt działa tak samo jak w "rozwiązaniu 4", ale nie liczy katalogu ".". Ponadto jeśli zamiast katalogu startowego (powyżej : . ) poda się pełną ścieżkę (np. /etc) skrypt zawsze da wynik o 1 większy, ponieważ liczy wtedy także katalog z którego zaczyna (gdy jest '.', to jest to wychwytywane przez egrep).
W jaki sposób z pliku html wydobyć automatycznie adresy e-mail będące w tym pliku i umieścić je w jednej kolumnie w pliku tekstowym?
grep 'mailto:' plik |sed -e 's/^.*mailto://' |sed -e 's/">.*$//' > plik.txt
Uwagi: Zamiast plik podstawiamy nazwę przeszukiwanego pliku, można też oczywiście *
Narzędzia i sposoby do pakowania i rozpakowywania archiwów:
Rozpakowanie plików *.tar.gz:
tar -xvzf nazwa_pliku.tar.gz
- x - extract,
- v - verbose (wypisywanie nazw wszystkich plików),
- z - archiwum skompresowane programem gzip,
- f - plik.
Rozpakowywanie plików typu *.bz2:
tar -xvjf nazwa_pliku*tar.bz2
tar -xvf nazwa_pliku*tar.bz2
- j - oznacza archiwum bz2.
Rozpakowywanie plików *.zip
unzip nazwa_pliku.zip
Rozpakowywanie plików typu *.tar:
tar xvf plik.tar
Pakowanie ogólnie wygląda tak:
tar -czf backup.tar.gz /katalog/do/spakowania,
tar -cjf backup.tar.bz2 /katalog/do/spakowania.
zip -r backup.zip /katalog/do/spakowania.
Sprawdzanie sumy kontrolnej MD5SUM:
md5sum plik.iso
Montowanie:
mount -o loop -t iso9660 plik.iso /mnt/iso
Skanujemy sami siebie:
nmap -sT -sU localhost
lsof:
lsof -i -P
netstat:
netstat -tpn