|
|
Ten dokument jest dost�pny w nast�puj�cych j�zykach: English Castellano Deutsch Francais Italiano Nederlands Russian Turkce Polish |
Erdal Mutlu <erdal(at)linuxfocus.org> O Autorze: Erdal jest jednym z tureckich redaktor�w LF. Obecnie pracuje jako administrator
systemu w Linotype Library. Od czas�w
akademickich jest wielkim fanem Linuksa i aktywnie rozwija ten system. Translated to Polish by: Rados�aw Weso�owski <wesolek(at)box43.gnet.pl> Zawarto��: |
Notka:
Cz�sto zdarza si� tak, �e administrujesz du�� liczb� system�w z rodziny
Linux/Unix, zazwyczaj s� one podobnie skonfigurowane. Na pewno zauwa�y�e�,
�e podczas codziennej pracy wykonujesz sporo podobnych czynno�ci na ka�dym
z tych system�w. Z ca�� pewno�ci� przyda Ci si� kilka przedstawionych poni�ej
skrypt�w automatyzuj�cych twoj� prac�. W moich przyk�adach wykorzystam
narz�dzia, kt�re wchodz� w sk�ad pakietu ssh.
scp /path/to/the/file/file1 user@remote_host:/remotedir/newfile
W tym przyk�adzie plik o nazwie file1 zostanie skopiowany z lokalnego komputera na komputer o adresie 'remote_host' ( zamiast nazwy mo�esz u�y� adresu IP ) do katalogu '/remoredir'. Plik b�dzie dost�pny pod nazw� 'newfile'. Zostaniesz poproszony o podanie has�a dla u�ytkownika 'user'. Je�eli autentykacja powiedzie si� i zgadzaj� si� prawa dost�pu, plik zostanie skopiowany. Mo�na pomin�� nazw� pliku na docelowej maszynie i wtedy nie zostanie ona zmieniona, mechanizm ten daje ci to mo�liwo�� zmiany nazwy pliku podczas kopiowania. Proces mo�e odbywa� si� tak�e w drug� stron�:scp user@remote_host:/remotedir/file /path/to/local/folder/newfile
Kolejn� cech� programu scp jest mo�liwo�� kopiowania ca�ych katalog�w. Parametr '-r' okre�laj�cy rekursywne kopiowanie s�u�y w�a�nie do tego celu.scp -r user@remote_host:/remotedir .
Wydanie powy�szego polecenia spowoduje skopiowanie zawarto�ci katalogu 'remotedir' z hosta 'remote_host' do twojego katalogu domowego,� nazwy pozostan� niezmienione.ssh [email protected] df -H
Sk�adnia polecenia jest podobna do logowania, z tym, �e po nazwie hosta wyst�puje polecenie, kt�re ma zosta� wykonane ( w naszym przypadku 'df -H' ). Dane wyj�ciowe pojawi� si� na twoim terminalu.ssh-keygen -b 1024 -t dsa
Na pocz�tku zostaniesz zapytany o nazw� klucza prywatnego, natomiast nazwa klucza publicznego zwykle jest taka sama jak prywatnego, ale z ko�c�wk� '.pub'. Parametr '-b 1024' okre�la liczb� bit�w u�ytych do wygenerowania klucza. Je�eli zostawisz to miejsce puste, program u�yje standartowej warto�ci. Typ klucza zosta� okre�lony przy pomocy parametru '-t dsa', jednak istniej� inne warto�ci, kt�re mog� zosta� u�yte np. 'rsa1' dla protoko�u w wersji pierwszej, lub 'rsa' i 'dsa' dla protoko�u w wersji drugiej. Zalecam stosowanie drugiej wersji protoko�u SSH, jednak, je�li trafisz na stary serwer wspieraj�cy jedynie pierwsz� wersj� musisz stworzy� klucze u�ywaj�c '-t rsa1'. W sytuacji, kiedy� zaistnieje taka konieczno�ci mo�esz wymusi� u�ywanie wersji 1 lub 2 protoko�u odpowiednio przez parametr '-1', lub '-2'.W tym miejscu mo�emy ju� zestawi� bezpieczne po��czenie pomi�dzy komputerami,
kopiowa� pliki i wykonywa� polecenia, ale, �eby wykonywa� niekt�re prace
automatycznie nale�y wyeliminowa� wpisywanie has�a, lub has�a-frazy. Rozwi�zaniem
mo�e by� pisanie w ka�dym skrypcie wymaganego has�a, co zreszt� nie jest dobrym
pomys�em. Lepszym rozwi�zaniem, jest u�ycie agenta kluczy, kt�ry zajmie si�
tym zadaniem. 'ssh-agent' jest programem, przechowuj�cym prywatne klucze u�ywane
do weryfikacji. Aby rozpocz�� korzystanie z niego wykonaj polecenie:
ssh-agent $BASH
a nast�pnie dodaj sw�j prywatny klucz�ssh-add .ssh/id_dsa
lubssh-add .ssh/identity
'id_dsa' odnosi si� do klucza prywatnego typu DSA, natomiast 'identity' ma zastosowanie w przypadku, gdy klucz jest typu RSA1. S� to standardowe nazwy plik�w utworzone podczas generowania przy u�yciu 'ssh-keygen'. Oczywi�cie przed dodaniem twojego klucza zostaniesz poproszony o has�o-fraz�. Mo�esz tak�e zobaczy� wcze�niej dodane klucze:ssh-add -l
W tym momencie, kiedy spr�bujesz po��czy� si� z serwerem, kt�ry ma tw�j
klucz publiczny, po��czenie zostanie zestawione bez twojego udzia�u - 'ssh-agent'
zajmie si� procesem autoryzacji.
Kiedy u�ywasz programu 'ssh-agent', tak jak jest to opisane powy�ej, mo�esz
z niego korzysta� jedynie na termintalu, z kt�rego wystartowa�e� ssh-agenta.
Aby temu zaradzi� czeka Ci� jeszcze troch� pracy, �eby u�atwi� Ci to zadanie
stworzy�em prosty skrypt startuj�cy agenta:
#!/bin/sh
#
# Erdal mutlu
#
# Starting an ssh-agent for batch jobs usage.
agent_info_file=~/.ssh/agent_info
if [ -f $agent_info_file ]; then
echo "Agent info file : $agent_info_file exists."
echo "make sure that no ssh-agent is running and then delete this file."
exit 1
fi
ssh-agent | head -2 > $agent_info_file
chmod 600 $agent_info_file
exit 0
source ~/.ssh/agent_info or . ~/.ssh/agent_info
W celu usprawnienia mo�esz dopisa� kilka poni�szych linijek do swojego pliku .bashrc:
if [ -f .ssh/agent_info ]; then
. .ssh/agent_info
fi
Ostrze�enie: Warto dobrze zabezpieczy� tw�j komputer, gdy� w przeciwnym wypadku w�amywacz uzyskuj�c dost�p do twojego konta bez problemu b�dzie m�g� logowa� si� na inne serwery. Wszystko ma swoj� cen�!�
Nadszed� wreszcie czas na wyja�nienia, jak zautomatyzowa� niekt�re prace administracyjne. Idea jest prosta - wykonanie okre�lonych polece� na podanej li�cie host�w, a nast�pnie skopiowanie kilku plik�w, czyli rutynowe czynno�ci. Oto skrypt:
#!/bin/sh
# Installing anything using Secure SHELL and SSH agent
# Erdal MUTLU
# 11.03.2001
##################################################################
# Functions #
##################################################################
### Copy files between hosts
copy_files()
{
if [ $files_file != "files_empty.txt" ];then
cat $files_file | grep -v "#" | while read -r line
do
direction=`echo ${line} | cut -d " " -f 1`
file1=`echo ${line} | cut -d " " -f 2`
file2=`echo ${line} | cut -d " " -f 3`
case ${direction} in
"l2r") : ### From localhost to remote host
echo "$file1 --> ${host}:${file2}"
scp $file1 root@${host}:${file2}
;;
"r2l") : ### From remote host to localhost
echo "${host}:${file2} --> localhost:${file2}"
scp root@${host}:${file1} ${file2}
;;
*)
echo "Unknown direction of copy : ${direction}"
echo "Must be either local or remote."
;;
esac
done
fi
}
### Execute commands on remote hosts
execute_commands()
{
if [ $commands_file != "commands_empty.txt" ];then
cat $commands_file | grep -v "#" | while read -r line
do
command_str="${line}"
echo "Executing $command_str ..."
ssh -x -a root@${host} ${command_str} &
wait $!
echo "Execute $command_str OK."
done
fi
}
### Wrapper function to execute_commands and copy_files functions
doit()
{
cat $host_file | grep -v "#" | while read -r host
do
echo "host=$host processing..."
case "${mode}" in
"1")
copy_files
execute_commands
;;
"2")
execute_commands
copy_files
;;
*)
echo "$0 : Unknown mode : ${mode}"
;;
esac
echo "host=$host ok."
echo "------------------------------------------------------------------"
done
}
##################################################################
### Program starts here
##################################################################
if [ $# -ne 4 ]; then
echo "Usage : $0 mode host_file files_file commands_file"
echo ""
echo "mode is 1 or 2 "
echo " 1 : first copy files and then execute commands."
echo " 2 : first execute commands and then copy files."
echo "If the name of files.txt is files_empty.txt then it is not processed."
echo "If the name of commands.txt is commands_empty.txt then it is
echo "not processed."
exit
fi
mode=$1
host_file=$2
files_file=$3
commands_file=$4
agent_info_file=~/.ssh/agent_info
if [ -f $agent_info_file ]; then
. $agent_info_file
fi
if [ ! -f $host_file ]; then
echo "Hosts file : $host_file does not exist!"
exit 1
fi
if [ $files_file != "files_empty.txt" -a ! -f $files_file ]; then
echo "Files file : $files_file does not exist!"
exit 1
fi
if [ $commands_file != "commands_empty.txt" -a ! -f $commands_file ]; then
echo "Commands file : $commands_file does not exist!"
exit 1
fi
#### Do everything there
doit
Zapiszmy plik jako ainstal.sh (automatyczna instalacja). Uruchamiaj�c program bez �adnych parametr�w otrzymamy wiadomo��:
./ainstall.sh
Usage : ./ainstall.sh mode host_file files_file commands_file |
Zgodnie z wiadomo�ci�, je�eli nie chcesz wykona� �adnej komendy, wtedy
jako argumentu dla 'commands_file' u�yj 'commands_empty.txt', natomiast,
je�eli nie masz zamiaru kopiowa� plik�w u�yj warto�ci 'files_empty.txt' dla
opcji 'files_file'. Nie zawsze przecie� jednocze�nie kopiujesz lub wykonujesz
jakie� polecenia.
Zanim zaczn� wyja�nia� skrypt linijka po linijce, zaprezentuj� przyk�ad u�ycia: przypu��my, �e uruchomi�e� zapasowy serwer DNS i chcesz go doda� do pliku '/etc/resolv.conf'. Dla u�atwienia przypu��my r�wnie�, �e wszystkie maszyny maj� taki sam plik 'resolv.conf', jedyn� rzecz� do zrobienia, jest skopiowanie nowego pliku na wszystkie inne komputery.
Na pocz�tek potrzebna Ci b�dzie lista wszystkich host�w, zapiszemy je w pliku 'hosts.txt'. Format pliku jest nast�puj�cy - ka�da linijka zawiera tylko jeden wpis (nazw� lub adres IP). Pryzk�ad:
########################################################################## |
Jak wida� mo�na poda� pe�n� nazw�, lub tylko jej cz�� odpowiadaj�ca nazwie hosta. Nast�pnie konieczne jest stworzenie pliku, w kt�rym znajd� si� nazwy plik�w przeznaczone do kopiowania. Istniej� dwie mo�liwo�ci kopiowania:
Stworzymy list� plik�w przeznaczonych do kopiowania i zapiszmy j� jako np. 'files_file.txt'. Ka�da linia w tym pliku zawiera informacje, kt�re zostan� u�yte do kopiowania pliku. Istniej� dwa kierunki kopiowania: l2r (local to remote) i r2l (remote to local). l2r zostanie zastosowany, kiedy plik ma zosta� umieszczony na zdalnej maszynie, natomiast r2l w przeciwnym przypadku. Kiedy ju� okre�limy kierunek nale�y poda� dwie nazwy plik�w, oddzielone spacj� lub znakiem tabulacji. Pierwszy plik jest kopiowany do lokalizacji znajduj�cej si� pod drug� nazw�, z uwzgl�dnieniem kierunku. Nazw� pliku dla zdalnego systemu nale�y poda� w formie bezwzgl�dnej, w przeciwnym wypadku plik trafi do katalogu domowego roota. Oto przyk�ad:
############################################################################ |
Tak jak widzisz do��czy�em do pliku wyja�nienie struktury. Jest to prosty, lecz skuteczny spos�b na wyja�niaj�cy zawarto��. W naszym przyk�adzie mamy zamiar skopiowa� plik resolv.conf na zdaln� maszyn� pod nazw� '/etc/resolv.conf'. Dla demonstracji zasady dzia�ania skryptu po skopiowaniu zostan� zmienione prawa dost�pu do pliku, a nast�pnie zostanie wy�wietlona jego zawarto��. Polecenia do wykonania umieszczone s� w oddzielnym pliku, nazwijmy go 'commands_file.txt'. Zawarto��:
########################################################################### |
Komendy zawarte w pliku 'command_file.txt' zostan� wykonane na ka�dym
ho�cie, kt�rego adres znajduje si� w pliku 'hosts.txt'. Wykonywane s� jedna
po drugiej w kolejno�ci wyst�pienia w spisie.
Dobrze, a wi�c mamy wszystkie potrzebne pliki. Pozosta�o nam tylko jeszcze
okre�li� tryb, w jakim uruchomimy skrypt, to znaczy, kt�ry z dw�ch plik�w
'commands_file.txt' czy 'files_file.txt' zostanie wykonany pierwszy. Je�eli
najpierw chcesz skopiowa� pliki, a nast�pnie wykona� polecenia wybierz tryb
1, w przeciwnym wypadku skorzystaj z drugiego. Mo�emy teraz wykona� nasz
skrypt podaj�c odpowiednie opcje:
./ainstall.sh 1 hosts.txt files_file.txt commands_file.txt
Wskaz�wka: Aby u�atwi� sobie prac� warto zmieni� nazw� pliku na tak�, kt�ra
jednoznacznie okre�li zawarto��, w naszym przypadku dobrym pomys�em mo�e
by� 'files_resolvconf.txt', tak� sam� metod� stosuj� do plik�w hosts.txt,
oraz commands.txt.
Nadszed� wreszcie czas, na wyja�nienie skryptu. Program rozpoczyna dzia�anie, od sprawdzenia liczby argument�w, je�eli liczba ta jest r�na od czterech zostanie wy�wietlona pomoc, kiedy wszystko jest w porz�dku poszczeg�lne argumenty przypisywane s� odpowiednim zmiennym. Po sprawdzeniu istnienie pliku '~/.ssh/agent_info' jest on odczytywany. Plik ten zawiera informacj� na temat dzia�ania programu 'ssh-agent'. Je�eli nie korzystasz z agenta, b�dziesz zmuszony wprowadzi� wszystkie has�a r�cznie, co oznacz, �e nie uzyskasz automatyzacji :). Nast�pnie skrypt sprawdza istnienie plik�w zawieraj�cych: adresy host�w, komendy i pliki. Istnieje r�wnie� specjalny test, sprawdzaj�cy wyst�pienie jednej z nazw: 'files_empty.txt' lub 'commands_empty.txt'. Kiedy jako argument podasz jedn� z tych nazw nie ma potrzeby sprawdzania istnienia takiego pliku. Dokona�em drobnej zmiany w kodzie skryptu podczas pisania tego artyku�u, przedtem wygl�da�o to tak:
if [ -f $host_file -a -f $files_file -a -f $commands_file ]; then
echo "$host_file $files_file $commands_file"
doit
else
echo "$host_file or $files_file or $commands_file does not exist"
exit
fi
U�ywaj�c powy�szej wersji konieczne by�o stworzenie plik�w o nazwach: 'files_empty.txt' oraz 'commands_empty.txt', chocia� nie stanowi�o to problemu, poniewa� pracowa�em ca�y czas w tym samym katalogu, postanowi�em to zmieni�. Na ko�cu wywo�uj� funkcj� 'doit', kt�ra rozpoczyna w�a�ciwe dzia�anie skryptu. Funkcja ta przy pomocy p�tli dla ka�dego hosta znajduj�cego si� w '$hosts_file' wywo�uje funkcje 'copy_files' oraz 'execute_commands' w kolejno�ci zale�nej od trybu. Zmienna '$host' zawiera aktualny adres IP lub nazw� komputera. Przyjrzyjmy si� teraz bli�ej funkcji 'copy_files'. W pierwszej kolejno�ci sprawdzana jest warto�� zmiennej 'files_file'. Je�eli zawiera ona 'files_empty.txt', �adna akcja nie zostanie podj�ta, w przeciwnym wypadku ka�da linia zmiennej '$files_file', jest sprawdzana, pobierane s� nast�puj�ce dane 'direction', 'file1' i 'file2' zawieraj�ce kierunek kopiowania, pierwsz� i drug� nazw� pliku. Zgodnie z przyj�tym kierunkiem dane s� kopiowane przy u�yciu programu 'scp'. Sprawd�my jeszcze, co dzieje si� w funkcji 'execute_commands'. Tak samo, jak w poprzedniej funkcji sprawdzane jest istnienie odpowiedniego pliku. Je�eli zmienna ma warto�� 'commands_empty.txt' �adne polecenie nie zostanie wykonane. Kiedy plik istnieje i nie jest pusty wszystkie zawarte w nim polecenia zostan� wykonane jako zadania dzia�aj�ce w tle. Nast�pnie wywo�ana jest komenda 'wait' z parametrem '$!', kt�ra daje nam pewno��, �e kolejne polecenie zostanie wykonane dopiero wtedy, gdy zako�czy si� poprzednie. '$!' reprezentuje ID ostatniego procesu uruchomionego w tle. Proste prawda?������
Przedstawi� teraz troch� bardziej zaawansowany przyk�ad u�ycia skryptu.
Zostanie on wykorzystany do stworzenia kopii zapasowej plik�w konfiguracyjnych
poszczeg�lnych serwer�w. Do tego celu napisa�em ma�y skrypt wykorzystuj�cy
ainstall.sh:
#!/bin/sh
server_dir=${HOME}/erdal/sh/ServerBackups
if [ ! -d $server_dir ]; then
echo "Directory : $server_dir does not exists."
exit 1
fi
cd $server_dir
servers=ll_servers.txt
prog=${HOME}/erdal/sh/einstall_sa.sh
cat $servers | grep -v "#" | while read -r host
do
echo $host > host.txt
$prog 1 host.txt files_empty.txt
servers/${host}/commands_make_backup.txt
$prog 1 host.txt files_getbackup.txt commands_empty.txt
mv -f backup.tgz servers/${host}/backup/`date +%Y%m%d`.tgz
rm -f host.txt
done
exit 0
Nale�y za�o�y� specjalny katalog nazwany 'servers', a w tym katalogu musz� znale�� si� dwa pliki: 'files_getbackup.txt' i 'll_servers.txt'. Oto zawarto�� pliku 'files_getbackup.txt':
r2l /root/backup.tgz backup.tgz
'll_servers.txt' zawiera adresy host�w, kt�re maj� by� poddane archiwizacji. Ka�dy host musi posiada� katalog o takiej samej nazwie, a w tym katalogu musi znajdowa� si� plik 'commands_make_backups.txt' zawieraj�cy polecenie tworz�ce archiwum /root/backup.tgz. Oraz katalog nazwany 'backup'. Wszystkie kopie zapasowe b�d� przechowywane w tym katalogu. Je�eli zawarto�� pliku 'll_servers.txt' jest nast�puj�ca:
fileserver |
wtedy struktura twojego katalogu '$servers' wygl�da jak poni�ej:
servers |
A oto zawarto�ci przyk�adowych plik�w 'commands_make_backups.txt' :
tar cfz /root/backup.tgz /etc/samba /etc/atalk /etc/named.conf /var/named/zones
Powy�sza polecenie tworzy kopi� plik�w /etc/samba, /etc/atalk, /etc/named.conf
i� /var/named/zones.
tar cfz /root/backup.tgz /etc/httpd /usr/local/apache
Kopia zapasowa plik�w serwera apache.
tar cfz /root/backup.tgz /etc/squid /etc/named.conf
Przy pomocy tego polecenia zarchiwizujesz konfiguracj� proxy serwera squid,
oraz konfiguracj� serwera dns.
Stosuj�c odpowiednie wpisy proces archiwizacji mo�esz odpowiednio dostosowa� do w�asnych potrzeb.
|
Strona prowadzona przez redakcj� LinuxFocus
© Erdal Mutlu, FDL LinuxFocus.org |
t�umaczenie:
|
2003-01-17, generated by lfparser version 2.33