<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ro">
	<id>https://wiki.linuxadvanced.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin</id>
	<title>Wiki Linux Advanced - Contribuțiile utilizatorului [ro]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.linuxadvanced.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin"/>
	<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php/Special:Contribu%C8%9Bii/Admin"/>
	<updated>2026-05-06T07:59:40Z</updated>
	<subtitle>Contribuțiile utilizatorului</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=563</id>
		<title>Instructor</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=563"/>
		<updated>2025-12-09T13:09:26Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Experiență în Predare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Profil Profesional: Daniel Cătălin Cristea ==&lt;br /&gt;
&lt;br /&gt;
*Cu o diplomă de &amp;lt;i&amp;gt;formator autorizat&amp;lt;/i&amp;gt; și o experiență vastă în domeniul tehnologiei informației, &amp;lt;b&amp;gt;Daniel Cătălin Cristea&amp;lt;/b&amp;gt; și-a început cariera în IT în 1997 ca inginer automatist. Drumul său profesional l-a purtat treptat spre software și sisteme de operare, lucrând ca:&lt;br /&gt;
&lt;br /&gt;
* Inginer de sistem informatic&lt;br /&gt;
* Inginer de testare manuală/automată&lt;br /&gt;
* Devops AWS, OCI, VPS&lt;br /&gt;
* Inginer de suport tehnic &lt;br /&gt;
&lt;br /&gt;
Începând din 2020, &amp;lt;i&amp;gt;Daniel&amp;lt;/i&amp;gt; a colaborat cu companii precum &amp;lt;b&amp;gt;Vodafone&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;Oracle&amp;lt;/b&amp;gt; ca inginer de testare pentru distribuția &amp;lt;i&amp;gt;Oracle Linux&amp;lt;/i&amp;gt; și a contribuit la proiecte de tehnologie auto în &amp;lt;i&amp;gt;AWS Cloud&amp;lt;/i&amp;gt; ca inginer DevOps sub umbrela &amp;lt;b&amp;gt;Ericsson&amp;lt;/b&amp;gt;. Totodată, a desfășurat activități DevOps pentru o companie israeliană, gestionând infrastructuri IT complexe în cloud-ul Amazon.&lt;br /&gt;
&lt;br /&gt;
== Excelență în Formare Linux cu Daniel ==&lt;br /&gt;
&lt;br /&gt;
Descoperiți expertiza care transformă!&lt;br /&gt;
&lt;br /&gt;
Daniel este un instructor cu o contribuție remarcabilă în lumea IT, formând profesioniști capabili și competitivi:&lt;br /&gt;
&lt;br /&gt;
Peste 100 de Cursanți Formați: În cadrul Academiei Credis, parte a prestigiosului grup Bitnet, Daniel a instruit cu succes peste 100 de cursanți. De la noțiuni de bază la cele mai complexe concepte de nivel avansat, cursanții stăpânesc sistemul de operare Linux.&lt;br /&gt;
&lt;br /&gt;
Parteneriate Strategice: În colaborare cu franciza internațională Nobleprog, Daniel a susținut o serie importantă de cursuri specializate, preponderent dedicate mediului corporate.&lt;br /&gt;
&lt;br /&gt;
Mentorizare Personalizată: Oferă, de asemenea, cursuri exclusive, în regim particular 1 la 1, pentru o experiență de învățare adaptată și de maximă eficiență.&lt;br /&gt;
&lt;br /&gt;
Daniel transformă cunoștințele tehnice în avantaje profesionale!&lt;br /&gt;
&lt;br /&gt;
== Poziția Actuală ==&lt;br /&gt;
&lt;br /&gt;
În prezent, administrează compania &amp;lt;b&amp;gt;WINSYS COMPUTERS SRL&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pentru detalii suplimentare, telefon de contact: &amp;lt;b&amp;gt;0728906946&amp;lt;/b&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=562</id>
		<title>Instructor</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=562"/>
		<updated>2025-12-09T13:02:59Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Poziția Actuală */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Profil Profesional: Daniel Cătălin Cristea ==&lt;br /&gt;
&lt;br /&gt;
*Cu o diplomă de &amp;lt;i&amp;gt;formator autorizat&amp;lt;/i&amp;gt; și o experiență vastă în domeniul tehnologiei informației, &amp;lt;b&amp;gt;Daniel Cătălin Cristea&amp;lt;/b&amp;gt; și-a început cariera în IT în 1997 ca inginer automatist. Drumul său profesional l-a purtat treptat spre software și sisteme de operare, lucrând ca:&lt;br /&gt;
&lt;br /&gt;
* Inginer de sistem informatic&lt;br /&gt;
* Inginer de testare manuală/automată&lt;br /&gt;
* Devops AWS, OCI, VPS&lt;br /&gt;
* Inginer de suport tehnic &lt;br /&gt;
&lt;br /&gt;
Începând din 2020, &amp;lt;i&amp;gt;Daniel&amp;lt;/i&amp;gt; a colaborat cu companii precum &amp;lt;b&amp;gt;Vodafone&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;Oracle&amp;lt;/b&amp;gt; ca inginer de testare pentru distribuția &amp;lt;i&amp;gt;Oracle Linux&amp;lt;/i&amp;gt; și a contribuit la proiecte de tehnologie auto în &amp;lt;i&amp;gt;AWS Cloud&amp;lt;/i&amp;gt; ca inginer DevOps sub umbrela &amp;lt;b&amp;gt;Ericsson&amp;lt;/b&amp;gt;. Totodată, a desfășurat activități DevOps pentru o companie israeliană, gestionând infrastructuri IT complexe în cloud-ul Amazon.&lt;br /&gt;
&lt;br /&gt;
== Experiență în Predare ==&lt;br /&gt;
În cadrul Academiei Credis, parte a grupului &amp;lt;b&amp;gt;Bitnet&amp;lt;/b&amp;gt;, &amp;lt;i&amp;gt;Daniel&amp;lt;/i&amp;gt; a avut o contribuție remarcabilă ca instructor, formând peste 100 de cursanți în Linux, atât la nivel de bază, cât și avansat.&lt;br /&gt;
&lt;br /&gt;
== Poziția Actuală ==&lt;br /&gt;
&lt;br /&gt;
În prezent, administrează compania &amp;lt;b&amp;gt;WINSYS COMPUTERS SRL&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pentru detalii suplimentare, telefon de contact: &amp;lt;b&amp;gt;0728906946&amp;lt;/b&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=561</id>
		<title>Instructor</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=561"/>
		<updated>2025-12-09T13:02:42Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Poziția Actuală și Colaborări */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Profil Profesional: Daniel Cătălin Cristea ==&lt;br /&gt;
&lt;br /&gt;
*Cu o diplomă de &amp;lt;i&amp;gt;formator autorizat&amp;lt;/i&amp;gt; și o experiență vastă în domeniul tehnologiei informației, &amp;lt;b&amp;gt;Daniel Cătălin Cristea&amp;lt;/b&amp;gt; și-a început cariera în IT în 1997 ca inginer automatist. Drumul său profesional l-a purtat treptat spre software și sisteme de operare, lucrând ca:&lt;br /&gt;
&lt;br /&gt;
* Inginer de sistem informatic&lt;br /&gt;
* Inginer de testare manuală/automată&lt;br /&gt;
* Devops AWS, OCI, VPS&lt;br /&gt;
* Inginer de suport tehnic &lt;br /&gt;
&lt;br /&gt;
Începând din 2020, &amp;lt;i&amp;gt;Daniel&amp;lt;/i&amp;gt; a colaborat cu companii precum &amp;lt;b&amp;gt;Vodafone&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;Oracle&amp;lt;/b&amp;gt; ca inginer de testare pentru distribuția &amp;lt;i&amp;gt;Oracle Linux&amp;lt;/i&amp;gt; și a contribuit la proiecte de tehnologie auto în &amp;lt;i&amp;gt;AWS Cloud&amp;lt;/i&amp;gt; ca inginer DevOps sub umbrela &amp;lt;b&amp;gt;Ericsson&amp;lt;/b&amp;gt;. Totodată, a desfășurat activități DevOps pentru o companie israeliană, gestionând infrastructuri IT complexe în cloud-ul Amazon.&lt;br /&gt;
&lt;br /&gt;
== Experiență în Predare ==&lt;br /&gt;
În cadrul Academiei Credis, parte a grupului &amp;lt;b&amp;gt;Bitnet&amp;lt;/b&amp;gt;, &amp;lt;i&amp;gt;Daniel&amp;lt;/i&amp;gt; a avut o contribuție remarcabilă ca instructor, formând peste 100 de cursanți în Linux, atât la nivel de bază, cât și avansat.&lt;br /&gt;
&lt;br /&gt;
== Poziția Actuală ==&lt;br /&gt;
&lt;br /&gt;
În prezent, administrează compania &amp;lt;b&amp;gt;WINSYS COMPUTERS SRL&amp;lt;/b&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
Pentru detalii suplimentare, telefon de contact: &amp;lt;b&amp;gt;0728906946&amp;lt;/b&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=560</id>
		<title>Instructor</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=560"/>
		<updated>2025-07-10T09:36:53Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Experiență în Predare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Profil Profesional: Daniel Cătălin Cristea ==&lt;br /&gt;
&lt;br /&gt;
*Cu o diplomă de &amp;lt;i&amp;gt;formator autorizat&amp;lt;/i&amp;gt; și o experiență vastă în domeniul tehnologiei informației, &amp;lt;b&amp;gt;Daniel Cătălin Cristea&amp;lt;/b&amp;gt; și-a început cariera în IT în 1997 ca inginer automatist. Drumul său profesional l-a purtat treptat spre software și sisteme de operare, lucrând ca:&lt;br /&gt;
&lt;br /&gt;
* Inginer de sistem informatic&lt;br /&gt;
* Inginer de testare manuală/automată&lt;br /&gt;
* Devops AWS, OCI, VPS&lt;br /&gt;
* Inginer de suport tehnic &lt;br /&gt;
&lt;br /&gt;
Începând din 2020, &amp;lt;i&amp;gt;Daniel&amp;lt;/i&amp;gt; a colaborat cu companii precum &amp;lt;b&amp;gt;Vodafone&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;Oracle&amp;lt;/b&amp;gt; ca inginer de testare pentru distribuția &amp;lt;i&amp;gt;Oracle Linux&amp;lt;/i&amp;gt; și a contribuit la proiecte de tehnologie auto în &amp;lt;i&amp;gt;AWS Cloud&amp;lt;/i&amp;gt; ca inginer DevOps sub umbrela &amp;lt;b&amp;gt;Ericsson&amp;lt;/b&amp;gt;. Totodată, a desfășurat activități DevOps pentru o companie israeliană, gestionând infrastructuri IT complexe în cloud-ul Amazon.&lt;br /&gt;
&lt;br /&gt;
== Experiență în Predare ==&lt;br /&gt;
În cadrul Academiei Credis, parte a grupului &amp;lt;b&amp;gt;Bitnet&amp;lt;/b&amp;gt;, &amp;lt;i&amp;gt;Daniel&amp;lt;/i&amp;gt; a avut o contribuție remarcabilă ca instructor, formând peste 100 de cursanți în Linux, atât la nivel de bază, cât și avansat.&lt;br /&gt;
&lt;br /&gt;
== Poziția Actuală și Colaborări ==&lt;br /&gt;
&lt;br /&gt;
În prezent, are functie de Linux Level 2 Support in cadrul companiei &amp;lt;b&amp;gt;GTS Telecom&amp;lt;/b&amp;gt;, administrează compania &amp;lt;b&amp;gt;WINSYS COMPUTERS SRL&amp;lt;/b&amp;gt; și colaborează cu academia &amp;lt;b&amp;gt;Nobleprog&amp;lt;/b&amp;gt; pentru a preda cursuri de Linux adaptate diferitelor nivele de pregătire și cerințe ale clienților.&lt;br /&gt;
&lt;br /&gt;
Pentru detalii suplimentare, telefon de contact: &amp;lt;b&amp;gt;0728906946&amp;lt;/b&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=559</id>
		<title>Instructor</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=559"/>
		<updated>2025-07-10T09:36:40Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Profil Profesional: Daniel Cătălin Cristea */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Profil Profesional: Daniel Cătălin Cristea ==&lt;br /&gt;
&lt;br /&gt;
*Cu o diplomă de &amp;lt;i&amp;gt;formator autorizat&amp;lt;/i&amp;gt; și o experiență vastă în domeniul tehnologiei informației, &amp;lt;b&amp;gt;Daniel Cătălin Cristea&amp;lt;/b&amp;gt; și-a început cariera în IT în 1997 ca inginer automatist. Drumul său profesional l-a purtat treptat spre software și sisteme de operare, lucrând ca:&lt;br /&gt;
&lt;br /&gt;
* Inginer de sistem informatic&lt;br /&gt;
* Inginer de testare manuală/automată&lt;br /&gt;
* Devops AWS, OCI, VPS&lt;br /&gt;
* Inginer de suport tehnic &lt;br /&gt;
&lt;br /&gt;
Începând din 2020, &amp;lt;i&amp;gt;Daniel&amp;lt;/i&amp;gt; a colaborat cu companii precum &amp;lt;b&amp;gt;Vodafone&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;Oracle&amp;lt;/b&amp;gt; ca inginer de testare pentru distribuția &amp;lt;i&amp;gt;Oracle Linux&amp;lt;/i&amp;gt; și a contribuit la proiecte de tehnologie auto în &amp;lt;i&amp;gt;AWS Cloud&amp;lt;/i&amp;gt; ca inginer DevOps sub umbrela &amp;lt;b&amp;gt;Ericsson&amp;lt;/b&amp;gt;. Totodată, a desfășurat activități DevOps pentru o companie israeliană, gestionând infrastructuri IT complexe în cloud-ul Amazon.&lt;br /&gt;
&lt;br /&gt;
== Experiență în Predare ==&lt;br /&gt;
În cadrul Academiei Credis, parte a grupului &amp;lt;b&amp;gt;Bitnet&amp;lt;/b&amp;gt;, Daniel a avut o contribuție remarcabilă ca instructor, formând peste 100 de cursanți în Linux, atât la nivel de bază, cât și avansat.&lt;br /&gt;
&lt;br /&gt;
== Poziția Actuală și Colaborări ==&lt;br /&gt;
&lt;br /&gt;
În prezent, are functie de Linux Level 2 Support in cadrul companiei &amp;lt;b&amp;gt;GTS Telecom&amp;lt;/b&amp;gt;, administrează compania &amp;lt;b&amp;gt;WINSYS COMPUTERS SRL&amp;lt;/b&amp;gt; și colaborează cu academia &amp;lt;b&amp;gt;Nobleprog&amp;lt;/b&amp;gt; pentru a preda cursuri de Linux adaptate diferitelor nivele de pregătire și cerințe ale clienților.&lt;br /&gt;
&lt;br /&gt;
Pentru detalii suplimentare, telefon de contact: &amp;lt;b&amp;gt;0728906946&amp;lt;/b&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=558</id>
		<title>Instructor</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=558"/>
		<updated>2025-07-10T09:35:54Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Profil Profesional: Daniel Cătălin Cristea */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Profil Profesional: Daniel Cătălin Cristea ==&lt;br /&gt;
&lt;br /&gt;
*Cu o diplomă de &amp;lt;i&amp;gt;formator autorizat&amp;lt;/i&amp;gt; și o experiență vastă în domeniul tehnologiei informației, &amp;lt;b&amp;gt;Daniel Cătălin Cristea&amp;lt;/b&amp;gt; și-a început cariera în IT în 1997 ca inginer automatist. Drumul său profesional l-a purtat treptat spre software și sisteme de operare, lucrând ca:&lt;br /&gt;
&lt;br /&gt;
* Inginer de sistem informatic&lt;br /&gt;
* Inginer de testare manuală/automată&lt;br /&gt;
* Devops AWS, OCI, VPS&lt;br /&gt;
* Inginer de suport tehnic &lt;br /&gt;
&lt;br /&gt;
Începând din 2020, Daniel a colaborat cu companii precum &amp;lt;b&amp;gt;Vodafone&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;Oracle&amp;lt;/b&amp;gt; ca inginer de testare pentru distribuția &amp;lt;i&amp;gt;Oracle Linux&amp;lt;/i&amp;gt; și a contribuit la proiecte de tehnologie auto în &amp;lt;i&amp;gt;AWS Cloud&amp;lt;/i&amp;gt; ca inginer DevOps sub umbrela &amp;lt;b&amp;gt;Ericsson&amp;lt;/b&amp;gt;. Totodată, a desfășurat activități DevOps pentru o companie israeliană, gestionând infrastructuri IT complexe în cloud-ul Amazon.&lt;br /&gt;
&lt;br /&gt;
== Experiență în Predare ==&lt;br /&gt;
În cadrul Academiei Credis, parte a grupului &amp;lt;b&amp;gt;Bitnet&amp;lt;/b&amp;gt;, Daniel a avut o contribuție remarcabilă ca instructor, formând peste 100 de cursanți în Linux, atât la nivel de bază, cât și avansat.&lt;br /&gt;
&lt;br /&gt;
== Poziția Actuală și Colaborări ==&lt;br /&gt;
&lt;br /&gt;
În prezent, are functie de Linux Level 2 Support in cadrul companiei &amp;lt;b&amp;gt;GTS Telecom&amp;lt;/b&amp;gt;, administrează compania &amp;lt;b&amp;gt;WINSYS COMPUTERS SRL&amp;lt;/b&amp;gt; și colaborează cu academia &amp;lt;b&amp;gt;Nobleprog&amp;lt;/b&amp;gt; pentru a preda cursuri de Linux adaptate diferitelor nivele de pregătire și cerințe ale clienților.&lt;br /&gt;
&lt;br /&gt;
Pentru detalii suplimentare, telefon de contact: &amp;lt;b&amp;gt;0728906946&amp;lt;/b&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=557</id>
		<title>Instructor</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=557"/>
		<updated>2025-07-10T09:18:08Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Profil Profesional: Cristea Daniel Cătălin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Profil Profesional: Daniel Cătălin Cristea ==&lt;br /&gt;
&lt;br /&gt;
*Cu o diplomă de &amp;lt;i&amp;gt;formator autorizat&amp;lt;/i&amp;gt; și o experiență vastă în domeniul tehnologiei informației, &amp;lt;b&amp;gt;Daniel Cătălin Cristea&amp;lt;/b&amp;gt; și-a început cariera în IT în 1997 ca inginer automatist. Drumul său profesional l-a purtat treptat spre software și sisteme de operare, lucrând ca:&lt;br /&gt;
&lt;br /&gt;
* Inginer de sistem informatic&lt;br /&gt;
* Inginer de testare manuală/automată&lt;br /&gt;
* Devops AWS, OCI, VPS&lt;br /&gt;
* Inginer de suport tehnic &lt;br /&gt;
&lt;br /&gt;
Începând din 2020, Cristea a colaborat cu companii precum &amp;lt;b&amp;gt;Vodafone&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;Oracle&amp;lt;/b&amp;gt; ca inginer de testare pentru distribuția &amp;lt;i&amp;gt;Oracle Linux&amp;lt;/i&amp;gt; și a contribuit la proiecte de tehnologie auto în &amp;lt;i&amp;gt;AWS Cloud&amp;lt;/i&amp;gt; ca inginer DevOps sub umbrela &amp;lt;b&amp;gt;Ericsson&amp;lt;/b&amp;gt;. Totodată, a desfășurat activități DevOps pentru o companie israeliană, gestionând infrastructuri IT complexe în cloud-ul Amazon.&lt;br /&gt;
&lt;br /&gt;
== Experiență în Predare ==&lt;br /&gt;
În cadrul Academiei Credis, parte a grupului &amp;lt;b&amp;gt;Bitnet&amp;lt;/b&amp;gt;, Daniel a avut o contribuție remarcabilă ca instructor, formând peste 100 de cursanți în Linux, atât la nivel de bază, cât și avansat.&lt;br /&gt;
&lt;br /&gt;
== Poziția Actuală și Colaborări ==&lt;br /&gt;
&lt;br /&gt;
În prezent, are functie de Linux Level 2 Support in cadrul companiei &amp;lt;b&amp;gt;GTS Telecom&amp;lt;/b&amp;gt;, administrează compania &amp;lt;b&amp;gt;WINSYS COMPUTERS SRL&amp;lt;/b&amp;gt; și colaborează cu academia &amp;lt;b&amp;gt;Nobleprog&amp;lt;/b&amp;gt; pentru a preda cursuri de Linux adaptate diferitelor nivele de pregătire și cerințe ale clienților.&lt;br /&gt;
&lt;br /&gt;
Pentru detalii suplimentare, telefon de contact: &amp;lt;b&amp;gt;0728906946&amp;lt;/b&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=556</id>
		<title>Instructor</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=556"/>
		<updated>2025-07-10T09:16:42Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Poziția Actuală și Colaborări */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Profil Profesional: Cristea Daniel Cătălin ==&lt;br /&gt;
&lt;br /&gt;
*Cu o diplomă de &amp;lt;i&amp;gt;formator autorizat&amp;lt;/i&amp;gt; și o experiență vastă în domeniul tehnologiei informației, &amp;lt;b&amp;gt;Daniel Cătălin Cristea&amp;lt;/b&amp;gt; și-a început cariera în IT în 1997 ca inginer automatist. Drumul său profesional l-a purtat treptat spre software și sisteme de operare, lucrând ca:&lt;br /&gt;
&lt;br /&gt;
* Inginer de sistem informatic&lt;br /&gt;
* Inginer de testare manuală/automată&lt;br /&gt;
* Devops AWS, OCI, VPS&lt;br /&gt;
* Inginer de suport tehnic &lt;br /&gt;
&lt;br /&gt;
Începând din 2020, Cristea a colaborat cu companii precum &amp;lt;b&amp;gt;Vodafone&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;Oracle&amp;lt;/b&amp;gt; ca inginer de testare pentru distribuția &amp;lt;i&amp;gt;Oracle Linux&amp;lt;/i&amp;gt; și a contribuit la proiecte de tehnologie auto în &amp;lt;i&amp;gt;AWS Cloud&amp;lt;/i&amp;gt; ca inginer DevOps sub umbrela &amp;lt;b&amp;gt;Ericsson&amp;lt;/b&amp;gt;. Totodată, a desfășurat activități DevOps pentru o companie israeliană, gestionând infrastructuri IT complexe în cloud-ul Amazon.&lt;br /&gt;
&lt;br /&gt;
== Experiență în Predare ==&lt;br /&gt;
În cadrul Academiei Credis, parte a grupului &amp;lt;b&amp;gt;Bitnet&amp;lt;/b&amp;gt;, Daniel a avut o contribuție remarcabilă ca instructor, formând peste 100 de cursanți în Linux, atât la nivel de bază, cât și avansat.&lt;br /&gt;
&lt;br /&gt;
== Poziția Actuală și Colaborări ==&lt;br /&gt;
&lt;br /&gt;
În prezent, are functie de Linux Level 2 Support in cadrul companiei &amp;lt;b&amp;gt;GTS Telecom&amp;lt;/b&amp;gt;, administrează compania &amp;lt;b&amp;gt;WINSYS COMPUTERS SRL&amp;lt;/b&amp;gt; și colaborează cu academia &amp;lt;b&amp;gt;Nobleprog&amp;lt;/b&amp;gt; pentru a preda cursuri de Linux adaptate diferitelor nivele de pregătire și cerințe ale clienților.&lt;br /&gt;
&lt;br /&gt;
Pentru detalii suplimentare, telefon de contact: &amp;lt;b&amp;gt;0728906946&amp;lt;/b&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=555</id>
		<title>Instructor</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=555"/>
		<updated>2025-07-10T09:15:53Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Profil Profesional: Cristea Daniel Cătălin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Profil Profesional: Cristea Daniel Cătălin ==&lt;br /&gt;
&lt;br /&gt;
*Cu o diplomă de &amp;lt;i&amp;gt;formator autorizat&amp;lt;/i&amp;gt; și o experiență vastă în domeniul tehnologiei informației, &amp;lt;b&amp;gt;Daniel Cătălin Cristea&amp;lt;/b&amp;gt; și-a început cariera în IT în 1997 ca inginer automatist. Drumul său profesional l-a purtat treptat spre software și sisteme de operare, lucrând ca:&lt;br /&gt;
&lt;br /&gt;
* Inginer de sistem informatic&lt;br /&gt;
* Inginer de testare manuală/automată&lt;br /&gt;
* Devops AWS, OCI, VPS&lt;br /&gt;
* Inginer de suport tehnic &lt;br /&gt;
&lt;br /&gt;
Începând din 2020, Cristea a colaborat cu companii precum &amp;lt;b&amp;gt;Vodafone&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;Oracle&amp;lt;/b&amp;gt; ca inginer de testare pentru distribuția &amp;lt;i&amp;gt;Oracle Linux&amp;lt;/i&amp;gt; și a contribuit la proiecte de tehnologie auto în &amp;lt;i&amp;gt;AWS Cloud&amp;lt;/i&amp;gt; ca inginer DevOps sub umbrela &amp;lt;b&amp;gt;Ericsson&amp;lt;/b&amp;gt;. Totodată, a desfășurat activități DevOps pentru o companie israeliană, gestionând infrastructuri IT complexe în cloud-ul Amazon.&lt;br /&gt;
&lt;br /&gt;
== Experiență în Predare ==&lt;br /&gt;
În cadrul Academiei Credis, parte a grupului &amp;lt;b&amp;gt;Bitnet&amp;lt;/b&amp;gt;, Daniel a avut o contribuție remarcabilă ca instructor, formând peste 100 de cursanți în Linux, atât la nivel de bază, cât și avansat.&lt;br /&gt;
&lt;br /&gt;
== Poziția Actuală și Colaborări ==&lt;br /&gt;
&lt;br /&gt;
În prezent, are functie de Linux Level 2 Support in cadrul companiei &amp;lt;b&amp;gt;GTS Telecom&amp;lt;/b&amp;gt;, administrează compania &amp;lt;b&amp;gt;WINSYS COMPUTERS SRL&amp;lt;/b&amp;gt; și colaborează cu &amp;lt;b&amp;gt;Nobleprog&amp;lt;/b&amp;gt; pentru a preda cursuri de Linux adaptate diferitelor nivele de pregătire și cerințe ale clienților.&lt;br /&gt;
&lt;br /&gt;
Pentru detalii suplimentare, telefon de contact: &amp;lt;b&amp;gt;0728906946&amp;lt;/b&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=554</id>
		<title>Instructor</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=554"/>
		<updated>2025-07-10T09:14:04Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Profil Profesional: Cristea Daniel Cătălin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Profil Profesional: Cristea Daniel Cătălin ==&lt;br /&gt;
&lt;br /&gt;
*Cu o diplomă de Formator autorizat și o experiență vastă în domeniul tehnologiei informației, &amp;lt;b&amp;gt;Cristea Daniel Cătălin&amp;lt;/b&amp;gt; și-a început cariera în IT în 1997 ca inginer automatist. Drumul său profesional l-a purtat treptat spre software și sisteme de operare, lucrând ca:&lt;br /&gt;
&lt;br /&gt;
* Inginer de sistem informatic&lt;br /&gt;
* Inginer de testare manuală/automată&lt;br /&gt;
* Devops AWS, OCI, VPS&lt;br /&gt;
* Inginer de suport tehnic &lt;br /&gt;
&lt;br /&gt;
Începând din 2020, Cristea a colaborat cu companii precum &amp;lt;b&amp;gt;Vodafone&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;Oracle&amp;lt;/b&amp;gt; ca inginer de testare pentru distribuția &amp;lt;i&amp;gt;Oracle Linux&amp;lt;/i&amp;gt; și a contribuit la proiecte de tehnologie auto în &amp;lt;i&amp;gt;AWS Cloud&amp;lt;/i&amp;gt; ca inginer DevOps sub umbrela &amp;lt;b&amp;gt;Ericsson&amp;lt;/b&amp;gt;. Totodată, a desfășurat activități DevOps pentru o companie israeliană, gestionând infrastructuri IT complexe în cloud-ul Amazon.&lt;br /&gt;
&lt;br /&gt;
== Experiență în Predare ==&lt;br /&gt;
În cadrul Academiei Credis, parte a grupului &amp;lt;b&amp;gt;Bitnet&amp;lt;/b&amp;gt;, Daniel a avut o contribuție remarcabilă ca instructor, formând peste 100 de cursanți în Linux, atât la nivel de bază, cât și avansat.&lt;br /&gt;
&lt;br /&gt;
== Poziția Actuală și Colaborări ==&lt;br /&gt;
&lt;br /&gt;
În prezent, are functie de Linux Level 2 Support in cadrul companiei &amp;lt;b&amp;gt;GTS Telecom&amp;lt;/b&amp;gt;, administrează compania &amp;lt;b&amp;gt;WINSYS COMPUTERS SRL&amp;lt;/b&amp;gt; și colaborează cu &amp;lt;b&amp;gt;Nobleprog&amp;lt;/b&amp;gt; pentru a preda cursuri de Linux adaptate diferitelor nivele de pregătire și cerințe ale clienților.&lt;br /&gt;
&lt;br /&gt;
Pentru detalii suplimentare, telefon de contact: &amp;lt;b&amp;gt;0728906946&amp;lt;/b&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=553</id>
		<title>Instructor</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=553"/>
		<updated>2025-07-10T09:11:42Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Experiență în Predare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Profil Profesional: Cristea Daniel Cătălin ==&lt;br /&gt;
&lt;br /&gt;
*Cu o diplomă de Formator autorizat și o experiență vastă în domeniul tehnologiei informației, &amp;lt;b&amp;gt;Cristea Daniel Cătălin&amp;lt;/b&amp;gt; și-a început cariera în IT în 1997 ca inginer automatist. Drumul său profesional l-a purtat treptat spre software și sisteme de operare, lucrând ca:&lt;br /&gt;
&lt;br /&gt;
* Inginer de sistem informatic&lt;br /&gt;
* Inginer de testare, atât manuală, cât și automată&lt;br /&gt;
* Devops AWS, OCI, VPS&lt;br /&gt;
&lt;br /&gt;
Începând din 2020, Cristea a colaborat cu &amp;lt;b&amp;gt;Oracle&amp;lt;/b&amp;gt; ca inginer de testare pentru distribuția &amp;lt;i&amp;gt;Oracle Linux&amp;lt;/i&amp;gt; și a contribuit la proiecte de tehnologie auto în &amp;lt;i&amp;gt;AWS Cloud&amp;lt;/i&amp;gt; ca inginer DevOps sub umbrela &amp;lt;b&amp;gt;Ericsson&amp;lt;/b&amp;gt;. Totodată, a desfășurat activități DevOps pentru o companie israeliană, gestionând infrastructuri IT complexe în cloud-ul Amazon.&lt;br /&gt;
&lt;br /&gt;
== Experiență în Predare ==&lt;br /&gt;
În cadrul Academiei Credis, parte a grupului &amp;lt;b&amp;gt;Bitnet&amp;lt;/b&amp;gt;, Daniel a avut o contribuție remarcabilă ca instructor, formând peste 100 de cursanți în Linux, atât la nivel de bază, cât și avansat.&lt;br /&gt;
&lt;br /&gt;
== Poziția Actuală și Colaborări ==&lt;br /&gt;
&lt;br /&gt;
În prezent, are functie de Linux Level 2 Support in cadrul companiei &amp;lt;b&amp;gt;GTS Telecom&amp;lt;/b&amp;gt;, administrează compania &amp;lt;b&amp;gt;WINSYS COMPUTERS SRL&amp;lt;/b&amp;gt; și colaborează cu &amp;lt;b&amp;gt;Nobleprog&amp;lt;/b&amp;gt; pentru a preda cursuri de Linux adaptate diferitelor nivele de pregătire și cerințe ale clienților.&lt;br /&gt;
&lt;br /&gt;
Pentru detalii suplimentare, telefon de contact: &amp;lt;b&amp;gt;0728906946&amp;lt;/b&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=552</id>
		<title>Instructor</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=552"/>
		<updated>2025-07-10T09:10:53Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Poziția Actuală și Colaborări */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Profil Profesional: Cristea Daniel Cătălin ==&lt;br /&gt;
&lt;br /&gt;
*Cu o diplomă de Formator autorizat și o experiență vastă în domeniul tehnologiei informației, &amp;lt;b&amp;gt;Cristea Daniel Cătălin&amp;lt;/b&amp;gt; și-a început cariera în IT în 1997 ca inginer automatist. Drumul său profesional l-a purtat treptat spre software și sisteme de operare, lucrând ca:&lt;br /&gt;
&lt;br /&gt;
* Inginer de sistem informatic&lt;br /&gt;
* Inginer de testare, atât manuală, cât și automată&lt;br /&gt;
* Devops AWS, OCI, VPS&lt;br /&gt;
&lt;br /&gt;
Începând din 2020, Cristea a colaborat cu &amp;lt;b&amp;gt;Oracle&amp;lt;/b&amp;gt; ca inginer de testare pentru distribuția &amp;lt;i&amp;gt;Oracle Linux&amp;lt;/i&amp;gt; și a contribuit la proiecte de tehnologie auto în &amp;lt;i&amp;gt;AWS Cloud&amp;lt;/i&amp;gt; ca inginer DevOps sub umbrela &amp;lt;b&amp;gt;Ericsson&amp;lt;/b&amp;gt;. Totodată, a desfășurat activități DevOps pentru o companie israeliană, gestionând infrastructuri IT complexe în cloud-ul Amazon.&lt;br /&gt;
&lt;br /&gt;
== Experiență în Predare ==&lt;br /&gt;
În cadrul Academiei Credis, parte a grupului &amp;lt;b&amp;gt;Bitnet&amp;lt;/b&amp;gt;, Cristea a avut o contribuție remarcabilă ca instructor, formând peste 100 de cursanți în Linux, atât la nivel de bază, cât și avansat.&lt;br /&gt;
&lt;br /&gt;
== Poziția Actuală și Colaborări ==&lt;br /&gt;
&lt;br /&gt;
În prezent, are functie de Linux Level 2 Support in cadrul companiei &amp;lt;b&amp;gt;GTS Telecom&amp;lt;/b&amp;gt;, administrează compania &amp;lt;b&amp;gt;WINSYS COMPUTERS SRL&amp;lt;/b&amp;gt; și colaborează cu &amp;lt;b&amp;gt;Nobleprog&amp;lt;/b&amp;gt; pentru a preda cursuri de Linux adaptate diferitelor nivele de pregătire și cerințe ale clienților.&lt;br /&gt;
&lt;br /&gt;
Pentru detalii suplimentare, telefon de contact: &amp;lt;b&amp;gt;0728906946&amp;lt;/b&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=551</id>
		<title>Instructor</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=551"/>
		<updated>2025-07-10T09:10:16Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Poziția Actuală și Colaborări */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Profil Profesional: Cristea Daniel Cătălin ==&lt;br /&gt;
&lt;br /&gt;
*Cu o diplomă de Formator autorizat și o experiență vastă în domeniul tehnologiei informației, &amp;lt;b&amp;gt;Cristea Daniel Cătălin&amp;lt;/b&amp;gt; și-a început cariera în IT în 1997 ca inginer automatist. Drumul său profesional l-a purtat treptat spre software și sisteme de operare, lucrând ca:&lt;br /&gt;
&lt;br /&gt;
* Inginer de sistem informatic&lt;br /&gt;
* Inginer de testare, atât manuală, cât și automată&lt;br /&gt;
* Devops AWS, OCI, VPS&lt;br /&gt;
&lt;br /&gt;
Începând din 2020, Cristea a colaborat cu &amp;lt;b&amp;gt;Oracle&amp;lt;/b&amp;gt; ca inginer de testare pentru distribuția &amp;lt;i&amp;gt;Oracle Linux&amp;lt;/i&amp;gt; și a contribuit la proiecte de tehnologie auto în &amp;lt;i&amp;gt;AWS Cloud&amp;lt;/i&amp;gt; ca inginer DevOps sub umbrela &amp;lt;b&amp;gt;Ericsson&amp;lt;/b&amp;gt;. Totodată, a desfășurat activități DevOps pentru o companie israeliană, gestionând infrastructuri IT complexe în cloud-ul Amazon.&lt;br /&gt;
&lt;br /&gt;
== Experiență în Predare ==&lt;br /&gt;
În cadrul Academiei Credis, parte a grupului &amp;lt;b&amp;gt;Bitnet&amp;lt;/b&amp;gt;, Cristea a avut o contribuție remarcabilă ca instructor, formând peste 100 de cursanți în Linux, atât la nivel de bază, cât și avansat.&lt;br /&gt;
&lt;br /&gt;
== Poziția Actuală și Colaborări ==&lt;br /&gt;
&lt;br /&gt;
În prezent, are functie de Linux Level 2 Support in cadrul companiei &amp;lt;b&amp;gt;GTS Telecom&amp;lt;/b&amp;gt;, administrează compania &amp;lt;b&amp;gt;WINSYS COMPUTERS SRL&amp;lt;/b&amp;gt; și colaborează cu &amp;lt;b&amp;gt;Nobleprog&amp;lt;/b&amp;gt; pentru a preda cursuri de Linux adaptate diferitelor nivele de pregătire și cerințe ale clienților.&lt;br /&gt;
&lt;br /&gt;
Pentru detalii suplimentare, telefon de contact: 0728906946.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Essentials_Pagina_8&amp;diff=550</id>
		<title>Essentials Pagina 8</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Essentials_Pagina_8&amp;diff=550"/>
		<updated>2025-04-11T08:23:44Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Case */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Laborator 8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Shell Scripts=&lt;br /&gt;
&lt;br /&gt;
==1.1 Introducere in Bash==&lt;br /&gt;
Shellul este interpretorul de comenzi. Acesta parseaza comenzile introduse de&lt;br /&gt;
utilizator, le verifica din punct de vedere al sintaxei si le trimite kernel-ului spre executie.&lt;br /&gt;
&lt;br /&gt;
Exista mai multe shelluri (Bourne, C Shell, recent aparute Zsh si Fish, etc), dar default pe Linux este shellul numit Bash (Bourne Again Shell). Acesta este reprezentat de fisierul &#039;&#039;/bin/bash&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Pe langa interpretarea si executia comenzilor, Bash-ul ofera si alte facilitati printre&lt;br /&gt;
care: editarea liniei de comanda, history, alias-uri, dar si un limbaj de programare structurat propriu.&lt;br /&gt;
&lt;br /&gt;
Un script de shell este un fisier text (ASCII) care contine comenzi de shell organizate intr-un mod logic. Pe langa comenzi, script-ul mai contine si variabile (locale sau globale), parametri pozitionali precum si structuri de programare specifice (if..then..else, while, do, until, for, case, selsect etc). Un script este folosit pentru a imbina comenzi si diverse structuri de control pentru a oferi o noua functionalitate sau a automatiza task-uri.&lt;br /&gt;
&lt;br /&gt;
Etapele crearii unui script sunt:&lt;br /&gt;
&lt;br /&gt;
a) crearea unui fisier text folosind editorul preferat (Exemplu: vim)&lt;br /&gt;
b) editarea fisierului pentru a contine functionalitatea dorita&lt;br /&gt;
c) testarea scriptului adica executia/rularea acestuia&lt;br /&gt;
&lt;br /&gt;
Modul de executie a unui script numit script1:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Din directorul care contine scriptul se ruleaza : ./script1&lt;br /&gt;
Fisierul script1 trebuie sa aiba dreptul de executie. Fiindca directorul curent (.) nu&lt;br /&gt;
se afla in $PATH (altfel grave probleme de securitate), scriptul trebuie sa fie executat cu calea absoluta sau cu ./nume_script In acest caz se porneste un shell nou ca sub proces al shellului curent in care se executa comenzile din script.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Din directorul care contine fisierul script1 se ruleaza: . script1 sau source script1.&lt;br /&gt;
Se executa comenzile din script1 in shell-ul curent. Fisierul script1 nu trebuie sa&lt;br /&gt;
aiba dreptul de executie. Una dintre diferentele dintre prima si a doua varianta este ca variabilele exportate sau globale sunt vizibile in shell-ul curent in varianta a doua, dar nu si in prima varianta.&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Varianta cea mai folosita de executie a unui script este prima: ./script&lt;br /&gt;
Un script trebuie sa contina pe prima linie o referire la programul cu care se executa (Bash, Perl, PHP, Python etc). Astfel prima linie a unui script Bash este invariabil: #!/bin/bash. In interiorul scriptului #(diez) reprezinta un comentariu. Exceptie face prima linie.&lt;br /&gt;
&lt;br /&gt;
echo se foloseste pentru afisa un string (sir de caractere) sau o variabila la consola.&lt;br /&gt;
Exemplu: echo &amp;quot;Linux&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Script care afiseaza mesajul: Acesta este primul exemplu !&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 echo &amp;quot;Acesta este primul exemplu !&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Script care creaza un fiser numit continut_etc.txt in directorul curent ce contine fisierele si directoarele din directorul /etc, iar apoi afiseaza spatiul total, ocupat si liber de pe fiecare partitie de pe Hard Disk.&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 ls -l /etc &amp;gt; continut_etc.txt&lt;br /&gt;
 echo &amp;quot;Fisierul continut_etc.txt a fost creat in directorul curent!&amp;quot;&lt;br /&gt;
 echo &amp;quot;Informatii partitii:&amp;quot;&lt;br /&gt;
 df -h Important&lt;br /&gt;
&lt;br /&gt;
O cunoastere acceptabila a modului de creare de scripturi este esentiala pentru orice Administrator de sistem. In cazul persoanelor incepatoare care nu au experienta in programare (orice limbaj) procesul de scripting pare la prima vedere extrem de complicat.&lt;br /&gt;
&lt;br /&gt;
Este nevoie de multe exercitii si exemple pentru o intelegere aprofundata. Intotdeauna se incepe cu exercitii simple si anume scripturi formate din cateva randuri.&lt;br /&gt;
&lt;br /&gt;
==1.2 Variabile, constante si functii==&lt;br /&gt;
&lt;br /&gt;
Prezentare generala:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; O variabila reprezinta un nume pentru o locatie de memorie unde se gaseste o valoare. Se obisnuieste (nu este obligatoriu) ca variabilele sa se scrie cu litera mare.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Comparativ cu alte limbaje de programare (C/C++, JAVA) variabilele in Bash nu au tip. Ele sunt string-uri, dar in functie de context pot fi evaluate ca integer etc.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; O variabila se declara: NUME_VAR=valoare&lt;br /&gt;
&lt;br /&gt;
Important&lt;br /&gt;
Nu se foloseste spatiu intre NUME_VAR si valoare. i = 1 reprezinta eroare. Sintaxa bash - ului este extrem de stricta. Un spatiu in plus sau in minus reprezinta o eroare fatala.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 NUME=&amp;quot;dan&amp;quot;&lt;br /&gt;
 varsta=20&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4&#039;&#039;&#039;. Pentru a ne referi la continutul unei varibile se foloseste semnul $ (dollar) in fata numelui variabilei.&lt;br /&gt;
Exemplu: echo $varsta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5&#039;&#039;&#039;. Variabilele pot fi locale sau globale. Cele locale sunt vizibile doar in shell-ul curent, iar cele globale sunt vizibile in shell-ul curent si in toate subprocesele shell-ului curent. Astfel in interiorul unui script daca se foloseste o variabila globala aceasta va fi accesibila oricarei comenzi/program lansata din acel script. Variabilele globale nu sunt accesibile parintelui unui proces, adica shell-ului de unde s-a executat scriptul. Exceptie face varianta 2 de executie a unui script adica folosind source nume_script&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6&#039;&#039;&#039;. Pentru a declara o variabila globala aceasta trebuie exportata. Se foloseste cuvantul cheie export&lt;br /&gt;
&lt;br /&gt;
 Exemplu: export VARSTA=20&lt;br /&gt;
 variabilele globale se numesc de environment;&lt;br /&gt;
 pentru a vizualiza variabilele locale se foloseste comanda set;&lt;br /&gt;
 pentru a vizualiza variabilele globale se foloseste comanda env;&lt;br /&gt;
 pentru sterge o variabila se foloseste comanda unset NUME_VAR;&lt;br /&gt;
&lt;br /&gt;
Exemplu de varibile globale predefinite:&lt;br /&gt;
 PATH -&amp;gt; contine o lista de directoare in care shell-ul cauta comanda care se executa.&lt;br /&gt;
&lt;br /&gt;
Pentru a concatena un string la variabila PATH se foloseste caracterul : (doua puncte).&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&lt;br /&gt;
Daca dorim sa adaugam directorul /home/dan/scripts in PATH: export&lt;br /&gt;
 PATH=PATH:/home/stud/scripts&lt;br /&gt;
&lt;br /&gt;
Dupa aceasta scripturi si comenzi din /home/stud/scripts pot fi rulate in orice director ne am afla doar prin numele lor. Altfel trebuie folosita calea absoluta sau aflandu-ne in&lt;br /&gt;
director se executa: ./nume_comanda&lt;br /&gt;
 HOSTNAME -&amp;gt; contine hostname-ul calculatorului&lt;br /&gt;
 SHELL -&amp;gt; contine shell-ul default&lt;br /&gt;
 HISTSIZE - contine nr. de comenzi care vor fi memorate in history&lt;br /&gt;
 USER -&amp;gt; contine EUID&lt;br /&gt;
 PWD -&amp;gt; contine directorul curent&lt;br /&gt;
 OLDPWD -&amp;gt; contine directorul precedent si se foloseste de comanda: cd –&lt;br /&gt;
 HOME -&amp;gt; contine home directory al EUID&lt;br /&gt;
 RANDOM -&amp;gt; variabila al carei continut este pseudoaleator&lt;br /&gt;
 TMOUT -&amp;gt; nr in secunde dupa care se face logout automat daca nu se executa nicio comanda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7&#039;&#039;&#039;. Diferenta dintre ghilimele simple(apostrof) si ghilimele duble este aceea ca ghilimele simple nu interpreteaza $ ca si caracter special. In interiorul ghilimelelor simple fiecare caracter special cu exceptia &#039; (ghilimea simpla) este interpretat literal.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 varsta=20 echo &amp;quot;$varsta&amp;quot; ##se afiseaza 20 echo &#039;$varsta&#039; ##se afiseaza $varsta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8&#039;&#039;&#039;. O variabila poate fi declarata read-only sau de tip array. O variabila read-only se mai numeste si constanta.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 &#039;&#039;&#039;1.&#039;&#039;&#039; var1 este readonly. Aceasta nu poate fi modificata sau stearsa folosind unset.&lt;br /&gt;
 declare -r var1=7&lt;br /&gt;
 &#039;&#039;&#039;2.&#039;&#039;&#039; Pentru a declara un array/vector:&lt;br /&gt;
 ARRAY=(unu doi trei) echo ${ARRAY[*]} echo ${ARRAY[1]} i=2 echo&lt;br /&gt;
 ${ARRAY[]} unset ARRAY[1] unset ARRAY&lt;br /&gt;
 ARRAY nu este cuvant cheie. In loc de ARRAY poate fi orice cuvant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;9&#039;&#039;&#039;. Pentru a citi o variabila de la tastatura se foloseste cuvantul cheie read&lt;br /&gt;
Exemplu:&lt;br /&gt;
 #!/bin/bash echo &amp;quot;Introdu nume fisier:&amp;quot; read FILE echo &amp;quot;Fisierul introdus este $FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10&#039;&#039;&#039;. In bash exista caractere speciale care sunt interpretate in mod deosebit.&lt;br /&gt;
 Exemple: $ (dollar), &amp;quot;(ghilimea dubla) sau \ (backslash). Pentru a anula efectul special al&lt;br /&gt;
caracterului, acesta se precede cu \ (backslash).&lt;br /&gt;
&lt;br /&gt;
 Exemplu: echo \$var -&amp;gt; Afiseaza $var. $ nu mai este caracter special.&lt;br /&gt;
&lt;br /&gt;
==1.3 Parametri pozitionali==&lt;br /&gt;
Bash-ul foloseste parametri speciali la care ne putem referi in interiorul unui script&lt;br /&gt;
pentru a avea acces la anumite valori. Acesti parametri speciali se pot folosi ca si&lt;br /&gt;
variabilele, doar ca exista default si nu trebuie creati. Continutul acestora este de asemenea standard.&lt;br /&gt;
&lt;br /&gt;
Acestia sunt:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; $0 - contine numele scriptului&lt;br /&gt;
Scriptul poate actiona diferit in functie de numele cu care a fost rulat ( Exemplu:&lt;br /&gt;
daca se ruleaza folosind un simlink al scriptului. Vezi comanda /bin/egrep care este un simlink catre /bin/grep dar are totusi functionalitate diferita).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; $1 - reprezinta primul argument al scriptului, $2 al doilea argument al scriptului etc. Incepand cu argumentul 10 acesta trebuie incadrat intre acolade ${10}, ${11} etc.&lt;br /&gt;
Se folosesc pentru a evita erori in momentul in care scriptul este rulat fara argumente sau cu un alt nr. de argumente (iar acesta asteapta sa primeasca argumente).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; $? - reprezinta statusul ultimei comenzi executate.&lt;br /&gt;
In Bash Zero este statusul pentru non-error iar diferit de zero este statusul pentru eroare. Orice comanda/program are un status de exit, zero sau non-zero. Se foloseste pentru a continua executia scriptului (sau a modifica comportamentul acestuia) in functie de statusul comenzilor anterioare.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; $# - reprezinta nr. de argumente ale scriptului Se poate lua o decizie in functie de nr. de argumente cu care a fost rulat scriptul.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.&#039;&#039;&#039; $* - reprezinta toate argumentele date scriptului.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.&#039;&#039;&#039; $$ - reprezinta PID shell.&lt;br /&gt;
Astel in functie de cum rulam scriptul $$ are alta valoare:source f1 - $$ reprezinta PID bash (shell curent) ./f1 - $$ reprezinta PID noului sub-shell creat in care se executa comenzile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.&#039;&#039;&#039; $! - reprezinta PID ultimului proces executat in background.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Script care sterge fisierul sau directorul pe care-l primeste ca argument&lt;br /&gt;
 #!/bin/bash rm -rf $1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Afisarea numelui scriptului&lt;br /&gt;
 #!/bin/bash Echo &amp;quot;Numele scriptului executat este: $0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==1.4 Alte facilitati Bash==&lt;br /&gt;
===Alias===&lt;br /&gt;
Un alias reprezinta un mod prin care o comanda sau o serie de comenzi se executa folosind un alt nume.&lt;br /&gt;
Pentru a crea un alias se foloseste comanda: alias comanda_noua=&#039;comanda_substituita&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. alias copy=&#039;cp&#039;&lt;br /&gt;
2. alias search=&#039;grep&#039;&lt;br /&gt;
3. alias ls=&#039;ls -F&#039;&lt;br /&gt;
4. alias rm=&#039;rm -i&#039;&lt;br /&gt;
5. alias ll=&#039;ls -l&#039;&lt;br /&gt;
6. alias stop=&#039;kill -9&#039;&lt;br /&gt;
&lt;br /&gt;
Daca aliasul este compus din mai multe cuvinte acestea trebuie incadrate intre&lt;br /&gt;
ghilimele simple (apostrof).Pentru a vizualiza toate aliasurile din sistem se foloseste comanda alias fara nici un argument.Pentru a executa comanda originala in locul aliasului se foloseste \ (backslash) urmat de comanda.&lt;br /&gt;
&lt;br /&gt;
Example: \ls&lt;br /&gt;
Pentru a sterge un alias se foloseste comanda unalias&lt;br /&gt;
Exemplu: unalias ls&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Un alias exista doar in shell-ul curent (nu exista nici macar in subshell-urile shell-ului curent).&lt;br /&gt;
&lt;br /&gt;
===Customizare Environment===&lt;br /&gt;
Prompting variables (prompt strings)&lt;br /&gt;
&lt;br /&gt;
Bash foloseste 4 variabile speciale numite &amp;quot;prompt strings&amp;quot;: PS1, PS2, PS3 si PS4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; PS1 este numit &amp;quot;primary prompt string&amp;quot; si reprezinta prompterul curent.&lt;br /&gt;
De cele mai multe ori acesta se modifica pentru a arata informatii cat mai utile despre sesiunea curenta.&lt;br /&gt;
&lt;br /&gt;
 PS1 foloseste niste macro-uri care se expandeaza cu un anumit continut astfel:&lt;br /&gt;
 \A - current time in HH:MM hours format&lt;br /&gt;
 \d - current date&lt;br /&gt;
 \@ - the current time in 12 hours format&lt;br /&gt;
 \H - the hostname&lt;br /&gt;
 \h - the hostname up to the first dot (.)&lt;br /&gt;
 \s - the name of the shell&lt;br /&gt;
 \u - username of the EUID&lt;br /&gt;
 \w - the current working directory&lt;br /&gt;
 \W - the current working directory (basename) - relativ&lt;br /&gt;
 \$ - if EUID==0 print # else print $&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Un exemplu excelent de modificare PS1 este: export PS1=&#039;[\u@\h \w]$&#039;&lt;br /&gt;
Avand acest prompter adminul are intotdeauna informatii despre userul cu care s-a conectat, host-ul pe care este conectat precum si calea absoluta a directorului curent. Linia de mai sus se adauga in fisierul de customizare ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; PS2 este numit &amp;quot;secondary prompt string&amp;quot; si are valoarea default &amp;gt; (mai mare).&lt;br /&gt;
Se foloseste atunci cand se scrie o comanda incompleta si se apasa ENTER.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; PS3 se numeste &amp;quot;prompt string for the select command&amp;quot; si se foloseste in scripting impreuna cu comanda select&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; PS4 se numeste &amp;quot;prompt string for the xtrace option&amp;quot; si reprezinta un prompt string folosit in debugging si flow control.&lt;br /&gt;
&lt;br /&gt;
===Environment===&lt;br /&gt;
Fiecare utilizator are propriul mediu de lucru numit si Environment. Customizarea&lt;br /&gt;
Environmentului presupune modificarea unor variabile si parametri astfel incat mediul de lucru sa fie cat mai prietenos si sa ne ofere cat mai multe informatii.&lt;br /&gt;
Din mediul de lucru al unui utilizator fac parte: aliasurile sale, umask, modul de&lt;br /&gt;
afisare al prompterului, variabila PATH in care shellul cauta comenzile, ulimit etc&lt;br /&gt;
&lt;br /&gt;
Exista fisiere de initializare pentru fiecare user care sunt citite de shell la fiecare&lt;br /&gt;
pornire a acestuia:&lt;br /&gt;
&lt;br /&gt;
~/.bashrc - este primul fisier citit de shell la login. In acest fisier trebuie declarate variabile,&lt;br /&gt;
alias-uri etc pentru fiecare user.&lt;br /&gt;
~/.bash_profile - este citit dupa ~/.bashrc&lt;br /&gt;
~/.bash_logout - este citit de shell inainte de logout. In acest fisier se pot reseta variabile, sterge fisiere temporare sau alte functii care vrem sa aiba loc inainte de logout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fisierul /etc/profile este un alt fisier de customizare &amp;quot;system-wide&amp;quot;. Acesta nu&lt;br /&gt;
apartine unui anumit user, iar in el se configureaza mediul pentru toti userii. Il folosim de exemplu daca dorim setarea unui alias pentru toti userii din sistem.&lt;br /&gt;
Aceste fisiere nu sunt recitite automat de shell dupa modificare. Toate configurarile au efect dupa o noua logare in cazul ~/.bashrc sau ~/.bash_profile sau dupa o restartare a sistemului in cazul /etc/profile.Pentru a forta recitirea lor se foloseste comanda source sau . (dot) urmata de nume fisier. source sau . executa comenzile din interiorul fisierului in shellul curent.&lt;br /&gt;
&lt;br /&gt;
Exemplu: source ~/.bashrc sau . ~/.bashrc&lt;br /&gt;
Daca ~/.bash_profile nu exista shell-ul cauta ~/.bash_login. Daca nici aceasta nu exista cauta ~/.profile.&lt;br /&gt;
In aceste fisiere speciale de initializare se seteaza: PS1, TMOUT, PATH, alias, umask etc pentru fiecare utilizator&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Fisierele de initializare pentru fiecare utilizator se gasesc in home directory al acestuia (~) si sunt ascunse fiindca incep cu .(punct). Pentru vizualizarea lor se foloseste comanda ls cu optiunea -a Exemplu: ls -la ~&lt;br /&gt;
&lt;br /&gt;
In functie de distributia de Linux numele si ordinea de citire a fisierelor de customizare a mediului de lucru pentru fiecare user poate sa difere. Totusi, pe marea majoritate a distributiilor de Linux (RedHat, Fedora, CentOS, Suse, Ubuntu, Kubuntu, Debian) exista ~/.bashrc. In acest caz se recomanda folosirea doar a acestuia&lt;br /&gt;
&lt;br /&gt;
Exemplu ~/.bashrc:&lt;br /&gt;
&lt;br /&gt;
 # User specific aliases and functions &lt;br /&gt;
 alias rm=&#039;rm -i&#039; &lt;br /&gt;
 alias cp=&#039;cp -i&#039; &lt;br /&gt;
 alias mv=&#039;mv -i&#039; &lt;br /&gt;
 alias cauta=find &lt;br /&gt;
 alias muta=mv &lt;br /&gt;
 alias S=&#039;ssh -l root -p 7890 ssh.crystalmind.ro&#039; &lt;br /&gt;
 # Source global definitions &lt;br /&gt;
 if [ -f /etc/bashrc ]; then &lt;br /&gt;
   . /etc/bashrc &lt;br /&gt;
 fi &lt;br /&gt;
 export PS1=&#039;[\u@\h \w]$&#039; &lt;br /&gt;
 export PATH=:/home/gabriel/scripts &lt;br /&gt;
 umask=0022&lt;br /&gt;
&lt;br /&gt;
==1.5 Flow Control==&lt;br /&gt;
===Conditii de testare===&lt;br /&gt;
Nota&lt;br /&gt;
Informatiile din acesta pagina au scopul de referinta pentru testele folosite de structurile de control ce urmeaza a fi prezentate. Ele nu trebuie invatate la acest moment in afara conextului de flow control ci doar impreuna cu structurile if..then..else, while, case etc&lt;br /&gt;
&lt;br /&gt;
Structurile de control (if..then..else, while etc) presupun conditii de testare.&lt;br /&gt;
&lt;br /&gt;
Acestea sunt:&lt;br /&gt;
 1. Pentru fisiere&lt;br /&gt;
 -e = fisierul exista&lt;br /&gt;
 -f = fisierul exista si este de tipul regular file&lt;br /&gt;
 Exemplu: -f $FILE&lt;br /&gt;
 -s = fisierul nu are dimensiunea zero&lt;br /&gt;
 -d = fisierul exista si este de tip director&lt;br /&gt;
 -c = fisierul exista si este de tip char device&lt;br /&gt;
 -b = fisierul exista si este de tip block device&lt;br /&gt;
 -r = fisierul exista si are permisiunea read&lt;br /&gt;
 -w = fisierul exista si are permisiunea write&lt;br /&gt;
 -x = fisierul exista si are permisiunea execute&lt;br /&gt;
 -g = fisierul are GUID setat&lt;br /&gt;
 -u = fisierul are SUID setat&lt;br /&gt;
 -k = fisierul are sticky bit setat&lt;br /&gt;
 -nt = fisierul este mai nou decat un alt fisier&lt;br /&gt;
 Exemplu: file1 -nt file = file1 is newer than file2&lt;br /&gt;
 ! -&amp;gt; inverseaza sensul (neaga)&lt;br /&gt;
&lt;br /&gt;
2. Pentru comparatie&lt;br /&gt;
 -eq = equal to&lt;br /&gt;
 -ne = not equal to&lt;br /&gt;
 -gt = greater than&lt;br /&gt;
 Exemplu: $i -gt -$j&lt;br /&gt;
 -ge = greater than or equal&lt;br /&gt;
 -lt = less than&lt;br /&gt;
 -le = less than or egal&lt;br /&gt;
&lt;br /&gt;
3. Pentru stringuri (siruri de caractere)&lt;br /&gt;
 -z = lungimea sirului este zero&lt;br /&gt;
 -n = lungimea sirului este non-zero&lt;br /&gt;
 = egal (comparativ cu alte limbaje de programare operatorul de comparatie este un singur egal) != diferit&lt;br /&gt;
 Exemplu: $str1 != $str2&lt;br /&gt;
 -a = SI LOGIC (AND)&lt;br /&gt;
 -o = SAU LOGIC (OR)&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Testul este adevarat daca ambele conditii sunt adevarate simultan (valoarea variabilei USER este root si valoarea variabilei SHELL este bash)&lt;br /&gt;
 $USER = &amp;quot;root&amp;quot; -a $SHELL = &amp;quot;bash&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In cazul comparatiei a doua stringuri din punct de vedere al sintaxei bash este obligatoriu un spatiu inainte de = (egal) si un spatiu dupa = (egal).&lt;br /&gt;
 Exemplu: $USER=&amp;quot;root&amp;quot; este gresit, $USER = &amp;quot;root&amp;quot; este corect.&lt;br /&gt;
&lt;br /&gt;
2. Testul este adevarat daca una dintre conditii este adevarata(i mai mic ca 10 SAU i mai mare ca 100) $i -lt 10 -o $i gt 100&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Contiditiile de testare prezentate mai sus sunt doar cele mai folosite. Pentru lista completa executati: &lt;br /&gt;
  man test &lt;br /&gt;
  test EXPR &#039;&#039;sau&#039;&#039; [ EXPR ] #au acelasi rezultat.&lt;br /&gt;
&lt;br /&gt;
===If..then..else===&lt;br /&gt;
Cea mai simpla constructie de flow control este cea conditionala reprezentata de if.&lt;br /&gt;
In functie de o valoarea de adevar a unei conditii se stabilesc instructiunile ce trebuie executate. Conditiile de test se refera la proprietati ale fisierelor, comparatii numerice sau sunt referitoare la stringuri.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if este:&lt;br /&gt;
 if [ conditie_de_test ] then lista_de_instructiuni fi&lt;br /&gt;
Daca conditia de test este adevarata se executa lista de instructiuni, altfel aceasta nu se executa.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Daca primul argument al scriptului este fisier se executa: cat fisier&lt;br /&gt;
 if [ -f $1 ] then cat $1 fi&lt;br /&gt;
&lt;br /&gt;
2. Daca valoarea variabilei i este 10 se afiseaza mesajul &amp;quot;Variabila i are valoarea 10&amp;quot; if [ $i -eq 10 ] then echo &amp;quot;Variabila i are valoarea 10&amp;quot; fi&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if..else este:&lt;br /&gt;
 if [ conditie_de_test ] then lista_de_instructiuni else lista_de_instructiuni_default fi&lt;br /&gt;
&lt;br /&gt;
Data conditia de test este adevarata se executa lista_de_instructiuni, altfel se executa lista_de_instructiuni_default&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Daca valoarea variabilei VARSTA citita de la tastatura este mai mica decat 18 se afiseaza mesajul &amp;quot;Esti minor!&amp;quot;, altfel se afiseaza mesajul &amp;quot;Esti major!&amp;quot;&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 echo &amp;quot;Introdu varsta:&amp;quot; &lt;br /&gt;
 read VARSTA &lt;br /&gt;
 if [ $VARSTA -lt 18 ]; then&lt;br /&gt;
   echo &amp;quot;Esti minor!&amp;quot; &lt;br /&gt;
 else &lt;br /&gt;
   echo &amp;quot;Esti major!&amp;quot; &lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if..elif..else este:&lt;br /&gt;
&lt;br /&gt;
 if [ conditie_de_test1 ]; then&lt;br /&gt;
   &#039;&#039;lista_de_instructiuni_1&#039;&#039; &lt;br /&gt;
 elif [ conditie_de_test2 ]; then&lt;br /&gt;
   &#039;&#039;lista_de_instructiuni_2&#039;&#039; &lt;br /&gt;
 elif [ conditie_de_test3 ]; then&lt;br /&gt;
   &#039;&#039;lista_de_instructiuni_3&#039;&#039; &lt;br /&gt;
 else&lt;br /&gt;
   &#039;&#039;lista_de_instructiuni_default&#039;&#039;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplu:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 Daca variabila ORA citita de la tastatura este mai mica decat 12 se afiseaza mesajul &amp;quot;Buna dimineata&amp;quot;, daca este intre 12 si 18 se afiseaza mesajul &amp;quot;Buna ziua&amp;quot;, daca este intre 18 si 24 se afiseaza &amp;quot;Noapte Buna!&amp;quot;. Pentru orice alta situatie se afiseaza mesajul &amp;quot;Eroare!&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 read i &lt;br /&gt;
 if [ $i -lt 12 ]; then&lt;br /&gt;
   echo &amp;quot;Buna dimineata!&amp;quot; &lt;br /&gt;
 elif [ $i -ge 12 -a $i -lt 18 ]; then &lt;br /&gt;
   echo &amp;quot;Buna ziua!&amp;quot; &lt;br /&gt;
 elif [ $i -ge 18 -a $i -le 24 ]; then &lt;br /&gt;
   echo &amp;quot;Noapte buna !&amp;quot; &lt;br /&gt;
 else &lt;br /&gt;
   echo &amp;quot;Eroare!&amp;quot; &lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
-a reprezinta SI LOGIC (AND). Testul este adevarat daca ambele conditii sunt adevarate simultan.&lt;br /&gt;
&lt;br /&gt;
-o reprezinta SAU LOGIC (OR). Testul este adevarat daca una dintre contitii este adevarata.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplu&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Testul este adevarat daca ambele conditii sunt adevarate (primul parametru este fisier si exista si are si permisiunea de read). Ambele conditii sunt adevarate simultan.&lt;br /&gt;
 if [ -e $1 -a -r ]&lt;br /&gt;
&lt;br /&gt;
2. Testul este adevarat daca primul parametru primit de script este fisier SAU acesta este director. Una dintre conditii este adevarata.&lt;br /&gt;
 if [ -f $1 -o -d $1 ]&lt;br /&gt;
&lt;br /&gt;
===For===&lt;br /&gt;
For se foloseste pentru a executa o sectiune de cod de un numar repetat de ori&lt;br /&gt;
(ciclu). Varianta clasica de for din Bash este diferita de cea din alte limbaje de programare.&lt;br /&gt;
Sintaxa pentru for este:&lt;br /&gt;
for VAR in lista_de_valori do instructiuni done&lt;br /&gt;
Se executa instructiunile specificate de atatea ori cate valori avem in lista. Pentru fiecare iteratie variabila VAR ia o valoare din lista_de_valori. Separatorul pentru valorile din lista este default spatiu sau valoarea variabilei globale IFS.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Script care exemplifica ciclul de tip for prin trimiterea unui pachet ping la fiecare din cele 3 IP-uri.&lt;br /&gt;
&lt;br /&gt;
Instructiunile dintre do si done se executa de atatea ori cate valori avem in lista (3 valori).&lt;br /&gt;
&lt;br /&gt;
Pentru fiecare ciclu valoarea variabilei IP este o valoare din lista. Valorile din lista sunt separate prin spatiu.&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 for IP in 192.168.0.1 192.168.0.2 192.168.0.3; do&lt;br /&gt;
   ping -c 1 $IP &lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
2. Exemplu for modificand valoara variabilei IFS care este separatorul valorilor.&lt;br /&gt;
 #!/bin/bash #Acest script afiseaza fiecare director din $PATH pe cate un rand &lt;br /&gt;
 IFS=: for DIR in $PATH; do&lt;br /&gt;
   echo $DIR &lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
In Bash exista si structura de tip for ca in C/C++. Aceasta este insa mai putin folosita.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
&lt;br /&gt;
 for ca in C/C++:&lt;br /&gt;
   LIMIT=10 &lt;br /&gt;
   for((a=0;a&amp;lt;=$LIMIT;a++)); do &lt;br /&gt;
     echo $a &lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
===While===&lt;br /&gt;
Structura de tip while se foloseste pentru a executa o serie de instructiuni (cele&lt;br /&gt;
dintre do si done) atata timp cat conditia de test este adevarata.&lt;br /&gt;
&lt;br /&gt;
while [ conditie_de_test ] do lista_de_instructiuni done&lt;br /&gt;
&lt;br /&gt;
Exemplu while:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 #script care afiseaza numerele intre 0 zi 100&lt;br /&gt;
 LIMIT=100&lt;br /&gt;
 i=0&lt;br /&gt;
 while [ $i –le $LIMIT ]&lt;br /&gt;
 do&lt;br /&gt;
 echo &amp;quot;i=$i&amp;quot;&lt;br /&gt;
 let i=i+1&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Case===&lt;br /&gt;
Structura de tip case se foloseste pentru a executa o serie de instructiuni in functie de diferite conditii de testare.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru case este:&lt;br /&gt;
&lt;br /&gt;
 case VARIABILA in&lt;br /&gt;
 valoare1)&lt;br /&gt;
 instructiuni1&lt;br /&gt;
 ;;&lt;br /&gt;
 valoare2)&lt;br /&gt;
 instructiuni&lt;br /&gt;
 ;;&lt;br /&gt;
 *)&lt;br /&gt;
 instructiuni_default&lt;br /&gt;
 ;;&lt;br /&gt;
 esac&lt;br /&gt;
 * -&amp;gt; reprezinta instructiunile ce se vor executa default daca variabila nu are niciuna dintre valorile de mai sus.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 echo &amp;quot;Introdu nr:&amp;quot; &lt;br /&gt;
 read nr &lt;br /&gt;
 case $nr in &lt;br /&gt;
   1) echo &amp;quot;nr este 1&amp;quot; &lt;br /&gt;
   ;; &lt;br /&gt;
   2) echo &amp;quot;nr este2&amp;quot; &lt;br /&gt;
   ;; &lt;br /&gt;
   *) echo &amp;quot;nr are alta valoare&amp;quot; &lt;br /&gt;
   ;; &lt;br /&gt;
  esac&lt;br /&gt;
&lt;br /&gt;
Structura de tip case poate fi oricand inlocuita cu o structura de tip if..elif..else&lt;br /&gt;
&lt;br /&gt;
Exemplul de mai sus folosind if..elif..else este:&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 echo &amp;quot;Introdu nr:&amp;quot;&lt;br /&gt;
 read nr&lt;br /&gt;
 if [ $nr -eq 1 ]; then &lt;br /&gt;
   echo &amp;quot;nr este 1&amp;quot;&lt;br /&gt;
 elif [ $nr -eq 2 ]&lt;br /&gt;
 then&lt;br /&gt;
   echo &amp;quot;nr este 2&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
   echo &amp;quot;nr este altceva&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Structura de tip &#039;&#039;case&#039;&#039; este valoroasa si trebuie inteleasa bine. Toate scripturile de initializare a serviciilor (cele din /etc/init.d ) folosesc o structura de tip &#039;&#039;case&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Structura unui script de initializare din /etc/init.d este:&lt;br /&gt;
&lt;br /&gt;
 case $1 in&lt;br /&gt;
   start) &#039;&#039;instructiuni de pornire serviciu&#039;&#039;&lt;br /&gt;
   ;;&lt;br /&gt;
   stop) &#039;&#039;instuctiuni de oprire serviciu&#039;&#039;&lt;br /&gt;
   ;;&lt;br /&gt;
   restart) &#039;&#039;instructiuni de restartare serviciu&#039;&#039;&lt;br /&gt;
   ;;&lt;br /&gt;
   *) &#039;&#039;afisare help script&#039;&#039; &lt;br /&gt;
 esac&lt;br /&gt;
&lt;br /&gt;
$1 reprezinta primul parametru al scriptului si poate fi start, stop sau restart.&lt;br /&gt;
&lt;br /&gt;
Exemplu: Pentru restartarea retelei se foloseste: &#039;&#039;&#039;/etc/init.d/network restart&#039;&#039;&#039;, unde &#039;&#039;network&#039;&#039; este scriptul de initializare iar &#039;&#039;restart&#039;&#039; primul parametru/argument/flag pe care-l primeste.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
&lt;br /&gt;
Presupunem ca am compilat si instalat serverul Apache in directorul /opt/apache.&lt;br /&gt;
&lt;br /&gt;
Daemonul http se porneste ruland comanda: /opt/apache/bin/apachectl start, se opreste cu /opt/apache/bin/apachectl stop si se restarteaza cu /opt/apache/bin/apachectl restart. Se doreste pornirea serverului la butarea sistemului, mai exact la intrarea in runlevel 3.&lt;br /&gt;
&lt;br /&gt;
Etape:&lt;br /&gt;
1. Se creaza un script in /etc/init.d. Numele poate fi ales aleator, in exemplul nostru acesta se numeste init_apache&lt;br /&gt;
2. Se creaza un symlink catre /etc/init.d/init_apache in /etc/init.d/rc3.d numit S99Apache. Numele symlinkului este important sa inceapa cu litera S urmata de un umar intre 0 si 99.&lt;br /&gt;
&lt;br /&gt;
La intrarea in runlevel 3 se va rula automat acest script cu parametrul start.&lt;br /&gt;
Structura scriptului /etc/init.d/init_apache este:&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 case $1 in&lt;br /&gt;
 start)&lt;br /&gt;
 echo &amp;quot;Starting Apache...&amp;quot; /opt/apache/bin/apachectl start echo &amp;quot;OK&amp;quot;&lt;br /&gt;
 ;;&lt;br /&gt;
 stop) echo &amp;quot;Shutting down Apache...&amp;quot; /opt/apache/bin/apachectl stop echo &amp;quot;OK&amp;quot;&lt;br /&gt;
 ;;&lt;br /&gt;
 restart) $0 stop $0 start&lt;br /&gt;
 ;;&lt;br /&gt;
 *) echo &amp;quot;init_apache &amp;lt;start|stop|restart&amp;gt;&amp;quot;&lt;br /&gt;
 esac&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pentru detalii complete despre modul de pornire a serviciilor la butare cititi capitolul &amp;quot;Managementul Serviciilor&amp;quot; din cursul &amp;quot;Linux Basic Administration (Essentials)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Select===&lt;br /&gt;
Structura de tip select este specifica doar Bash-ului si se foloseste pentru crearea de meniuri.&lt;br /&gt;
&lt;br /&gt;
Sintaxa acesteia este:&lt;br /&gt;
 select MENUITEM in menu_list&lt;br /&gt;
 do&lt;br /&gt;
 lista_de_comenzi&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
Detalii:&lt;br /&gt;
- menu_list este lista de meniuri. Valorile din lista sunt separate prin spatiu;&lt;br /&gt;
- intre do si done sunt instruciunile ce se executa in functie de meniul ales;&lt;br /&gt;
- intre do si done avem acces la urmatoarele 2 variabile: MENUITEM care contine meniul&lt;br /&gt;
&lt;br /&gt;
selectat si REPLY care se creaza automat si contine inputul userului (ce a scris acesta la consola);&lt;br /&gt;
&lt;br /&gt;
- PS3 contine prompterul de selectare a meniurilor;&lt;br /&gt;
- userul alege un meniu din lista folosind un nr. de ordine: alege 1 pentru primul meniu, 2 pentru al doilea etc;&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 PS3=&amp;quot;Alege:&amp;quot;&lt;br /&gt;
 select ITEM in &amp;quot;Afiseaza continut /etc&amp;quot; &amp;quot;Afiseaza spatiu liber&amp;quot; &amp;quot;Exit&amp;quot;&lt;br /&gt;
 do&lt;br /&gt;
 case $REPLY in&lt;br /&gt;
 1) ls -l /etc&lt;br /&gt;
 ;;&lt;br /&gt;
 2) df -h&lt;br /&gt;
 ;;&lt;br /&gt;
 3) exit 0&lt;br /&gt;
 ;;&lt;br /&gt;
 *) echo &amp;quot;Optiune incorecta&amp;quot;&lt;br /&gt;
 esac&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
==1.6 Substituirea comenzilor==&lt;br /&gt;
&lt;br /&gt;
Unei variabile i se poate asigna o valoare in 2 moduri:&lt;br /&gt;
&lt;br /&gt;
1. Folosind NUME_VAR=valoare&lt;br /&gt;
&lt;br /&gt;
Exemplu: &lt;br /&gt;
  &lt;br /&gt;
  EDITOR=&amp;quot;VIM&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Substituind o comanda cu outputul ei&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
  &lt;br /&gt;
  VAR=`ls /etc` -&amp;gt; in acest exemplu comanda ls /etc se substituie sau inlocuieste cu outputul ei care se asigneaza variabilei VAR. Variabila VAR va contine outputul comenzii ls -l.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Substituirea unei comenzi cu outputul ei reprezinta unul dintre caracteristicile cele mai puternice ale Bash-ului, iar majoritatea scripturilor folosesc acest mod de lucru.&lt;br /&gt;
&lt;br /&gt;
Pentru a substitui o comanda cu outputul ei exista 2 variante:&lt;br /&gt;
&lt;br /&gt;
1. Comanda sa incadreza in backquotes ( ``). Atentie, backquotes nu sunt apostroafe sau ghilimele simple.&lt;br /&gt;
&lt;br /&gt;
Exemplu: &lt;br /&gt;
 ME=`whoami ` -&amp;gt; variabila ME va contine outputul comenzii whoami (atentie! nu exista spatii in jurul semnului = (stanga/dreapta)&lt;br /&gt;
&lt;br /&gt;
2. Comanda se incadreza intre $( si )&lt;br /&gt;
&lt;br /&gt;
Exemplu: &lt;br /&gt;
  ETH0= $(ifconfig eth0) -&amp;gt; variabila numita ETH0 va contine outputul comenzii &#039;&#039;&#039;ifconfig eth0&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Exemplu script ce nu poate fi rulat de catre root&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 &lt;br /&gt;
 if [ &amp;quot;$(whoami)&amp;quot; = &amp;quot;root&amp;quot; ]&lt;br /&gt;
 then&lt;br /&gt;
   echo &amp;quot;Esti root, sorry !&amp;quot;&lt;br /&gt;
   exit 1;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
#incep instructiunile ce nu pot fi rulate de catre root&amp;quot;&lt;br /&gt;
 ls -la ~&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In momentul in care o variabila de tip string este testat folosind un test pentru stringuri este bine ca aceasta sa fie incadrata intre ghilimele duble pentru a forta tipul ei catre string.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
&lt;br /&gt;
  VAR=&amp;quot;`ifconfig eth0`&amp;quot; &lt;br /&gt;
  if [ -z &amp;quot;$VAR&amp;quot; ]; then &lt;br /&gt;
   echo &amp;quot;Interfata eth0 nu exista!&amp;quot; &lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
== 1.7 Subshells==&lt;br /&gt;
&lt;br /&gt;
Utilizarea subshell-urilor în Bash poate fi avantajoasă din mai multe motive, inclusiv:&lt;br /&gt;
&lt;br /&gt;
 1. Izolarea comenzilor: comenzile executate într -un subshell sunt izolate de cochilie părinte. Aceasta înseamnă că orice modificări aduse la variabile, directoare sau alte setări de mediu din subshell nu vor afecta shell-ul părinte.&lt;br /&gt;
&lt;br /&gt;
 2. Scoping: Variabilele definite într -un subshell au un domeniu local și nu vor afecta variabile cu același nume în shell-ul părinte.&lt;br /&gt;
&lt;br /&gt;
 3. Manevrarea erorilor: subshell -urile pot fi utilizate pentru o mai bună gestionare a erorilor. De exemplu, puteți executa o serie de comenzi într-un subshell și puteți verifica starea de returnare a acesteia fără a afecta fluxul principal al scriptului dvs.&lt;br /&gt;
&lt;br /&gt;
Iată câteva exemple de utilizare a subshell-urilor în Bash:&lt;br /&gt;
&lt;br /&gt;
Schimbarea directorului temporar:&lt;br /&gt;
&lt;br /&gt;
Aceasta schimbă temporar directorul în/calea/în/director, execută comanda &#039;&#039;ls&#039;&#039;, apoi se întoarce în directorul original. Schimbarea directorului afectează doar subshell-ul.&lt;br /&gt;
&lt;br /&gt;
-Execuție paralelă:&lt;br /&gt;
&lt;br /&gt;
Aceasta execută mai multe comenzi concomitent în subshell-uri, permițându-le să funcționeze în paralel.&lt;br /&gt;
&lt;br /&gt;
-Manevrarea erorilor:&lt;br /&gt;
&lt;br /&gt;
Aceasta execută comanda1 și comanda2 într -un subshell. Dacă Command1 sau Command2 eșuează (returnează un statut de ieșire non-zero), atunci este ecou „eroare”.&lt;br /&gt;
&lt;br /&gt;
-Setări temporare ale mediului:&lt;br /&gt;
&lt;br /&gt;
Aceasta stabilește o variabilă de mediu temporară la valoare pentru durata comenzii. Odată ce comanda se termină, variabila revine la valoarea sa anterioară (sau este nesetată dacă nu exista înainte).&lt;br /&gt;
&lt;br /&gt;
Subshell-urile sunt versatile și pot fi utilizate creativ pentru a atinge diverse obiective de script, menținând controlul asupra mediului și fluxului de execuție al comenzilor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;In incheierea cursului Linux Essentials:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La ce pot fi folosite parantezele ( ) in bash?&lt;br /&gt;
&lt;br /&gt;
Utilizari comune&lt;br /&gt;
    1. Substitutia comenzii:&lt;br /&gt;
        ◦ $(command) or `command`: Executa comanda si ii substituie iesirea.&lt;br /&gt;
        ◦ Example: echo $(date) or echo \date``&lt;br /&gt;
    2. Expansie aritmetica:&lt;br /&gt;
        ◦ (( expression )): Performa operatuni aritmetice si le evalueaza expresia.&lt;br /&gt;
        ◦ Example: (( x = 5 + 3 ))&lt;br /&gt;
    3. Crearea unui subshell:&lt;br /&gt;
        ◦ ( commands ): Execute comenzi intr-un subshell, izolandu-i mediul de cea principala.&lt;br /&gt;
        ◦ Example: (cd /path/to/directory &amp;amp;&amp;amp; ls)&lt;br /&gt;
    4. Declararea unei functii:&lt;br /&gt;
        ◦ function_name () { commands; }: Declara o functie.&lt;br /&gt;
    5. Gruparea comenzilor:&lt;br /&gt;
        ◦ { commands; }: Grupeaza mai multe comenzi impreuna, permitandu-le sa ruleze ca si o singura comanda.&lt;br /&gt;
        ◦ Example: { echo &amp;quot;Hello&amp;quot;; echo &amp;quot;World&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Essentials_Pagina_7|Pagina anterioară]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Essentials_Pagina_8&amp;diff=549</id>
		<title>Essentials Pagina 8</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Essentials_Pagina_8&amp;diff=549"/>
		<updated>2025-04-11T08:18:30Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* For */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Laborator 8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Shell Scripts=&lt;br /&gt;
&lt;br /&gt;
==1.1 Introducere in Bash==&lt;br /&gt;
Shellul este interpretorul de comenzi. Acesta parseaza comenzile introduse de&lt;br /&gt;
utilizator, le verifica din punct de vedere al sintaxei si le trimite kernel-ului spre executie.&lt;br /&gt;
&lt;br /&gt;
Exista mai multe shelluri (Bourne, C Shell, recent aparute Zsh si Fish, etc), dar default pe Linux este shellul numit Bash (Bourne Again Shell). Acesta este reprezentat de fisierul &#039;&#039;/bin/bash&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Pe langa interpretarea si executia comenzilor, Bash-ul ofera si alte facilitati printre&lt;br /&gt;
care: editarea liniei de comanda, history, alias-uri, dar si un limbaj de programare structurat propriu.&lt;br /&gt;
&lt;br /&gt;
Un script de shell este un fisier text (ASCII) care contine comenzi de shell organizate intr-un mod logic. Pe langa comenzi, script-ul mai contine si variabile (locale sau globale), parametri pozitionali precum si structuri de programare specifice (if..then..else, while, do, until, for, case, selsect etc). Un script este folosit pentru a imbina comenzi si diverse structuri de control pentru a oferi o noua functionalitate sau a automatiza task-uri.&lt;br /&gt;
&lt;br /&gt;
Etapele crearii unui script sunt:&lt;br /&gt;
&lt;br /&gt;
a) crearea unui fisier text folosind editorul preferat (Exemplu: vim)&lt;br /&gt;
b) editarea fisierului pentru a contine functionalitatea dorita&lt;br /&gt;
c) testarea scriptului adica executia/rularea acestuia&lt;br /&gt;
&lt;br /&gt;
Modul de executie a unui script numit script1:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Din directorul care contine scriptul se ruleaza : ./script1&lt;br /&gt;
Fisierul script1 trebuie sa aiba dreptul de executie. Fiindca directorul curent (.) nu&lt;br /&gt;
se afla in $PATH (altfel grave probleme de securitate), scriptul trebuie sa fie executat cu calea absoluta sau cu ./nume_script In acest caz se porneste un shell nou ca sub proces al shellului curent in care se executa comenzile din script.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Din directorul care contine fisierul script1 se ruleaza: . script1 sau source script1.&lt;br /&gt;
Se executa comenzile din script1 in shell-ul curent. Fisierul script1 nu trebuie sa&lt;br /&gt;
aiba dreptul de executie. Una dintre diferentele dintre prima si a doua varianta este ca variabilele exportate sau globale sunt vizibile in shell-ul curent in varianta a doua, dar nu si in prima varianta.&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Varianta cea mai folosita de executie a unui script este prima: ./script&lt;br /&gt;
Un script trebuie sa contina pe prima linie o referire la programul cu care se executa (Bash, Perl, PHP, Python etc). Astfel prima linie a unui script Bash este invariabil: #!/bin/bash. In interiorul scriptului #(diez) reprezinta un comentariu. Exceptie face prima linie.&lt;br /&gt;
&lt;br /&gt;
echo se foloseste pentru afisa un string (sir de caractere) sau o variabila la consola.&lt;br /&gt;
Exemplu: echo &amp;quot;Linux&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Script care afiseaza mesajul: Acesta este primul exemplu !&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 echo &amp;quot;Acesta este primul exemplu !&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Script care creaza un fiser numit continut_etc.txt in directorul curent ce contine fisierele si directoarele din directorul /etc, iar apoi afiseaza spatiul total, ocupat si liber de pe fiecare partitie de pe Hard Disk.&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 ls -l /etc &amp;gt; continut_etc.txt&lt;br /&gt;
 echo &amp;quot;Fisierul continut_etc.txt a fost creat in directorul curent!&amp;quot;&lt;br /&gt;
 echo &amp;quot;Informatii partitii:&amp;quot;&lt;br /&gt;
 df -h Important&lt;br /&gt;
&lt;br /&gt;
O cunoastere acceptabila a modului de creare de scripturi este esentiala pentru orice Administrator de sistem. In cazul persoanelor incepatoare care nu au experienta in programare (orice limbaj) procesul de scripting pare la prima vedere extrem de complicat.&lt;br /&gt;
&lt;br /&gt;
Este nevoie de multe exercitii si exemple pentru o intelegere aprofundata. Intotdeauna se incepe cu exercitii simple si anume scripturi formate din cateva randuri.&lt;br /&gt;
&lt;br /&gt;
==1.2 Variabile, constante si functii==&lt;br /&gt;
&lt;br /&gt;
Prezentare generala:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; O variabila reprezinta un nume pentru o locatie de memorie unde se gaseste o valoare. Se obisnuieste (nu este obligatoriu) ca variabilele sa se scrie cu litera mare.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Comparativ cu alte limbaje de programare (C/C++, JAVA) variabilele in Bash nu au tip. Ele sunt string-uri, dar in functie de context pot fi evaluate ca integer etc.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; O variabila se declara: NUME_VAR=valoare&lt;br /&gt;
&lt;br /&gt;
Important&lt;br /&gt;
Nu se foloseste spatiu intre NUME_VAR si valoare. i = 1 reprezinta eroare. Sintaxa bash - ului este extrem de stricta. Un spatiu in plus sau in minus reprezinta o eroare fatala.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 NUME=&amp;quot;dan&amp;quot;&lt;br /&gt;
 varsta=20&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4&#039;&#039;&#039;. Pentru a ne referi la continutul unei varibile se foloseste semnul $ (dollar) in fata numelui variabilei.&lt;br /&gt;
Exemplu: echo $varsta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5&#039;&#039;&#039;. Variabilele pot fi locale sau globale. Cele locale sunt vizibile doar in shell-ul curent, iar cele globale sunt vizibile in shell-ul curent si in toate subprocesele shell-ului curent. Astfel in interiorul unui script daca se foloseste o variabila globala aceasta va fi accesibila oricarei comenzi/program lansata din acel script. Variabilele globale nu sunt accesibile parintelui unui proces, adica shell-ului de unde s-a executat scriptul. Exceptie face varianta 2 de executie a unui script adica folosind source nume_script&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6&#039;&#039;&#039;. Pentru a declara o variabila globala aceasta trebuie exportata. Se foloseste cuvantul cheie export&lt;br /&gt;
&lt;br /&gt;
 Exemplu: export VARSTA=20&lt;br /&gt;
 variabilele globale se numesc de environment;&lt;br /&gt;
 pentru a vizualiza variabilele locale se foloseste comanda set;&lt;br /&gt;
 pentru a vizualiza variabilele globale se foloseste comanda env;&lt;br /&gt;
 pentru sterge o variabila se foloseste comanda unset NUME_VAR;&lt;br /&gt;
&lt;br /&gt;
Exemplu de varibile globale predefinite:&lt;br /&gt;
 PATH -&amp;gt; contine o lista de directoare in care shell-ul cauta comanda care se executa.&lt;br /&gt;
&lt;br /&gt;
Pentru a concatena un string la variabila PATH se foloseste caracterul : (doua puncte).&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&lt;br /&gt;
Daca dorim sa adaugam directorul /home/dan/scripts in PATH: export&lt;br /&gt;
 PATH=PATH:/home/stud/scripts&lt;br /&gt;
&lt;br /&gt;
Dupa aceasta scripturi si comenzi din /home/stud/scripts pot fi rulate in orice director ne am afla doar prin numele lor. Altfel trebuie folosita calea absoluta sau aflandu-ne in&lt;br /&gt;
director se executa: ./nume_comanda&lt;br /&gt;
 HOSTNAME -&amp;gt; contine hostname-ul calculatorului&lt;br /&gt;
 SHELL -&amp;gt; contine shell-ul default&lt;br /&gt;
 HISTSIZE - contine nr. de comenzi care vor fi memorate in history&lt;br /&gt;
 USER -&amp;gt; contine EUID&lt;br /&gt;
 PWD -&amp;gt; contine directorul curent&lt;br /&gt;
 OLDPWD -&amp;gt; contine directorul precedent si se foloseste de comanda: cd –&lt;br /&gt;
 HOME -&amp;gt; contine home directory al EUID&lt;br /&gt;
 RANDOM -&amp;gt; variabila al carei continut este pseudoaleator&lt;br /&gt;
 TMOUT -&amp;gt; nr in secunde dupa care se face logout automat daca nu se executa nicio comanda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7&#039;&#039;&#039;. Diferenta dintre ghilimele simple(apostrof) si ghilimele duble este aceea ca ghilimele simple nu interpreteaza $ ca si caracter special. In interiorul ghilimelelor simple fiecare caracter special cu exceptia &#039; (ghilimea simpla) este interpretat literal.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 varsta=20 echo &amp;quot;$varsta&amp;quot; ##se afiseaza 20 echo &#039;$varsta&#039; ##se afiseaza $varsta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8&#039;&#039;&#039;. O variabila poate fi declarata read-only sau de tip array. O variabila read-only se mai numeste si constanta.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 &#039;&#039;&#039;1.&#039;&#039;&#039; var1 este readonly. Aceasta nu poate fi modificata sau stearsa folosind unset.&lt;br /&gt;
 declare -r var1=7&lt;br /&gt;
 &#039;&#039;&#039;2.&#039;&#039;&#039; Pentru a declara un array/vector:&lt;br /&gt;
 ARRAY=(unu doi trei) echo ${ARRAY[*]} echo ${ARRAY[1]} i=2 echo&lt;br /&gt;
 ${ARRAY[]} unset ARRAY[1] unset ARRAY&lt;br /&gt;
 ARRAY nu este cuvant cheie. In loc de ARRAY poate fi orice cuvant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;9&#039;&#039;&#039;. Pentru a citi o variabila de la tastatura se foloseste cuvantul cheie read&lt;br /&gt;
Exemplu:&lt;br /&gt;
 #!/bin/bash echo &amp;quot;Introdu nume fisier:&amp;quot; read FILE echo &amp;quot;Fisierul introdus este $FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10&#039;&#039;&#039;. In bash exista caractere speciale care sunt interpretate in mod deosebit.&lt;br /&gt;
 Exemple: $ (dollar), &amp;quot;(ghilimea dubla) sau \ (backslash). Pentru a anula efectul special al&lt;br /&gt;
caracterului, acesta se precede cu \ (backslash).&lt;br /&gt;
&lt;br /&gt;
 Exemplu: echo \$var -&amp;gt; Afiseaza $var. $ nu mai este caracter special.&lt;br /&gt;
&lt;br /&gt;
==1.3 Parametri pozitionali==&lt;br /&gt;
Bash-ul foloseste parametri speciali la care ne putem referi in interiorul unui script&lt;br /&gt;
pentru a avea acces la anumite valori. Acesti parametri speciali se pot folosi ca si&lt;br /&gt;
variabilele, doar ca exista default si nu trebuie creati. Continutul acestora este de asemenea standard.&lt;br /&gt;
&lt;br /&gt;
Acestia sunt:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; $0 - contine numele scriptului&lt;br /&gt;
Scriptul poate actiona diferit in functie de numele cu care a fost rulat ( Exemplu:&lt;br /&gt;
daca se ruleaza folosind un simlink al scriptului. Vezi comanda /bin/egrep care este un simlink catre /bin/grep dar are totusi functionalitate diferita).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; $1 - reprezinta primul argument al scriptului, $2 al doilea argument al scriptului etc. Incepand cu argumentul 10 acesta trebuie incadrat intre acolade ${10}, ${11} etc.&lt;br /&gt;
Se folosesc pentru a evita erori in momentul in care scriptul este rulat fara argumente sau cu un alt nr. de argumente (iar acesta asteapta sa primeasca argumente).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; $? - reprezinta statusul ultimei comenzi executate.&lt;br /&gt;
In Bash Zero este statusul pentru non-error iar diferit de zero este statusul pentru eroare. Orice comanda/program are un status de exit, zero sau non-zero. Se foloseste pentru a continua executia scriptului (sau a modifica comportamentul acestuia) in functie de statusul comenzilor anterioare.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; $# - reprezinta nr. de argumente ale scriptului Se poate lua o decizie in functie de nr. de argumente cu care a fost rulat scriptul.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.&#039;&#039;&#039; $* - reprezinta toate argumentele date scriptului.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.&#039;&#039;&#039; $$ - reprezinta PID shell.&lt;br /&gt;
Astel in functie de cum rulam scriptul $$ are alta valoare:source f1 - $$ reprezinta PID bash (shell curent) ./f1 - $$ reprezinta PID noului sub-shell creat in care se executa comenzile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.&#039;&#039;&#039; $! - reprezinta PID ultimului proces executat in background.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Script care sterge fisierul sau directorul pe care-l primeste ca argument&lt;br /&gt;
 #!/bin/bash rm -rf $1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Afisarea numelui scriptului&lt;br /&gt;
 #!/bin/bash Echo &amp;quot;Numele scriptului executat este: $0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==1.4 Alte facilitati Bash==&lt;br /&gt;
===Alias===&lt;br /&gt;
Un alias reprezinta un mod prin care o comanda sau o serie de comenzi se executa folosind un alt nume.&lt;br /&gt;
Pentru a crea un alias se foloseste comanda: alias comanda_noua=&#039;comanda_substituita&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. alias copy=&#039;cp&#039;&lt;br /&gt;
2. alias search=&#039;grep&#039;&lt;br /&gt;
3. alias ls=&#039;ls -F&#039;&lt;br /&gt;
4. alias rm=&#039;rm -i&#039;&lt;br /&gt;
5. alias ll=&#039;ls -l&#039;&lt;br /&gt;
6. alias stop=&#039;kill -9&#039;&lt;br /&gt;
&lt;br /&gt;
Daca aliasul este compus din mai multe cuvinte acestea trebuie incadrate intre&lt;br /&gt;
ghilimele simple (apostrof).Pentru a vizualiza toate aliasurile din sistem se foloseste comanda alias fara nici un argument.Pentru a executa comanda originala in locul aliasului se foloseste \ (backslash) urmat de comanda.&lt;br /&gt;
&lt;br /&gt;
Example: \ls&lt;br /&gt;
Pentru a sterge un alias se foloseste comanda unalias&lt;br /&gt;
Exemplu: unalias ls&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Un alias exista doar in shell-ul curent (nu exista nici macar in subshell-urile shell-ului curent).&lt;br /&gt;
&lt;br /&gt;
===Customizare Environment===&lt;br /&gt;
Prompting variables (prompt strings)&lt;br /&gt;
&lt;br /&gt;
Bash foloseste 4 variabile speciale numite &amp;quot;prompt strings&amp;quot;: PS1, PS2, PS3 si PS4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; PS1 este numit &amp;quot;primary prompt string&amp;quot; si reprezinta prompterul curent.&lt;br /&gt;
De cele mai multe ori acesta se modifica pentru a arata informatii cat mai utile despre sesiunea curenta.&lt;br /&gt;
&lt;br /&gt;
 PS1 foloseste niste macro-uri care se expandeaza cu un anumit continut astfel:&lt;br /&gt;
 \A - current time in HH:MM hours format&lt;br /&gt;
 \d - current date&lt;br /&gt;
 \@ - the current time in 12 hours format&lt;br /&gt;
 \H - the hostname&lt;br /&gt;
 \h - the hostname up to the first dot (.)&lt;br /&gt;
 \s - the name of the shell&lt;br /&gt;
 \u - username of the EUID&lt;br /&gt;
 \w - the current working directory&lt;br /&gt;
 \W - the current working directory (basename) - relativ&lt;br /&gt;
 \$ - if EUID==0 print # else print $&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Un exemplu excelent de modificare PS1 este: export PS1=&#039;[\u@\h \w]$&#039;&lt;br /&gt;
Avand acest prompter adminul are intotdeauna informatii despre userul cu care s-a conectat, host-ul pe care este conectat precum si calea absoluta a directorului curent. Linia de mai sus se adauga in fisierul de customizare ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; PS2 este numit &amp;quot;secondary prompt string&amp;quot; si are valoarea default &amp;gt; (mai mare).&lt;br /&gt;
Se foloseste atunci cand se scrie o comanda incompleta si se apasa ENTER.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; PS3 se numeste &amp;quot;prompt string for the select command&amp;quot; si se foloseste in scripting impreuna cu comanda select&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; PS4 se numeste &amp;quot;prompt string for the xtrace option&amp;quot; si reprezinta un prompt string folosit in debugging si flow control.&lt;br /&gt;
&lt;br /&gt;
===Environment===&lt;br /&gt;
Fiecare utilizator are propriul mediu de lucru numit si Environment. Customizarea&lt;br /&gt;
Environmentului presupune modificarea unor variabile si parametri astfel incat mediul de lucru sa fie cat mai prietenos si sa ne ofere cat mai multe informatii.&lt;br /&gt;
Din mediul de lucru al unui utilizator fac parte: aliasurile sale, umask, modul de&lt;br /&gt;
afisare al prompterului, variabila PATH in care shellul cauta comenzile, ulimit etc&lt;br /&gt;
&lt;br /&gt;
Exista fisiere de initializare pentru fiecare user care sunt citite de shell la fiecare&lt;br /&gt;
pornire a acestuia:&lt;br /&gt;
&lt;br /&gt;
~/.bashrc - este primul fisier citit de shell la login. In acest fisier trebuie declarate variabile,&lt;br /&gt;
alias-uri etc pentru fiecare user.&lt;br /&gt;
~/.bash_profile - este citit dupa ~/.bashrc&lt;br /&gt;
~/.bash_logout - este citit de shell inainte de logout. In acest fisier se pot reseta variabile, sterge fisiere temporare sau alte functii care vrem sa aiba loc inainte de logout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fisierul /etc/profile este un alt fisier de customizare &amp;quot;system-wide&amp;quot;. Acesta nu&lt;br /&gt;
apartine unui anumit user, iar in el se configureaza mediul pentru toti userii. Il folosim de exemplu daca dorim setarea unui alias pentru toti userii din sistem.&lt;br /&gt;
Aceste fisiere nu sunt recitite automat de shell dupa modificare. Toate configurarile au efect dupa o noua logare in cazul ~/.bashrc sau ~/.bash_profile sau dupa o restartare a sistemului in cazul /etc/profile.Pentru a forta recitirea lor se foloseste comanda source sau . (dot) urmata de nume fisier. source sau . executa comenzile din interiorul fisierului in shellul curent.&lt;br /&gt;
&lt;br /&gt;
Exemplu: source ~/.bashrc sau . ~/.bashrc&lt;br /&gt;
Daca ~/.bash_profile nu exista shell-ul cauta ~/.bash_login. Daca nici aceasta nu exista cauta ~/.profile.&lt;br /&gt;
In aceste fisiere speciale de initializare se seteaza: PS1, TMOUT, PATH, alias, umask etc pentru fiecare utilizator&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Fisierele de initializare pentru fiecare utilizator se gasesc in home directory al acestuia (~) si sunt ascunse fiindca incep cu .(punct). Pentru vizualizarea lor se foloseste comanda ls cu optiunea -a Exemplu: ls -la ~&lt;br /&gt;
&lt;br /&gt;
In functie de distributia de Linux numele si ordinea de citire a fisierelor de customizare a mediului de lucru pentru fiecare user poate sa difere. Totusi, pe marea majoritate a distributiilor de Linux (RedHat, Fedora, CentOS, Suse, Ubuntu, Kubuntu, Debian) exista ~/.bashrc. In acest caz se recomanda folosirea doar a acestuia&lt;br /&gt;
&lt;br /&gt;
Exemplu ~/.bashrc:&lt;br /&gt;
&lt;br /&gt;
 # User specific aliases and functions &lt;br /&gt;
 alias rm=&#039;rm -i&#039; &lt;br /&gt;
 alias cp=&#039;cp -i&#039; &lt;br /&gt;
 alias mv=&#039;mv -i&#039; &lt;br /&gt;
 alias cauta=find &lt;br /&gt;
 alias muta=mv &lt;br /&gt;
 alias S=&#039;ssh -l root -p 7890 ssh.crystalmind.ro&#039; &lt;br /&gt;
 # Source global definitions &lt;br /&gt;
 if [ -f /etc/bashrc ]; then &lt;br /&gt;
   . /etc/bashrc &lt;br /&gt;
 fi &lt;br /&gt;
 export PS1=&#039;[\u@\h \w]$&#039; &lt;br /&gt;
 export PATH=:/home/gabriel/scripts &lt;br /&gt;
 umask=0022&lt;br /&gt;
&lt;br /&gt;
==1.5 Flow Control==&lt;br /&gt;
===Conditii de testare===&lt;br /&gt;
Nota&lt;br /&gt;
Informatiile din acesta pagina au scopul de referinta pentru testele folosite de structurile de control ce urmeaza a fi prezentate. Ele nu trebuie invatate la acest moment in afara conextului de flow control ci doar impreuna cu structurile if..then..else, while, case etc&lt;br /&gt;
&lt;br /&gt;
Structurile de control (if..then..else, while etc) presupun conditii de testare.&lt;br /&gt;
&lt;br /&gt;
Acestea sunt:&lt;br /&gt;
 1. Pentru fisiere&lt;br /&gt;
 -e = fisierul exista&lt;br /&gt;
 -f = fisierul exista si este de tipul regular file&lt;br /&gt;
 Exemplu: -f $FILE&lt;br /&gt;
 -s = fisierul nu are dimensiunea zero&lt;br /&gt;
 -d = fisierul exista si este de tip director&lt;br /&gt;
 -c = fisierul exista si este de tip char device&lt;br /&gt;
 -b = fisierul exista si este de tip block device&lt;br /&gt;
 -r = fisierul exista si are permisiunea read&lt;br /&gt;
 -w = fisierul exista si are permisiunea write&lt;br /&gt;
 -x = fisierul exista si are permisiunea execute&lt;br /&gt;
 -g = fisierul are GUID setat&lt;br /&gt;
 -u = fisierul are SUID setat&lt;br /&gt;
 -k = fisierul are sticky bit setat&lt;br /&gt;
 -nt = fisierul este mai nou decat un alt fisier&lt;br /&gt;
 Exemplu: file1 -nt file = file1 is newer than file2&lt;br /&gt;
 ! -&amp;gt; inverseaza sensul (neaga)&lt;br /&gt;
&lt;br /&gt;
2. Pentru comparatie&lt;br /&gt;
 -eq = equal to&lt;br /&gt;
 -ne = not equal to&lt;br /&gt;
 -gt = greater than&lt;br /&gt;
 Exemplu: $i -gt -$j&lt;br /&gt;
 -ge = greater than or equal&lt;br /&gt;
 -lt = less than&lt;br /&gt;
 -le = less than or egal&lt;br /&gt;
&lt;br /&gt;
3. Pentru stringuri (siruri de caractere)&lt;br /&gt;
 -z = lungimea sirului este zero&lt;br /&gt;
 -n = lungimea sirului este non-zero&lt;br /&gt;
 = egal (comparativ cu alte limbaje de programare operatorul de comparatie este un singur egal) != diferit&lt;br /&gt;
 Exemplu: $str1 != $str2&lt;br /&gt;
 -a = SI LOGIC (AND)&lt;br /&gt;
 -o = SAU LOGIC (OR)&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Testul este adevarat daca ambele conditii sunt adevarate simultan (valoarea variabilei USER este root si valoarea variabilei SHELL este bash)&lt;br /&gt;
 $USER = &amp;quot;root&amp;quot; -a $SHELL = &amp;quot;bash&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In cazul comparatiei a doua stringuri din punct de vedere al sintaxei bash este obligatoriu un spatiu inainte de = (egal) si un spatiu dupa = (egal).&lt;br /&gt;
 Exemplu: $USER=&amp;quot;root&amp;quot; este gresit, $USER = &amp;quot;root&amp;quot; este corect.&lt;br /&gt;
&lt;br /&gt;
2. Testul este adevarat daca una dintre conditii este adevarata(i mai mic ca 10 SAU i mai mare ca 100) $i -lt 10 -o $i gt 100&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Contiditiile de testare prezentate mai sus sunt doar cele mai folosite. Pentru lista completa executati: &lt;br /&gt;
  man test &lt;br /&gt;
  test EXPR &#039;&#039;sau&#039;&#039; [ EXPR ] #au acelasi rezultat.&lt;br /&gt;
&lt;br /&gt;
===If..then..else===&lt;br /&gt;
Cea mai simpla constructie de flow control este cea conditionala reprezentata de if.&lt;br /&gt;
In functie de o valoarea de adevar a unei conditii se stabilesc instructiunile ce trebuie executate. Conditiile de test se refera la proprietati ale fisierelor, comparatii numerice sau sunt referitoare la stringuri.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if este:&lt;br /&gt;
 if [ conditie_de_test ] then lista_de_instructiuni fi&lt;br /&gt;
Daca conditia de test este adevarata se executa lista de instructiuni, altfel aceasta nu se executa.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Daca primul argument al scriptului este fisier se executa: cat fisier&lt;br /&gt;
 if [ -f $1 ] then cat $1 fi&lt;br /&gt;
&lt;br /&gt;
2. Daca valoarea variabilei i este 10 se afiseaza mesajul &amp;quot;Variabila i are valoarea 10&amp;quot; if [ $i -eq 10 ] then echo &amp;quot;Variabila i are valoarea 10&amp;quot; fi&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if..else este:&lt;br /&gt;
 if [ conditie_de_test ] then lista_de_instructiuni else lista_de_instructiuni_default fi&lt;br /&gt;
&lt;br /&gt;
Data conditia de test este adevarata se executa lista_de_instructiuni, altfel se executa lista_de_instructiuni_default&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Daca valoarea variabilei VARSTA citita de la tastatura este mai mica decat 18 se afiseaza mesajul &amp;quot;Esti minor!&amp;quot;, altfel se afiseaza mesajul &amp;quot;Esti major!&amp;quot;&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 echo &amp;quot;Introdu varsta:&amp;quot; &lt;br /&gt;
 read VARSTA &lt;br /&gt;
 if [ $VARSTA -lt 18 ]; then&lt;br /&gt;
   echo &amp;quot;Esti minor!&amp;quot; &lt;br /&gt;
 else &lt;br /&gt;
   echo &amp;quot;Esti major!&amp;quot; &lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if..elif..else este:&lt;br /&gt;
&lt;br /&gt;
 if [ conditie_de_test1 ]; then&lt;br /&gt;
   &#039;&#039;lista_de_instructiuni_1&#039;&#039; &lt;br /&gt;
 elif [ conditie_de_test2 ]; then&lt;br /&gt;
   &#039;&#039;lista_de_instructiuni_2&#039;&#039; &lt;br /&gt;
 elif [ conditie_de_test3 ]; then&lt;br /&gt;
   &#039;&#039;lista_de_instructiuni_3&#039;&#039; &lt;br /&gt;
 else&lt;br /&gt;
   &#039;&#039;lista_de_instructiuni_default&#039;&#039;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplu:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 Daca variabila ORA citita de la tastatura este mai mica decat 12 se afiseaza mesajul &amp;quot;Buna dimineata&amp;quot;, daca este intre 12 si 18 se afiseaza mesajul &amp;quot;Buna ziua&amp;quot;, daca este intre 18 si 24 se afiseaza &amp;quot;Noapte Buna!&amp;quot;. Pentru orice alta situatie se afiseaza mesajul &amp;quot;Eroare!&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 read i &lt;br /&gt;
 if [ $i -lt 12 ]; then&lt;br /&gt;
   echo &amp;quot;Buna dimineata!&amp;quot; &lt;br /&gt;
 elif [ $i -ge 12 -a $i -lt 18 ]; then &lt;br /&gt;
   echo &amp;quot;Buna ziua!&amp;quot; &lt;br /&gt;
 elif [ $i -ge 18 -a $i -le 24 ]; then &lt;br /&gt;
   echo &amp;quot;Noapte buna !&amp;quot; &lt;br /&gt;
 else &lt;br /&gt;
   echo &amp;quot;Eroare!&amp;quot; &lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
-a reprezinta SI LOGIC (AND). Testul este adevarat daca ambele conditii sunt adevarate simultan.&lt;br /&gt;
&lt;br /&gt;
-o reprezinta SAU LOGIC (OR). Testul este adevarat daca una dintre contitii este adevarata.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplu&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Testul este adevarat daca ambele conditii sunt adevarate (primul parametru este fisier si exista si are si permisiunea de read). Ambele conditii sunt adevarate simultan.&lt;br /&gt;
 if [ -e $1 -a -r ]&lt;br /&gt;
&lt;br /&gt;
2. Testul este adevarat daca primul parametru primit de script este fisier SAU acesta este director. Una dintre conditii este adevarata.&lt;br /&gt;
 if [ -f $1 -o -d $1 ]&lt;br /&gt;
&lt;br /&gt;
===For===&lt;br /&gt;
For se foloseste pentru a executa o sectiune de cod de un numar repetat de ori&lt;br /&gt;
(ciclu). Varianta clasica de for din Bash este diferita de cea din alte limbaje de programare.&lt;br /&gt;
Sintaxa pentru for este:&lt;br /&gt;
for VAR in lista_de_valori do instructiuni done&lt;br /&gt;
Se executa instructiunile specificate de atatea ori cate valori avem in lista. Pentru fiecare iteratie variabila VAR ia o valoare din lista_de_valori. Separatorul pentru valorile din lista este default spatiu sau valoarea variabilei globale IFS.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Script care exemplifica ciclul de tip for prin trimiterea unui pachet ping la fiecare din cele 3 IP-uri.&lt;br /&gt;
&lt;br /&gt;
Instructiunile dintre do si done se executa de atatea ori cate valori avem in lista (3 valori).&lt;br /&gt;
&lt;br /&gt;
Pentru fiecare ciclu valoarea variabilei IP este o valoare din lista. Valorile din lista sunt separate prin spatiu.&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 for IP in 192.168.0.1 192.168.0.2 192.168.0.3; do&lt;br /&gt;
   ping -c 1 $IP &lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
2. Exemplu for modificand valoara variabilei IFS care este separatorul valorilor.&lt;br /&gt;
 #!/bin/bash #Acest script afiseaza fiecare director din $PATH pe cate un rand &lt;br /&gt;
 IFS=: for DIR in $PATH; do&lt;br /&gt;
   echo $DIR &lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
In Bash exista si structura de tip for ca in C/C++. Aceasta este insa mai putin folosita.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
&lt;br /&gt;
 for ca in C/C++:&lt;br /&gt;
   LIMIT=10 &lt;br /&gt;
   for((a=0;a&amp;lt;=$LIMIT;a++)); do &lt;br /&gt;
     echo $a &lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
===While===&lt;br /&gt;
Structura de tip while se foloseste pentru a executa o serie de instructiuni (cele&lt;br /&gt;
dintre do si done) atata timp cat conditia de test este adevarata.&lt;br /&gt;
&lt;br /&gt;
while [ conditie_de_test ] do lista_de_instructiuni done&lt;br /&gt;
&lt;br /&gt;
Exemplu while:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 #script care afiseaza numerele intre 0 zi 100&lt;br /&gt;
 LIMIT=100&lt;br /&gt;
 i=0&lt;br /&gt;
 while [ $i –le $LIMIT ]&lt;br /&gt;
 do&lt;br /&gt;
 echo &amp;quot;i=$i&amp;quot;&lt;br /&gt;
 let i=i+1&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Case===&lt;br /&gt;
Structura de tip case se foloseste pentru a executa o serie de instructiuni in functie de diferite conditii de testare.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru case este:&lt;br /&gt;
&lt;br /&gt;
 case VARIABILA in&lt;br /&gt;
 valoare1)&lt;br /&gt;
 instructiuni1&lt;br /&gt;
 ;;&lt;br /&gt;
 valoare2)&lt;br /&gt;
 instructiuni&lt;br /&gt;
 ;;&lt;br /&gt;
 *)&lt;br /&gt;
 instructiuni_default&lt;br /&gt;
 ;;&lt;br /&gt;
 esac&lt;br /&gt;
 * -&amp;gt; reprezinta instructiunile ce se vor executa default daca variabila nu are niciuna dintre valorile de mai sus.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 #!/bin/bash echo &amp;quot;Introdu nr:&amp;quot; read nr case $nr in 1) echo &amp;quot;nr este 1&amp;quot; ;; 2) echo &amp;quot;nr este2&amp;quot; ;; *) echo &amp;quot;nr are alta valoare&amp;quot; ;; esac&lt;br /&gt;
Structura de tip case poate fi oricand inlocuita cu o structura de tip if..elif..else&lt;br /&gt;
&lt;br /&gt;
Exemplul de mai sus folosind if..elif..else este:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 echo &amp;quot;Introdu nr:&amp;quot;&lt;br /&gt;
 read nr&lt;br /&gt;
 if [ $nr -eq 1 ]&lt;br /&gt;
 then echo &amp;quot;nr este 1&amp;quot;&lt;br /&gt;
 elif [ $nr -eq 2 ]&lt;br /&gt;
 then&lt;br /&gt;
 echo &amp;quot;nr este 2&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
 echo &amp;quot;nr este altceva&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Important&lt;br /&gt;
&lt;br /&gt;
Structura de tip case este foarte importanta si trebuie inteleasa bine. Toate&lt;br /&gt;
scripturile de initializare a serviciilor (cele din /etc/init.d ) folosesc o structura de tip case.&lt;br /&gt;
&lt;br /&gt;
Structura unui script de initializare din /etc/init.d este:&lt;br /&gt;
 case $1 in&lt;br /&gt;
 start) instructiuni de pornire serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 stop) instuctiuni de oprire serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 restart) instructiuni de restartare serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 *) afisare help script &lt;br /&gt;
 esac&lt;br /&gt;
&lt;br /&gt;
$1 reprezinta primul parametru al scriptului si poate fi start, stop sau restart.&lt;br /&gt;
&lt;br /&gt;
Exemplu: Pentru restartarea retelei se foloseste: /etc/init.d/network restart, unde network este scriptul de initializare iar restart primul parametru pe care-l primeste.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Presupunem ca am compilat si instalat serverul Apache in directorul /opt/apache.&lt;br /&gt;
Daemonul http se porneste ruland comanda: /opt/apache/bin/apachectl start, se opreste cu /opt/apache/bin/apachectl stop si se restarteaza cu /opt/apache/bin/apachectl restart. Se doreste pornirea serverului la butarea sistemului, mai exact la intrarea in runlevel 3.&lt;br /&gt;
&lt;br /&gt;
Etape:&lt;br /&gt;
1. Se creaza un script in /etc/init.d. Numele poate fi ales aleator, in exemplul nostru acesta se numeste init_apache&lt;br /&gt;
2. Se creaza un symlink catre /etc/init.d/init_apache in /etc/init.d/rc3.d numit S99Apache. Numele symlinkului este important sa inceapa cu litera S urmata de un umar intre 0 si 99.&lt;br /&gt;
&lt;br /&gt;
La intrarea in runlevel 3 se va rula automat acest script cu parametrul start.&lt;br /&gt;
Structura scriptului /etc/init.d/init_apache este:&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 case $1 in&lt;br /&gt;
 start)&lt;br /&gt;
 echo &amp;quot;Starting Apache...&amp;quot; /opt/apache/bin/apachectl start echo &amp;quot;OK&amp;quot;&lt;br /&gt;
 ;;&lt;br /&gt;
 stop) echo &amp;quot;Shutting down Apache...&amp;quot; /opt/apache/bin/apachectl stop echo &amp;quot;OK&amp;quot;&lt;br /&gt;
 ;;&lt;br /&gt;
 restart) $0 stop $0 start&lt;br /&gt;
 ;;&lt;br /&gt;
 *) echo &amp;quot;init_apache &amp;lt;start|stop|restart&amp;gt;&amp;quot;&lt;br /&gt;
 esac&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Pentru detalii complete despre modul de pornire a serviciilor la butare cititi capitolul &amp;quot;Managementul Serviciilor&amp;quot; din cursul &amp;quot;Linux Basic Administration&amp;quot; disponibil de asemenea online.&lt;br /&gt;
&lt;br /&gt;
===Select===&lt;br /&gt;
Structura de tip select este specifica doar Bash-ului si se foloseste pentru crearea de meniuri.&lt;br /&gt;
&lt;br /&gt;
Sintaxa acesteia este:&lt;br /&gt;
 select MENUITEM in menu_list&lt;br /&gt;
 do&lt;br /&gt;
 lista_de_comenzi&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
Detalii:&lt;br /&gt;
- menu_list este lista de meniuri. Valorile din lista sunt separate prin spatiu;&lt;br /&gt;
- intre do si done sunt instruciunile ce se executa in functie de meniul ales;&lt;br /&gt;
- intre do si done avem acces la urmatoarele 2 variabile: MENUITEM care contine meniul&lt;br /&gt;
&lt;br /&gt;
selectat si REPLY care se creaza automat si contine inputul userului (ce a scris acesta la consola);&lt;br /&gt;
&lt;br /&gt;
- PS3 contine prompterul de selectare a meniurilor;&lt;br /&gt;
- userul alege un meniu din lista folosind un nr. de ordine: alege 1 pentru primul meniu, 2 pentru al doilea etc;&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 PS3=&amp;quot;Alege:&amp;quot;&lt;br /&gt;
 select ITEM in &amp;quot;Afiseaza continut /etc&amp;quot; &amp;quot;Afiseaza spatiu liber&amp;quot; &amp;quot;Exit&amp;quot;&lt;br /&gt;
 do&lt;br /&gt;
 case $REPLY in&lt;br /&gt;
 1) ls -l /etc&lt;br /&gt;
 ;;&lt;br /&gt;
 2) df -h&lt;br /&gt;
 ;;&lt;br /&gt;
 3) exit 0&lt;br /&gt;
 ;;&lt;br /&gt;
 *) echo &amp;quot;Optiune incorecta&amp;quot;&lt;br /&gt;
 esac&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
==1.6 Substituirea comenzilor==&lt;br /&gt;
&lt;br /&gt;
Unei variabile i se poate asigna o valoare in 2 moduri:&lt;br /&gt;
&lt;br /&gt;
1. Folosind NUME_VAR=valoare&lt;br /&gt;
&lt;br /&gt;
Exemplu: &lt;br /&gt;
  &lt;br /&gt;
  EDITOR=&amp;quot;VIM&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Substituind o comanda cu outputul ei&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
  &lt;br /&gt;
  VAR=`ls /etc` -&amp;gt; in acest exemplu comanda ls /etc se substituie sau inlocuieste cu outputul ei care se asigneaza variabilei VAR. Variabila VAR va contine outputul comenzii ls -l.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Substituirea unei comenzi cu outputul ei reprezinta unul dintre caracteristicile cele mai puternice ale Bash-ului, iar majoritatea scripturilor folosesc acest mod de lucru.&lt;br /&gt;
&lt;br /&gt;
Pentru a substitui o comanda cu outputul ei exista 2 variante:&lt;br /&gt;
&lt;br /&gt;
1. Comanda sa incadreza in backquotes ( ``). Atentie, backquotes nu sunt apostroafe sau ghilimele simple.&lt;br /&gt;
&lt;br /&gt;
Exemplu: &lt;br /&gt;
 ME=`whoami ` -&amp;gt; variabila ME va contine outputul comenzii whoami (atentie! nu exista spatii in jurul semnului = (stanga/dreapta)&lt;br /&gt;
&lt;br /&gt;
2. Comanda se incadreza intre $( si )&lt;br /&gt;
&lt;br /&gt;
Exemplu: &lt;br /&gt;
  ETH0= $(ifconfig eth0) -&amp;gt; variabila numita ETH0 va contine outputul comenzii &#039;&#039;&#039;ifconfig eth0&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Exemplu script ce nu poate fi rulat de catre root&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 &lt;br /&gt;
 if [ &amp;quot;$(whoami)&amp;quot; = &amp;quot;root&amp;quot; ]&lt;br /&gt;
 then&lt;br /&gt;
   echo &amp;quot;Esti root, sorry !&amp;quot;&lt;br /&gt;
   exit 1;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
#incep instructiunile ce nu pot fi rulate de catre root&amp;quot;&lt;br /&gt;
 ls -la ~&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In momentul in care o variabila de tip string este testat folosind un test pentru stringuri este bine ca aceasta sa fie incadrata intre ghilimele duble pentru a forta tipul ei catre string.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
&lt;br /&gt;
  VAR=&amp;quot;`ifconfig eth0`&amp;quot; &lt;br /&gt;
  if [ -z &amp;quot;$VAR&amp;quot; ]; then &lt;br /&gt;
   echo &amp;quot;Interfata eth0 nu exista!&amp;quot; &lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
== 1.7 Subshells==&lt;br /&gt;
&lt;br /&gt;
Utilizarea subshell-urilor în Bash poate fi avantajoasă din mai multe motive, inclusiv:&lt;br /&gt;
&lt;br /&gt;
 1. Izolarea comenzilor: comenzile executate într -un subshell sunt izolate de cochilie părinte. Aceasta înseamnă că orice modificări aduse la variabile, directoare sau alte setări de mediu din subshell nu vor afecta shell-ul părinte.&lt;br /&gt;
&lt;br /&gt;
 2. Scoping: Variabilele definite într -un subshell au un domeniu local și nu vor afecta variabile cu același nume în shell-ul părinte.&lt;br /&gt;
&lt;br /&gt;
 3. Manevrarea erorilor: subshell -urile pot fi utilizate pentru o mai bună gestionare a erorilor. De exemplu, puteți executa o serie de comenzi într-un subshell și puteți verifica starea de returnare a acesteia fără a afecta fluxul principal al scriptului dvs.&lt;br /&gt;
&lt;br /&gt;
Iată câteva exemple de utilizare a subshell-urilor în Bash:&lt;br /&gt;
&lt;br /&gt;
Schimbarea directorului temporar:&lt;br /&gt;
&lt;br /&gt;
Aceasta schimbă temporar directorul în/calea/în/director, execută comanda &#039;&#039;ls&#039;&#039;, apoi se întoarce în directorul original. Schimbarea directorului afectează doar subshell-ul.&lt;br /&gt;
&lt;br /&gt;
-Execuție paralelă:&lt;br /&gt;
&lt;br /&gt;
Aceasta execută mai multe comenzi concomitent în subshell-uri, permițându-le să funcționeze în paralel.&lt;br /&gt;
&lt;br /&gt;
-Manevrarea erorilor:&lt;br /&gt;
&lt;br /&gt;
Aceasta execută comanda1 și comanda2 într -un subshell. Dacă Command1 sau Command2 eșuează (returnează un statut de ieșire non-zero), atunci este ecou „eroare”.&lt;br /&gt;
&lt;br /&gt;
-Setări temporare ale mediului:&lt;br /&gt;
&lt;br /&gt;
Aceasta stabilește o variabilă de mediu temporară la valoare pentru durata comenzii. Odată ce comanda se termină, variabila revine la valoarea sa anterioară (sau este nesetată dacă nu exista înainte).&lt;br /&gt;
&lt;br /&gt;
Subshell-urile sunt versatile și pot fi utilizate creativ pentru a atinge diverse obiective de script, menținând controlul asupra mediului și fluxului de execuție al comenzilor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;In incheierea cursului Linux Essentials:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La ce pot fi folosite parantezele ( ) in bash?&lt;br /&gt;
&lt;br /&gt;
Utilizari comune&lt;br /&gt;
    1. Substitutia comenzii:&lt;br /&gt;
        ◦ $(command) or `command`: Executa comanda si ii substituie iesirea.&lt;br /&gt;
        ◦ Example: echo $(date) or echo \date``&lt;br /&gt;
    2. Expansie aritmetica:&lt;br /&gt;
        ◦ (( expression )): Performa operatuni aritmetice si le evalueaza expresia.&lt;br /&gt;
        ◦ Example: (( x = 5 + 3 ))&lt;br /&gt;
    3. Crearea unui subshell:&lt;br /&gt;
        ◦ ( commands ): Execute comenzi intr-un subshell, izolandu-i mediul de cea principala.&lt;br /&gt;
        ◦ Example: (cd /path/to/directory &amp;amp;&amp;amp; ls)&lt;br /&gt;
    4. Declararea unei functii:&lt;br /&gt;
        ◦ function_name () { commands; }: Declara o functie.&lt;br /&gt;
    5. Gruparea comenzilor:&lt;br /&gt;
        ◦ { commands; }: Grupeaza mai multe comenzi impreuna, permitandu-le sa ruleze ca si o singura comanda.&lt;br /&gt;
        ◦ Example: { echo &amp;quot;Hello&amp;quot;; echo &amp;quot;World&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Essentials_Pagina_7|Pagina anterioară]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Essentials_Pagina_8&amp;diff=548</id>
		<title>Essentials Pagina 8</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Essentials_Pagina_8&amp;diff=548"/>
		<updated>2025-04-11T08:16:18Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Subshells */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Laborator 8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Shell Scripts=&lt;br /&gt;
&lt;br /&gt;
==1.1 Introducere in Bash==&lt;br /&gt;
Shellul este interpretorul de comenzi. Acesta parseaza comenzile introduse de&lt;br /&gt;
utilizator, le verifica din punct de vedere al sintaxei si le trimite kernel-ului spre executie.&lt;br /&gt;
&lt;br /&gt;
Exista mai multe shelluri (Bourne, C Shell, recent aparute Zsh si Fish, etc), dar default pe Linux este shellul numit Bash (Bourne Again Shell). Acesta este reprezentat de fisierul &#039;&#039;/bin/bash&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Pe langa interpretarea si executia comenzilor, Bash-ul ofera si alte facilitati printre&lt;br /&gt;
care: editarea liniei de comanda, history, alias-uri, dar si un limbaj de programare structurat propriu.&lt;br /&gt;
&lt;br /&gt;
Un script de shell este un fisier text (ASCII) care contine comenzi de shell organizate intr-un mod logic. Pe langa comenzi, script-ul mai contine si variabile (locale sau globale), parametri pozitionali precum si structuri de programare specifice (if..then..else, while, do, until, for, case, selsect etc). Un script este folosit pentru a imbina comenzi si diverse structuri de control pentru a oferi o noua functionalitate sau a automatiza task-uri.&lt;br /&gt;
&lt;br /&gt;
Etapele crearii unui script sunt:&lt;br /&gt;
&lt;br /&gt;
a) crearea unui fisier text folosind editorul preferat (Exemplu: vim)&lt;br /&gt;
b) editarea fisierului pentru a contine functionalitatea dorita&lt;br /&gt;
c) testarea scriptului adica executia/rularea acestuia&lt;br /&gt;
&lt;br /&gt;
Modul de executie a unui script numit script1:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Din directorul care contine scriptul se ruleaza : ./script1&lt;br /&gt;
Fisierul script1 trebuie sa aiba dreptul de executie. Fiindca directorul curent (.) nu&lt;br /&gt;
se afla in $PATH (altfel grave probleme de securitate), scriptul trebuie sa fie executat cu calea absoluta sau cu ./nume_script In acest caz se porneste un shell nou ca sub proces al shellului curent in care se executa comenzile din script.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Din directorul care contine fisierul script1 se ruleaza: . script1 sau source script1.&lt;br /&gt;
Se executa comenzile din script1 in shell-ul curent. Fisierul script1 nu trebuie sa&lt;br /&gt;
aiba dreptul de executie. Una dintre diferentele dintre prima si a doua varianta este ca variabilele exportate sau globale sunt vizibile in shell-ul curent in varianta a doua, dar nu si in prima varianta.&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Varianta cea mai folosita de executie a unui script este prima: ./script&lt;br /&gt;
Un script trebuie sa contina pe prima linie o referire la programul cu care se executa (Bash, Perl, PHP, Python etc). Astfel prima linie a unui script Bash este invariabil: #!/bin/bash. In interiorul scriptului #(diez) reprezinta un comentariu. Exceptie face prima linie.&lt;br /&gt;
&lt;br /&gt;
echo se foloseste pentru afisa un string (sir de caractere) sau o variabila la consola.&lt;br /&gt;
Exemplu: echo &amp;quot;Linux&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Script care afiseaza mesajul: Acesta este primul exemplu !&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 echo &amp;quot;Acesta este primul exemplu !&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Script care creaza un fiser numit continut_etc.txt in directorul curent ce contine fisierele si directoarele din directorul /etc, iar apoi afiseaza spatiul total, ocupat si liber de pe fiecare partitie de pe Hard Disk.&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 ls -l /etc &amp;gt; continut_etc.txt&lt;br /&gt;
 echo &amp;quot;Fisierul continut_etc.txt a fost creat in directorul curent!&amp;quot;&lt;br /&gt;
 echo &amp;quot;Informatii partitii:&amp;quot;&lt;br /&gt;
 df -h Important&lt;br /&gt;
&lt;br /&gt;
O cunoastere acceptabila a modului de creare de scripturi este esentiala pentru orice Administrator de sistem. In cazul persoanelor incepatoare care nu au experienta in programare (orice limbaj) procesul de scripting pare la prima vedere extrem de complicat.&lt;br /&gt;
&lt;br /&gt;
Este nevoie de multe exercitii si exemple pentru o intelegere aprofundata. Intotdeauna se incepe cu exercitii simple si anume scripturi formate din cateva randuri.&lt;br /&gt;
&lt;br /&gt;
==1.2 Variabile, constante si functii==&lt;br /&gt;
&lt;br /&gt;
Prezentare generala:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; O variabila reprezinta un nume pentru o locatie de memorie unde se gaseste o valoare. Se obisnuieste (nu este obligatoriu) ca variabilele sa se scrie cu litera mare.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Comparativ cu alte limbaje de programare (C/C++, JAVA) variabilele in Bash nu au tip. Ele sunt string-uri, dar in functie de context pot fi evaluate ca integer etc.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; O variabila se declara: NUME_VAR=valoare&lt;br /&gt;
&lt;br /&gt;
Important&lt;br /&gt;
Nu se foloseste spatiu intre NUME_VAR si valoare. i = 1 reprezinta eroare. Sintaxa bash - ului este extrem de stricta. Un spatiu in plus sau in minus reprezinta o eroare fatala.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 NUME=&amp;quot;dan&amp;quot;&lt;br /&gt;
 varsta=20&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4&#039;&#039;&#039;. Pentru a ne referi la continutul unei varibile se foloseste semnul $ (dollar) in fata numelui variabilei.&lt;br /&gt;
Exemplu: echo $varsta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5&#039;&#039;&#039;. Variabilele pot fi locale sau globale. Cele locale sunt vizibile doar in shell-ul curent, iar cele globale sunt vizibile in shell-ul curent si in toate subprocesele shell-ului curent. Astfel in interiorul unui script daca se foloseste o variabila globala aceasta va fi accesibila oricarei comenzi/program lansata din acel script. Variabilele globale nu sunt accesibile parintelui unui proces, adica shell-ului de unde s-a executat scriptul. Exceptie face varianta 2 de executie a unui script adica folosind source nume_script&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6&#039;&#039;&#039;. Pentru a declara o variabila globala aceasta trebuie exportata. Se foloseste cuvantul cheie export&lt;br /&gt;
&lt;br /&gt;
 Exemplu: export VARSTA=20&lt;br /&gt;
 variabilele globale se numesc de environment;&lt;br /&gt;
 pentru a vizualiza variabilele locale se foloseste comanda set;&lt;br /&gt;
 pentru a vizualiza variabilele globale se foloseste comanda env;&lt;br /&gt;
 pentru sterge o variabila se foloseste comanda unset NUME_VAR;&lt;br /&gt;
&lt;br /&gt;
Exemplu de varibile globale predefinite:&lt;br /&gt;
 PATH -&amp;gt; contine o lista de directoare in care shell-ul cauta comanda care se executa.&lt;br /&gt;
&lt;br /&gt;
Pentru a concatena un string la variabila PATH se foloseste caracterul : (doua puncte).&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&lt;br /&gt;
Daca dorim sa adaugam directorul /home/dan/scripts in PATH: export&lt;br /&gt;
 PATH=PATH:/home/stud/scripts&lt;br /&gt;
&lt;br /&gt;
Dupa aceasta scripturi si comenzi din /home/stud/scripts pot fi rulate in orice director ne am afla doar prin numele lor. Altfel trebuie folosita calea absoluta sau aflandu-ne in&lt;br /&gt;
director se executa: ./nume_comanda&lt;br /&gt;
 HOSTNAME -&amp;gt; contine hostname-ul calculatorului&lt;br /&gt;
 SHELL -&amp;gt; contine shell-ul default&lt;br /&gt;
 HISTSIZE - contine nr. de comenzi care vor fi memorate in history&lt;br /&gt;
 USER -&amp;gt; contine EUID&lt;br /&gt;
 PWD -&amp;gt; contine directorul curent&lt;br /&gt;
 OLDPWD -&amp;gt; contine directorul precedent si se foloseste de comanda: cd –&lt;br /&gt;
 HOME -&amp;gt; contine home directory al EUID&lt;br /&gt;
 RANDOM -&amp;gt; variabila al carei continut este pseudoaleator&lt;br /&gt;
 TMOUT -&amp;gt; nr in secunde dupa care se face logout automat daca nu se executa nicio comanda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7&#039;&#039;&#039;. Diferenta dintre ghilimele simple(apostrof) si ghilimele duble este aceea ca ghilimele simple nu interpreteaza $ ca si caracter special. In interiorul ghilimelelor simple fiecare caracter special cu exceptia &#039; (ghilimea simpla) este interpretat literal.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 varsta=20 echo &amp;quot;$varsta&amp;quot; ##se afiseaza 20 echo &#039;$varsta&#039; ##se afiseaza $varsta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8&#039;&#039;&#039;. O variabila poate fi declarata read-only sau de tip array. O variabila read-only se mai numeste si constanta.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 &#039;&#039;&#039;1.&#039;&#039;&#039; var1 este readonly. Aceasta nu poate fi modificata sau stearsa folosind unset.&lt;br /&gt;
 declare -r var1=7&lt;br /&gt;
 &#039;&#039;&#039;2.&#039;&#039;&#039; Pentru a declara un array/vector:&lt;br /&gt;
 ARRAY=(unu doi trei) echo ${ARRAY[*]} echo ${ARRAY[1]} i=2 echo&lt;br /&gt;
 ${ARRAY[]} unset ARRAY[1] unset ARRAY&lt;br /&gt;
 ARRAY nu este cuvant cheie. In loc de ARRAY poate fi orice cuvant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;9&#039;&#039;&#039;. Pentru a citi o variabila de la tastatura se foloseste cuvantul cheie read&lt;br /&gt;
Exemplu:&lt;br /&gt;
 #!/bin/bash echo &amp;quot;Introdu nume fisier:&amp;quot; read FILE echo &amp;quot;Fisierul introdus este $FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10&#039;&#039;&#039;. In bash exista caractere speciale care sunt interpretate in mod deosebit.&lt;br /&gt;
 Exemple: $ (dollar), &amp;quot;(ghilimea dubla) sau \ (backslash). Pentru a anula efectul special al&lt;br /&gt;
caracterului, acesta se precede cu \ (backslash).&lt;br /&gt;
&lt;br /&gt;
 Exemplu: echo \$var -&amp;gt; Afiseaza $var. $ nu mai este caracter special.&lt;br /&gt;
&lt;br /&gt;
==1.3 Parametri pozitionali==&lt;br /&gt;
Bash-ul foloseste parametri speciali la care ne putem referi in interiorul unui script&lt;br /&gt;
pentru a avea acces la anumite valori. Acesti parametri speciali se pot folosi ca si&lt;br /&gt;
variabilele, doar ca exista default si nu trebuie creati. Continutul acestora este de asemenea standard.&lt;br /&gt;
&lt;br /&gt;
Acestia sunt:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; $0 - contine numele scriptului&lt;br /&gt;
Scriptul poate actiona diferit in functie de numele cu care a fost rulat ( Exemplu:&lt;br /&gt;
daca se ruleaza folosind un simlink al scriptului. Vezi comanda /bin/egrep care este un simlink catre /bin/grep dar are totusi functionalitate diferita).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; $1 - reprezinta primul argument al scriptului, $2 al doilea argument al scriptului etc. Incepand cu argumentul 10 acesta trebuie incadrat intre acolade ${10}, ${11} etc.&lt;br /&gt;
Se folosesc pentru a evita erori in momentul in care scriptul este rulat fara argumente sau cu un alt nr. de argumente (iar acesta asteapta sa primeasca argumente).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; $? - reprezinta statusul ultimei comenzi executate.&lt;br /&gt;
In Bash Zero este statusul pentru non-error iar diferit de zero este statusul pentru eroare. Orice comanda/program are un status de exit, zero sau non-zero. Se foloseste pentru a continua executia scriptului (sau a modifica comportamentul acestuia) in functie de statusul comenzilor anterioare.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; $# - reprezinta nr. de argumente ale scriptului Se poate lua o decizie in functie de nr. de argumente cu care a fost rulat scriptul.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.&#039;&#039;&#039; $* - reprezinta toate argumentele date scriptului.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.&#039;&#039;&#039; $$ - reprezinta PID shell.&lt;br /&gt;
Astel in functie de cum rulam scriptul $$ are alta valoare:source f1 - $$ reprezinta PID bash (shell curent) ./f1 - $$ reprezinta PID noului sub-shell creat in care se executa comenzile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.&#039;&#039;&#039; $! - reprezinta PID ultimului proces executat in background.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Script care sterge fisierul sau directorul pe care-l primeste ca argument&lt;br /&gt;
 #!/bin/bash rm -rf $1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Afisarea numelui scriptului&lt;br /&gt;
 #!/bin/bash Echo &amp;quot;Numele scriptului executat este: $0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==1.4 Alte facilitati Bash==&lt;br /&gt;
===Alias===&lt;br /&gt;
Un alias reprezinta un mod prin care o comanda sau o serie de comenzi se executa folosind un alt nume.&lt;br /&gt;
Pentru a crea un alias se foloseste comanda: alias comanda_noua=&#039;comanda_substituita&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. alias copy=&#039;cp&#039;&lt;br /&gt;
2. alias search=&#039;grep&#039;&lt;br /&gt;
3. alias ls=&#039;ls -F&#039;&lt;br /&gt;
4. alias rm=&#039;rm -i&#039;&lt;br /&gt;
5. alias ll=&#039;ls -l&#039;&lt;br /&gt;
6. alias stop=&#039;kill -9&#039;&lt;br /&gt;
&lt;br /&gt;
Daca aliasul este compus din mai multe cuvinte acestea trebuie incadrate intre&lt;br /&gt;
ghilimele simple (apostrof).Pentru a vizualiza toate aliasurile din sistem se foloseste comanda alias fara nici un argument.Pentru a executa comanda originala in locul aliasului se foloseste \ (backslash) urmat de comanda.&lt;br /&gt;
&lt;br /&gt;
Example: \ls&lt;br /&gt;
Pentru a sterge un alias se foloseste comanda unalias&lt;br /&gt;
Exemplu: unalias ls&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Un alias exista doar in shell-ul curent (nu exista nici macar in subshell-urile shell-ului curent).&lt;br /&gt;
&lt;br /&gt;
===Customizare Environment===&lt;br /&gt;
Prompting variables (prompt strings)&lt;br /&gt;
&lt;br /&gt;
Bash foloseste 4 variabile speciale numite &amp;quot;prompt strings&amp;quot;: PS1, PS2, PS3 si PS4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; PS1 este numit &amp;quot;primary prompt string&amp;quot; si reprezinta prompterul curent.&lt;br /&gt;
De cele mai multe ori acesta se modifica pentru a arata informatii cat mai utile despre sesiunea curenta.&lt;br /&gt;
&lt;br /&gt;
 PS1 foloseste niste macro-uri care se expandeaza cu un anumit continut astfel:&lt;br /&gt;
 \A - current time in HH:MM hours format&lt;br /&gt;
 \d - current date&lt;br /&gt;
 \@ - the current time in 12 hours format&lt;br /&gt;
 \H - the hostname&lt;br /&gt;
 \h - the hostname up to the first dot (.)&lt;br /&gt;
 \s - the name of the shell&lt;br /&gt;
 \u - username of the EUID&lt;br /&gt;
 \w - the current working directory&lt;br /&gt;
 \W - the current working directory (basename) - relativ&lt;br /&gt;
 \$ - if EUID==0 print # else print $&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Un exemplu excelent de modificare PS1 este: export PS1=&#039;[\u@\h \w]$&#039;&lt;br /&gt;
Avand acest prompter adminul are intotdeauna informatii despre userul cu care s-a conectat, host-ul pe care este conectat precum si calea absoluta a directorului curent. Linia de mai sus se adauga in fisierul de customizare ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; PS2 este numit &amp;quot;secondary prompt string&amp;quot; si are valoarea default &amp;gt; (mai mare).&lt;br /&gt;
Se foloseste atunci cand se scrie o comanda incompleta si se apasa ENTER.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; PS3 se numeste &amp;quot;prompt string for the select command&amp;quot; si se foloseste in scripting impreuna cu comanda select&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; PS4 se numeste &amp;quot;prompt string for the xtrace option&amp;quot; si reprezinta un prompt string folosit in debugging si flow control.&lt;br /&gt;
&lt;br /&gt;
===Environment===&lt;br /&gt;
Fiecare utilizator are propriul mediu de lucru numit si Environment. Customizarea&lt;br /&gt;
Environmentului presupune modificarea unor variabile si parametri astfel incat mediul de lucru sa fie cat mai prietenos si sa ne ofere cat mai multe informatii.&lt;br /&gt;
Din mediul de lucru al unui utilizator fac parte: aliasurile sale, umask, modul de&lt;br /&gt;
afisare al prompterului, variabila PATH in care shellul cauta comenzile, ulimit etc&lt;br /&gt;
&lt;br /&gt;
Exista fisiere de initializare pentru fiecare user care sunt citite de shell la fiecare&lt;br /&gt;
pornire a acestuia:&lt;br /&gt;
&lt;br /&gt;
~/.bashrc - este primul fisier citit de shell la login. In acest fisier trebuie declarate variabile,&lt;br /&gt;
alias-uri etc pentru fiecare user.&lt;br /&gt;
~/.bash_profile - este citit dupa ~/.bashrc&lt;br /&gt;
~/.bash_logout - este citit de shell inainte de logout. In acest fisier se pot reseta variabile, sterge fisiere temporare sau alte functii care vrem sa aiba loc inainte de logout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fisierul /etc/profile este un alt fisier de customizare &amp;quot;system-wide&amp;quot;. Acesta nu&lt;br /&gt;
apartine unui anumit user, iar in el se configureaza mediul pentru toti userii. Il folosim de exemplu daca dorim setarea unui alias pentru toti userii din sistem.&lt;br /&gt;
Aceste fisiere nu sunt recitite automat de shell dupa modificare. Toate configurarile au efect dupa o noua logare in cazul ~/.bashrc sau ~/.bash_profile sau dupa o restartare a sistemului in cazul /etc/profile.Pentru a forta recitirea lor se foloseste comanda source sau . (dot) urmata de nume fisier. source sau . executa comenzile din interiorul fisierului in shellul curent.&lt;br /&gt;
&lt;br /&gt;
Exemplu: source ~/.bashrc sau . ~/.bashrc&lt;br /&gt;
Daca ~/.bash_profile nu exista shell-ul cauta ~/.bash_login. Daca nici aceasta nu exista cauta ~/.profile.&lt;br /&gt;
In aceste fisiere speciale de initializare se seteaza: PS1, TMOUT, PATH, alias, umask etc pentru fiecare utilizator&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Fisierele de initializare pentru fiecare utilizator se gasesc in home directory al acestuia (~) si sunt ascunse fiindca incep cu .(punct). Pentru vizualizarea lor se foloseste comanda ls cu optiunea -a Exemplu: ls -la ~&lt;br /&gt;
&lt;br /&gt;
In functie de distributia de Linux numele si ordinea de citire a fisierelor de customizare a mediului de lucru pentru fiecare user poate sa difere. Totusi, pe marea majoritate a distributiilor de Linux (RedHat, Fedora, CentOS, Suse, Ubuntu, Kubuntu, Debian) exista ~/.bashrc. In acest caz se recomanda folosirea doar a acestuia&lt;br /&gt;
&lt;br /&gt;
Exemplu ~/.bashrc:&lt;br /&gt;
&lt;br /&gt;
 # User specific aliases and functions &lt;br /&gt;
 alias rm=&#039;rm -i&#039; &lt;br /&gt;
 alias cp=&#039;cp -i&#039; &lt;br /&gt;
 alias mv=&#039;mv -i&#039; &lt;br /&gt;
 alias cauta=find &lt;br /&gt;
 alias muta=mv &lt;br /&gt;
 alias S=&#039;ssh -l root -p 7890 ssh.crystalmind.ro&#039; &lt;br /&gt;
 # Source global definitions &lt;br /&gt;
 if [ -f /etc/bashrc ]; then &lt;br /&gt;
   . /etc/bashrc &lt;br /&gt;
 fi &lt;br /&gt;
 export PS1=&#039;[\u@\h \w]$&#039; &lt;br /&gt;
 export PATH=:/home/gabriel/scripts &lt;br /&gt;
 umask=0022&lt;br /&gt;
&lt;br /&gt;
==1.5 Flow Control==&lt;br /&gt;
===Conditii de testare===&lt;br /&gt;
Nota&lt;br /&gt;
Informatiile din acesta pagina au scopul de referinta pentru testele folosite de structurile de control ce urmeaza a fi prezentate. Ele nu trebuie invatate la acest moment in afara conextului de flow control ci doar impreuna cu structurile if..then..else, while, case etc&lt;br /&gt;
&lt;br /&gt;
Structurile de control (if..then..else, while etc) presupun conditii de testare.&lt;br /&gt;
&lt;br /&gt;
Acestea sunt:&lt;br /&gt;
 1. Pentru fisiere&lt;br /&gt;
 -e = fisierul exista&lt;br /&gt;
 -f = fisierul exista si este de tipul regular file&lt;br /&gt;
 Exemplu: -f $FILE&lt;br /&gt;
 -s = fisierul nu are dimensiunea zero&lt;br /&gt;
 -d = fisierul exista si este de tip director&lt;br /&gt;
 -c = fisierul exista si este de tip char device&lt;br /&gt;
 -b = fisierul exista si este de tip block device&lt;br /&gt;
 -r = fisierul exista si are permisiunea read&lt;br /&gt;
 -w = fisierul exista si are permisiunea write&lt;br /&gt;
 -x = fisierul exista si are permisiunea execute&lt;br /&gt;
 -g = fisierul are GUID setat&lt;br /&gt;
 -u = fisierul are SUID setat&lt;br /&gt;
 -k = fisierul are sticky bit setat&lt;br /&gt;
 -nt = fisierul este mai nou decat un alt fisier&lt;br /&gt;
 Exemplu: file1 -nt file = file1 is newer than file2&lt;br /&gt;
 ! -&amp;gt; inverseaza sensul (neaga)&lt;br /&gt;
&lt;br /&gt;
2. Pentru comparatie&lt;br /&gt;
 -eq = equal to&lt;br /&gt;
 -ne = not equal to&lt;br /&gt;
 -gt = greater than&lt;br /&gt;
 Exemplu: $i -gt -$j&lt;br /&gt;
 -ge = greater than or equal&lt;br /&gt;
 -lt = less than&lt;br /&gt;
 -le = less than or egal&lt;br /&gt;
&lt;br /&gt;
3. Pentru stringuri (siruri de caractere)&lt;br /&gt;
 -z = lungimea sirului este zero&lt;br /&gt;
 -n = lungimea sirului este non-zero&lt;br /&gt;
 = egal (comparativ cu alte limbaje de programare operatorul de comparatie este un singur egal) != diferit&lt;br /&gt;
 Exemplu: $str1 != $str2&lt;br /&gt;
 -a = SI LOGIC (AND)&lt;br /&gt;
 -o = SAU LOGIC (OR)&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Testul este adevarat daca ambele conditii sunt adevarate simultan (valoarea variabilei USER este root si valoarea variabilei SHELL este bash)&lt;br /&gt;
 $USER = &amp;quot;root&amp;quot; -a $SHELL = &amp;quot;bash&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In cazul comparatiei a doua stringuri din punct de vedere al sintaxei bash este obligatoriu un spatiu inainte de = (egal) si un spatiu dupa = (egal).&lt;br /&gt;
 Exemplu: $USER=&amp;quot;root&amp;quot; este gresit, $USER = &amp;quot;root&amp;quot; este corect.&lt;br /&gt;
&lt;br /&gt;
2. Testul este adevarat daca una dintre conditii este adevarata(i mai mic ca 10 SAU i mai mare ca 100) $i -lt 10 -o $i gt 100&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Contiditiile de testare prezentate mai sus sunt doar cele mai folosite. Pentru lista completa executati: &lt;br /&gt;
  man test &lt;br /&gt;
  test EXPR &#039;&#039;sau&#039;&#039; [ EXPR ] #au acelasi rezultat.&lt;br /&gt;
&lt;br /&gt;
===If..then..else===&lt;br /&gt;
Cea mai simpla constructie de flow control este cea conditionala reprezentata de if.&lt;br /&gt;
In functie de o valoarea de adevar a unei conditii se stabilesc instructiunile ce trebuie executate. Conditiile de test se refera la proprietati ale fisierelor, comparatii numerice sau sunt referitoare la stringuri.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if este:&lt;br /&gt;
 if [ conditie_de_test ] then lista_de_instructiuni fi&lt;br /&gt;
Daca conditia de test este adevarata se executa lista de instructiuni, altfel aceasta nu se executa.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Daca primul argument al scriptului este fisier se executa: cat fisier&lt;br /&gt;
 if [ -f $1 ] then cat $1 fi&lt;br /&gt;
&lt;br /&gt;
2. Daca valoarea variabilei i este 10 se afiseaza mesajul &amp;quot;Variabila i are valoarea 10&amp;quot; if [ $i -eq 10 ] then echo &amp;quot;Variabila i are valoarea 10&amp;quot; fi&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if..else este:&lt;br /&gt;
 if [ conditie_de_test ] then lista_de_instructiuni else lista_de_instructiuni_default fi&lt;br /&gt;
&lt;br /&gt;
Data conditia de test este adevarata se executa lista_de_instructiuni, altfel se executa lista_de_instructiuni_default&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Daca valoarea variabilei VARSTA citita de la tastatura este mai mica decat 18 se afiseaza mesajul &amp;quot;Esti minor!&amp;quot;, altfel se afiseaza mesajul &amp;quot;Esti major!&amp;quot;&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 echo &amp;quot;Introdu varsta:&amp;quot; &lt;br /&gt;
 read VARSTA &lt;br /&gt;
 if [ $VARSTA -lt 18 ]; then&lt;br /&gt;
   echo &amp;quot;Esti minor!&amp;quot; &lt;br /&gt;
 else &lt;br /&gt;
   echo &amp;quot;Esti major!&amp;quot; &lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if..elif..else este:&lt;br /&gt;
&lt;br /&gt;
 if [ conditie_de_test1 ]; then&lt;br /&gt;
   &#039;&#039;lista_de_instructiuni_1&#039;&#039; &lt;br /&gt;
 elif [ conditie_de_test2 ]; then&lt;br /&gt;
   &#039;&#039;lista_de_instructiuni_2&#039;&#039; &lt;br /&gt;
 elif [ conditie_de_test3 ]; then&lt;br /&gt;
   &#039;&#039;lista_de_instructiuni_3&#039;&#039; &lt;br /&gt;
 else&lt;br /&gt;
   &#039;&#039;lista_de_instructiuni_default&#039;&#039;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplu:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 Daca variabila ORA citita de la tastatura este mai mica decat 12 se afiseaza mesajul &amp;quot;Buna dimineata&amp;quot;, daca este intre 12 si 18 se afiseaza mesajul &amp;quot;Buna ziua&amp;quot;, daca este intre 18 si 24 se afiseaza &amp;quot;Noapte Buna!&amp;quot;. Pentru orice alta situatie se afiseaza mesajul &amp;quot;Eroare!&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 read i &lt;br /&gt;
 if [ $i -lt 12 ]; then&lt;br /&gt;
   echo &amp;quot;Buna dimineata!&amp;quot; &lt;br /&gt;
 elif [ $i -ge 12 -a $i -lt 18 ]; then &lt;br /&gt;
   echo &amp;quot;Buna ziua!&amp;quot; &lt;br /&gt;
 elif [ $i -ge 18 -a $i -le 24 ]; then &lt;br /&gt;
   echo &amp;quot;Noapte buna !&amp;quot; &lt;br /&gt;
 else &lt;br /&gt;
   echo &amp;quot;Eroare!&amp;quot; &lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
-a reprezinta SI LOGIC (AND). Testul este adevarat daca ambele conditii sunt adevarate simultan.&lt;br /&gt;
&lt;br /&gt;
-o reprezinta SAU LOGIC (OR). Testul este adevarat daca una dintre contitii este adevarata.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplu&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Testul este adevarat daca ambele conditii sunt adevarate (primul parametru este fisier si exista si are si permisiunea de read). Ambele conditii sunt adevarate simultan.&lt;br /&gt;
 if [ -e $1 -a -r ]&lt;br /&gt;
&lt;br /&gt;
2. Testul este adevarat daca primul parametru primit de script este fisier SAU acesta este director. Una dintre conditii este adevarata.&lt;br /&gt;
 if [ -f $1 -o -d $1 ]&lt;br /&gt;
&lt;br /&gt;
===For===&lt;br /&gt;
For se foloseste pentru a executa o sectiune de cod de un numar repetat de ori&lt;br /&gt;
(ciclu). Varianta clasica de for din Bash este diferita de cea din alte limbaje de programare.&lt;br /&gt;
Sintaxa pentru for este:&lt;br /&gt;
for VAR in lista_de_valori do instructiuni done&lt;br /&gt;
Se executa instructiunile specificate de atatea ori cate valori avem in lista. Pentru fiecare iteratie variabila VAR ia o valoare din lista_de_valori. Separatorul pentru valorile din lista este default spatiu sau valoarea variabilei globale IFS.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Script care exemplifica ciclul de tip for prin trimiterea unui pachet ping la fiecare din cele 3 IP-uri.&lt;br /&gt;
&lt;br /&gt;
Instructiunile dintre do si done se executa de atatea ori cate valori avem in lista (3 valori).&lt;br /&gt;
&lt;br /&gt;
Pentru fiecare ciclu valoarea variabilei IP este o valoare din lista. Valorile din lista sunt separate prin spatiu.&lt;br /&gt;
 #!/bin/bash for IP in 192.168.0.1 192.168.0.2 192.168.0.3 do ping -c 1 $IP done&lt;br /&gt;
&lt;br /&gt;
2. Exemplu for modificand valoara variabilei IFS care este separatorul valorilor.&lt;br /&gt;
 #!/bin/bash #Acest script afiseaza fiecare director din $PATH pe cate un rand IFS=: for DIR in $PATH do echo $DIR done&lt;br /&gt;
&lt;br /&gt;
In Bash exista si structura de tip for ca in C/C++. Aceasta este insa mai putin folosita.&lt;br /&gt;
&lt;br /&gt;
 Exemplu&lt;br /&gt;
 for ca in C/C++:&lt;br /&gt;
 LIMIT=10 for((a=0;a&amp;lt;=$LIMIT;a++)) do echo $a done&lt;br /&gt;
&lt;br /&gt;
===While===&lt;br /&gt;
Structura de tip while se foloseste pentru a executa o serie de instructiuni (cele&lt;br /&gt;
dintre do si done) atata timp cat conditia de test este adevarata.&lt;br /&gt;
&lt;br /&gt;
while [ conditie_de_test ] do lista_de_instructiuni done&lt;br /&gt;
&lt;br /&gt;
Exemplu while:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 #script care afiseaza numerele intre 0 zi 100&lt;br /&gt;
 LIMIT=100&lt;br /&gt;
 i=0&lt;br /&gt;
 while [ $i –le $LIMIT ]&lt;br /&gt;
 do&lt;br /&gt;
 echo &amp;quot;i=$i&amp;quot;&lt;br /&gt;
 let i=i+1&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Case===&lt;br /&gt;
Structura de tip case se foloseste pentru a executa o serie de instructiuni in functie de diferite conditii de testare.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru case este:&lt;br /&gt;
&lt;br /&gt;
 case VARIABILA in&lt;br /&gt;
 valoare1)&lt;br /&gt;
 instructiuni1&lt;br /&gt;
 ;;&lt;br /&gt;
 valoare2)&lt;br /&gt;
 instructiuni&lt;br /&gt;
 ;;&lt;br /&gt;
 *)&lt;br /&gt;
 instructiuni_default&lt;br /&gt;
 ;;&lt;br /&gt;
 esac&lt;br /&gt;
 * -&amp;gt; reprezinta instructiunile ce se vor executa default daca variabila nu are niciuna dintre valorile de mai sus.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 #!/bin/bash echo &amp;quot;Introdu nr:&amp;quot; read nr case $nr in 1) echo &amp;quot;nr este 1&amp;quot; ;; 2) echo &amp;quot;nr este2&amp;quot; ;; *) echo &amp;quot;nr are alta valoare&amp;quot; ;; esac&lt;br /&gt;
Structura de tip case poate fi oricand inlocuita cu o structura de tip if..elif..else&lt;br /&gt;
&lt;br /&gt;
Exemplul de mai sus folosind if..elif..else este:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 echo &amp;quot;Introdu nr:&amp;quot;&lt;br /&gt;
 read nr&lt;br /&gt;
 if [ $nr -eq 1 ]&lt;br /&gt;
 then echo &amp;quot;nr este 1&amp;quot;&lt;br /&gt;
 elif [ $nr -eq 2 ]&lt;br /&gt;
 then&lt;br /&gt;
 echo &amp;quot;nr este 2&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
 echo &amp;quot;nr este altceva&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Important&lt;br /&gt;
&lt;br /&gt;
Structura de tip case este foarte importanta si trebuie inteleasa bine. Toate&lt;br /&gt;
scripturile de initializare a serviciilor (cele din /etc/init.d ) folosesc o structura de tip case.&lt;br /&gt;
&lt;br /&gt;
Structura unui script de initializare din /etc/init.d este:&lt;br /&gt;
 case $1 in&lt;br /&gt;
 start) instructiuni de pornire serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 stop) instuctiuni de oprire serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 restart) instructiuni de restartare serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 *) afisare help script &lt;br /&gt;
 esac&lt;br /&gt;
&lt;br /&gt;
$1 reprezinta primul parametru al scriptului si poate fi start, stop sau restart.&lt;br /&gt;
&lt;br /&gt;
Exemplu: Pentru restartarea retelei se foloseste: /etc/init.d/network restart, unde network este scriptul de initializare iar restart primul parametru pe care-l primeste.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Presupunem ca am compilat si instalat serverul Apache in directorul /opt/apache.&lt;br /&gt;
Daemonul http se porneste ruland comanda: /opt/apache/bin/apachectl start, se opreste cu /opt/apache/bin/apachectl stop si se restarteaza cu /opt/apache/bin/apachectl restart. Se doreste pornirea serverului la butarea sistemului, mai exact la intrarea in runlevel 3.&lt;br /&gt;
&lt;br /&gt;
Etape:&lt;br /&gt;
1. Se creaza un script in /etc/init.d. Numele poate fi ales aleator, in exemplul nostru acesta se numeste init_apache&lt;br /&gt;
2. Se creaza un symlink catre /etc/init.d/init_apache in /etc/init.d/rc3.d numit S99Apache. Numele symlinkului este important sa inceapa cu litera S urmata de un umar intre 0 si 99.&lt;br /&gt;
&lt;br /&gt;
La intrarea in runlevel 3 se va rula automat acest script cu parametrul start.&lt;br /&gt;
Structura scriptului /etc/init.d/init_apache este:&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 case $1 in&lt;br /&gt;
 start)&lt;br /&gt;
 echo &amp;quot;Starting Apache...&amp;quot; /opt/apache/bin/apachectl start echo &amp;quot;OK&amp;quot;&lt;br /&gt;
 ;;&lt;br /&gt;
 stop) echo &amp;quot;Shutting down Apache...&amp;quot; /opt/apache/bin/apachectl stop echo &amp;quot;OK&amp;quot;&lt;br /&gt;
 ;;&lt;br /&gt;
 restart) $0 stop $0 start&lt;br /&gt;
 ;;&lt;br /&gt;
 *) echo &amp;quot;init_apache &amp;lt;start|stop|restart&amp;gt;&amp;quot;&lt;br /&gt;
 esac&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Pentru detalii complete despre modul de pornire a serviciilor la butare cititi capitolul &amp;quot;Managementul Serviciilor&amp;quot; din cursul &amp;quot;Linux Basic Administration&amp;quot; disponibil de asemenea online.&lt;br /&gt;
&lt;br /&gt;
===Select===&lt;br /&gt;
Structura de tip select este specifica doar Bash-ului si se foloseste pentru crearea de meniuri.&lt;br /&gt;
&lt;br /&gt;
Sintaxa acesteia este:&lt;br /&gt;
 select MENUITEM in menu_list&lt;br /&gt;
 do&lt;br /&gt;
 lista_de_comenzi&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
Detalii:&lt;br /&gt;
- menu_list este lista de meniuri. Valorile din lista sunt separate prin spatiu;&lt;br /&gt;
- intre do si done sunt instruciunile ce se executa in functie de meniul ales;&lt;br /&gt;
- intre do si done avem acces la urmatoarele 2 variabile: MENUITEM care contine meniul&lt;br /&gt;
&lt;br /&gt;
selectat si REPLY care se creaza automat si contine inputul userului (ce a scris acesta la consola);&lt;br /&gt;
&lt;br /&gt;
- PS3 contine prompterul de selectare a meniurilor;&lt;br /&gt;
- userul alege un meniu din lista folosind un nr. de ordine: alege 1 pentru primul meniu, 2 pentru al doilea etc;&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 PS3=&amp;quot;Alege:&amp;quot;&lt;br /&gt;
 select ITEM in &amp;quot;Afiseaza continut /etc&amp;quot; &amp;quot;Afiseaza spatiu liber&amp;quot; &amp;quot;Exit&amp;quot;&lt;br /&gt;
 do&lt;br /&gt;
 case $REPLY in&lt;br /&gt;
 1) ls -l /etc&lt;br /&gt;
 ;;&lt;br /&gt;
 2) df -h&lt;br /&gt;
 ;;&lt;br /&gt;
 3) exit 0&lt;br /&gt;
 ;;&lt;br /&gt;
 *) echo &amp;quot;Optiune incorecta&amp;quot;&lt;br /&gt;
 esac&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
==1.6 Substituirea comenzilor==&lt;br /&gt;
&lt;br /&gt;
Unei variabile i se poate asigna o valoare in 2 moduri:&lt;br /&gt;
&lt;br /&gt;
1. Folosind NUME_VAR=valoare&lt;br /&gt;
&lt;br /&gt;
Exemplu: &lt;br /&gt;
  &lt;br /&gt;
  EDITOR=&amp;quot;VIM&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Substituind o comanda cu outputul ei&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
  &lt;br /&gt;
  VAR=`ls /etc` -&amp;gt; in acest exemplu comanda ls /etc se substituie sau inlocuieste cu outputul ei care se asigneaza variabilei VAR. Variabila VAR va contine outputul comenzii ls -l.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Substituirea unei comenzi cu outputul ei reprezinta unul dintre caracteristicile cele mai puternice ale Bash-ului, iar majoritatea scripturilor folosesc acest mod de lucru.&lt;br /&gt;
&lt;br /&gt;
Pentru a substitui o comanda cu outputul ei exista 2 variante:&lt;br /&gt;
&lt;br /&gt;
1. Comanda sa incadreza in backquotes ( ``). Atentie, backquotes nu sunt apostroafe sau ghilimele simple.&lt;br /&gt;
&lt;br /&gt;
Exemplu: &lt;br /&gt;
 ME=`whoami ` -&amp;gt; variabila ME va contine outputul comenzii whoami (atentie! nu exista spatii in jurul semnului = (stanga/dreapta)&lt;br /&gt;
&lt;br /&gt;
2. Comanda se incadreza intre $( si )&lt;br /&gt;
&lt;br /&gt;
Exemplu: &lt;br /&gt;
  ETH0= $(ifconfig eth0) -&amp;gt; variabila numita ETH0 va contine outputul comenzii &#039;&#039;&#039;ifconfig eth0&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Exemplu script ce nu poate fi rulat de catre root&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 &lt;br /&gt;
 if [ &amp;quot;$(whoami)&amp;quot; = &amp;quot;root&amp;quot; ]&lt;br /&gt;
 then&lt;br /&gt;
   echo &amp;quot;Esti root, sorry !&amp;quot;&lt;br /&gt;
   exit 1;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
#incep instructiunile ce nu pot fi rulate de catre root&amp;quot;&lt;br /&gt;
 ls -la ~&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In momentul in care o variabila de tip string este testat folosind un test pentru stringuri este bine ca aceasta sa fie incadrata intre ghilimele duble pentru a forta tipul ei catre string.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
&lt;br /&gt;
  VAR=&amp;quot;`ifconfig eth0`&amp;quot; &lt;br /&gt;
  if [ -z &amp;quot;$VAR&amp;quot; ]; then &lt;br /&gt;
   echo &amp;quot;Interfata eth0 nu exista!&amp;quot; &lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
== 1.7 Subshells==&lt;br /&gt;
&lt;br /&gt;
Utilizarea subshell-urilor în Bash poate fi avantajoasă din mai multe motive, inclusiv:&lt;br /&gt;
&lt;br /&gt;
 1. Izolarea comenzilor: comenzile executate într -un subshell sunt izolate de cochilie părinte. Aceasta înseamnă că orice modificări aduse la variabile, directoare sau alte setări de mediu din subshell nu vor afecta shell-ul părinte.&lt;br /&gt;
&lt;br /&gt;
 2. Scoping: Variabilele definite într -un subshell au un domeniu local și nu vor afecta variabile cu același nume în shell-ul părinte.&lt;br /&gt;
&lt;br /&gt;
 3. Manevrarea erorilor: subshell -urile pot fi utilizate pentru o mai bună gestionare a erorilor. De exemplu, puteți executa o serie de comenzi într-un subshell și puteți verifica starea de returnare a acesteia fără a afecta fluxul principal al scriptului dvs.&lt;br /&gt;
&lt;br /&gt;
Iată câteva exemple de utilizare a subshell-urilor în Bash:&lt;br /&gt;
&lt;br /&gt;
Schimbarea directorului temporar:&lt;br /&gt;
&lt;br /&gt;
Aceasta schimbă temporar directorul în/calea/în/director, execută comanda &#039;&#039;ls&#039;&#039;, apoi se întoarce în directorul original. Schimbarea directorului afectează doar subshell-ul.&lt;br /&gt;
&lt;br /&gt;
-Execuție paralelă:&lt;br /&gt;
&lt;br /&gt;
Aceasta execută mai multe comenzi concomitent în subshell-uri, permițându-le să funcționeze în paralel.&lt;br /&gt;
&lt;br /&gt;
-Manevrarea erorilor:&lt;br /&gt;
&lt;br /&gt;
Aceasta execută comanda1 și comanda2 într -un subshell. Dacă Command1 sau Command2 eșuează (returnează un statut de ieșire non-zero), atunci este ecou „eroare”.&lt;br /&gt;
&lt;br /&gt;
-Setări temporare ale mediului:&lt;br /&gt;
&lt;br /&gt;
Aceasta stabilește o variabilă de mediu temporară la valoare pentru durata comenzii. Odată ce comanda se termină, variabila revine la valoarea sa anterioară (sau este nesetată dacă nu exista înainte).&lt;br /&gt;
&lt;br /&gt;
Subshell-urile sunt versatile și pot fi utilizate creativ pentru a atinge diverse obiective de script, menținând controlul asupra mediului și fluxului de execuție al comenzilor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;In incheierea cursului Linux Essentials:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La ce pot fi folosite parantezele ( ) in bash?&lt;br /&gt;
&lt;br /&gt;
Utilizari comune&lt;br /&gt;
    1. Substitutia comenzii:&lt;br /&gt;
        ◦ $(command) or `command`: Executa comanda si ii substituie iesirea.&lt;br /&gt;
        ◦ Example: echo $(date) or echo \date``&lt;br /&gt;
    2. Expansie aritmetica:&lt;br /&gt;
        ◦ (( expression )): Performa operatuni aritmetice si le evalueaza expresia.&lt;br /&gt;
        ◦ Example: (( x = 5 + 3 ))&lt;br /&gt;
    3. Crearea unui subshell:&lt;br /&gt;
        ◦ ( commands ): Execute comenzi intr-un subshell, izolandu-i mediul de cea principala.&lt;br /&gt;
        ◦ Example: (cd /path/to/directory &amp;amp;&amp;amp; ls)&lt;br /&gt;
    4. Declararea unei functii:&lt;br /&gt;
        ◦ function_name () { commands; }: Declara o functie.&lt;br /&gt;
    5. Gruparea comenzilor:&lt;br /&gt;
        ◦ { commands; }: Grupeaza mai multe comenzi impreuna, permitandu-le sa ruleze ca si o singura comanda.&lt;br /&gt;
        ◦ Example: { echo &amp;quot;Hello&amp;quot;; echo &amp;quot;World&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Essentials_Pagina_7|Pagina anterioară]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Essentials_Pagina_8&amp;diff=547</id>
		<title>Essentials Pagina 8</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Essentials_Pagina_8&amp;diff=547"/>
		<updated>2025-04-11T08:14:48Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* 1.6 Substituirea comenzilor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Laborator 8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Shell Scripts=&lt;br /&gt;
&lt;br /&gt;
==1.1 Introducere in Bash==&lt;br /&gt;
Shellul este interpretorul de comenzi. Acesta parseaza comenzile introduse de&lt;br /&gt;
utilizator, le verifica din punct de vedere al sintaxei si le trimite kernel-ului spre executie.&lt;br /&gt;
&lt;br /&gt;
Exista mai multe shelluri (Bourne, C Shell, recent aparute Zsh si Fish, etc), dar default pe Linux este shellul numit Bash (Bourne Again Shell). Acesta este reprezentat de fisierul &#039;&#039;/bin/bash&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Pe langa interpretarea si executia comenzilor, Bash-ul ofera si alte facilitati printre&lt;br /&gt;
care: editarea liniei de comanda, history, alias-uri, dar si un limbaj de programare structurat propriu.&lt;br /&gt;
&lt;br /&gt;
Un script de shell este un fisier text (ASCII) care contine comenzi de shell organizate intr-un mod logic. Pe langa comenzi, script-ul mai contine si variabile (locale sau globale), parametri pozitionali precum si structuri de programare specifice (if..then..else, while, do, until, for, case, selsect etc). Un script este folosit pentru a imbina comenzi si diverse structuri de control pentru a oferi o noua functionalitate sau a automatiza task-uri.&lt;br /&gt;
&lt;br /&gt;
Etapele crearii unui script sunt:&lt;br /&gt;
&lt;br /&gt;
a) crearea unui fisier text folosind editorul preferat (Exemplu: vim)&lt;br /&gt;
b) editarea fisierului pentru a contine functionalitatea dorita&lt;br /&gt;
c) testarea scriptului adica executia/rularea acestuia&lt;br /&gt;
&lt;br /&gt;
Modul de executie a unui script numit script1:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Din directorul care contine scriptul se ruleaza : ./script1&lt;br /&gt;
Fisierul script1 trebuie sa aiba dreptul de executie. Fiindca directorul curent (.) nu&lt;br /&gt;
se afla in $PATH (altfel grave probleme de securitate), scriptul trebuie sa fie executat cu calea absoluta sau cu ./nume_script In acest caz se porneste un shell nou ca sub proces al shellului curent in care se executa comenzile din script.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Din directorul care contine fisierul script1 se ruleaza: . script1 sau source script1.&lt;br /&gt;
Se executa comenzile din script1 in shell-ul curent. Fisierul script1 nu trebuie sa&lt;br /&gt;
aiba dreptul de executie. Una dintre diferentele dintre prima si a doua varianta este ca variabilele exportate sau globale sunt vizibile in shell-ul curent in varianta a doua, dar nu si in prima varianta.&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Varianta cea mai folosita de executie a unui script este prima: ./script&lt;br /&gt;
Un script trebuie sa contina pe prima linie o referire la programul cu care se executa (Bash, Perl, PHP, Python etc). Astfel prima linie a unui script Bash este invariabil: #!/bin/bash. In interiorul scriptului #(diez) reprezinta un comentariu. Exceptie face prima linie.&lt;br /&gt;
&lt;br /&gt;
echo se foloseste pentru afisa un string (sir de caractere) sau o variabila la consola.&lt;br /&gt;
Exemplu: echo &amp;quot;Linux&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Script care afiseaza mesajul: Acesta este primul exemplu !&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 echo &amp;quot;Acesta este primul exemplu !&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Script care creaza un fiser numit continut_etc.txt in directorul curent ce contine fisierele si directoarele din directorul /etc, iar apoi afiseaza spatiul total, ocupat si liber de pe fiecare partitie de pe Hard Disk.&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 ls -l /etc &amp;gt; continut_etc.txt&lt;br /&gt;
 echo &amp;quot;Fisierul continut_etc.txt a fost creat in directorul curent!&amp;quot;&lt;br /&gt;
 echo &amp;quot;Informatii partitii:&amp;quot;&lt;br /&gt;
 df -h Important&lt;br /&gt;
&lt;br /&gt;
O cunoastere acceptabila a modului de creare de scripturi este esentiala pentru orice Administrator de sistem. In cazul persoanelor incepatoare care nu au experienta in programare (orice limbaj) procesul de scripting pare la prima vedere extrem de complicat.&lt;br /&gt;
&lt;br /&gt;
Este nevoie de multe exercitii si exemple pentru o intelegere aprofundata. Intotdeauna se incepe cu exercitii simple si anume scripturi formate din cateva randuri.&lt;br /&gt;
&lt;br /&gt;
==1.2 Variabile, constante si functii==&lt;br /&gt;
&lt;br /&gt;
Prezentare generala:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; O variabila reprezinta un nume pentru o locatie de memorie unde se gaseste o valoare. Se obisnuieste (nu este obligatoriu) ca variabilele sa se scrie cu litera mare.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Comparativ cu alte limbaje de programare (C/C++, JAVA) variabilele in Bash nu au tip. Ele sunt string-uri, dar in functie de context pot fi evaluate ca integer etc.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; O variabila se declara: NUME_VAR=valoare&lt;br /&gt;
&lt;br /&gt;
Important&lt;br /&gt;
Nu se foloseste spatiu intre NUME_VAR si valoare. i = 1 reprezinta eroare. Sintaxa bash - ului este extrem de stricta. Un spatiu in plus sau in minus reprezinta o eroare fatala.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 NUME=&amp;quot;dan&amp;quot;&lt;br /&gt;
 varsta=20&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4&#039;&#039;&#039;. Pentru a ne referi la continutul unei varibile se foloseste semnul $ (dollar) in fata numelui variabilei.&lt;br /&gt;
Exemplu: echo $varsta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5&#039;&#039;&#039;. Variabilele pot fi locale sau globale. Cele locale sunt vizibile doar in shell-ul curent, iar cele globale sunt vizibile in shell-ul curent si in toate subprocesele shell-ului curent. Astfel in interiorul unui script daca se foloseste o variabila globala aceasta va fi accesibila oricarei comenzi/program lansata din acel script. Variabilele globale nu sunt accesibile parintelui unui proces, adica shell-ului de unde s-a executat scriptul. Exceptie face varianta 2 de executie a unui script adica folosind source nume_script&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6&#039;&#039;&#039;. Pentru a declara o variabila globala aceasta trebuie exportata. Se foloseste cuvantul cheie export&lt;br /&gt;
&lt;br /&gt;
 Exemplu: export VARSTA=20&lt;br /&gt;
 variabilele globale se numesc de environment;&lt;br /&gt;
 pentru a vizualiza variabilele locale se foloseste comanda set;&lt;br /&gt;
 pentru a vizualiza variabilele globale se foloseste comanda env;&lt;br /&gt;
 pentru sterge o variabila se foloseste comanda unset NUME_VAR;&lt;br /&gt;
&lt;br /&gt;
Exemplu de varibile globale predefinite:&lt;br /&gt;
 PATH -&amp;gt; contine o lista de directoare in care shell-ul cauta comanda care se executa.&lt;br /&gt;
&lt;br /&gt;
Pentru a concatena un string la variabila PATH se foloseste caracterul : (doua puncte).&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&lt;br /&gt;
Daca dorim sa adaugam directorul /home/dan/scripts in PATH: export&lt;br /&gt;
 PATH=PATH:/home/stud/scripts&lt;br /&gt;
&lt;br /&gt;
Dupa aceasta scripturi si comenzi din /home/stud/scripts pot fi rulate in orice director ne am afla doar prin numele lor. Altfel trebuie folosita calea absoluta sau aflandu-ne in&lt;br /&gt;
director se executa: ./nume_comanda&lt;br /&gt;
 HOSTNAME -&amp;gt; contine hostname-ul calculatorului&lt;br /&gt;
 SHELL -&amp;gt; contine shell-ul default&lt;br /&gt;
 HISTSIZE - contine nr. de comenzi care vor fi memorate in history&lt;br /&gt;
 USER -&amp;gt; contine EUID&lt;br /&gt;
 PWD -&amp;gt; contine directorul curent&lt;br /&gt;
 OLDPWD -&amp;gt; contine directorul precedent si se foloseste de comanda: cd –&lt;br /&gt;
 HOME -&amp;gt; contine home directory al EUID&lt;br /&gt;
 RANDOM -&amp;gt; variabila al carei continut este pseudoaleator&lt;br /&gt;
 TMOUT -&amp;gt; nr in secunde dupa care se face logout automat daca nu se executa nicio comanda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7&#039;&#039;&#039;. Diferenta dintre ghilimele simple(apostrof) si ghilimele duble este aceea ca ghilimele simple nu interpreteaza $ ca si caracter special. In interiorul ghilimelelor simple fiecare caracter special cu exceptia &#039; (ghilimea simpla) este interpretat literal.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 varsta=20 echo &amp;quot;$varsta&amp;quot; ##se afiseaza 20 echo &#039;$varsta&#039; ##se afiseaza $varsta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8&#039;&#039;&#039;. O variabila poate fi declarata read-only sau de tip array. O variabila read-only se mai numeste si constanta.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 &#039;&#039;&#039;1.&#039;&#039;&#039; var1 este readonly. Aceasta nu poate fi modificata sau stearsa folosind unset.&lt;br /&gt;
 declare -r var1=7&lt;br /&gt;
 &#039;&#039;&#039;2.&#039;&#039;&#039; Pentru a declara un array/vector:&lt;br /&gt;
 ARRAY=(unu doi trei) echo ${ARRAY[*]} echo ${ARRAY[1]} i=2 echo&lt;br /&gt;
 ${ARRAY[]} unset ARRAY[1] unset ARRAY&lt;br /&gt;
 ARRAY nu este cuvant cheie. In loc de ARRAY poate fi orice cuvant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;9&#039;&#039;&#039;. Pentru a citi o variabila de la tastatura se foloseste cuvantul cheie read&lt;br /&gt;
Exemplu:&lt;br /&gt;
 #!/bin/bash echo &amp;quot;Introdu nume fisier:&amp;quot; read FILE echo &amp;quot;Fisierul introdus este $FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10&#039;&#039;&#039;. In bash exista caractere speciale care sunt interpretate in mod deosebit.&lt;br /&gt;
 Exemple: $ (dollar), &amp;quot;(ghilimea dubla) sau \ (backslash). Pentru a anula efectul special al&lt;br /&gt;
caracterului, acesta se precede cu \ (backslash).&lt;br /&gt;
&lt;br /&gt;
 Exemplu: echo \$var -&amp;gt; Afiseaza $var. $ nu mai este caracter special.&lt;br /&gt;
&lt;br /&gt;
==1.3 Parametri pozitionali==&lt;br /&gt;
Bash-ul foloseste parametri speciali la care ne putem referi in interiorul unui script&lt;br /&gt;
pentru a avea acces la anumite valori. Acesti parametri speciali se pot folosi ca si&lt;br /&gt;
variabilele, doar ca exista default si nu trebuie creati. Continutul acestora este de asemenea standard.&lt;br /&gt;
&lt;br /&gt;
Acestia sunt:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; $0 - contine numele scriptului&lt;br /&gt;
Scriptul poate actiona diferit in functie de numele cu care a fost rulat ( Exemplu:&lt;br /&gt;
daca se ruleaza folosind un simlink al scriptului. Vezi comanda /bin/egrep care este un simlink catre /bin/grep dar are totusi functionalitate diferita).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; $1 - reprezinta primul argument al scriptului, $2 al doilea argument al scriptului etc. Incepand cu argumentul 10 acesta trebuie incadrat intre acolade ${10}, ${11} etc.&lt;br /&gt;
Se folosesc pentru a evita erori in momentul in care scriptul este rulat fara argumente sau cu un alt nr. de argumente (iar acesta asteapta sa primeasca argumente).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; $? - reprezinta statusul ultimei comenzi executate.&lt;br /&gt;
In Bash Zero este statusul pentru non-error iar diferit de zero este statusul pentru eroare. Orice comanda/program are un status de exit, zero sau non-zero. Se foloseste pentru a continua executia scriptului (sau a modifica comportamentul acestuia) in functie de statusul comenzilor anterioare.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; $# - reprezinta nr. de argumente ale scriptului Se poate lua o decizie in functie de nr. de argumente cu care a fost rulat scriptul.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.&#039;&#039;&#039; $* - reprezinta toate argumentele date scriptului.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.&#039;&#039;&#039; $$ - reprezinta PID shell.&lt;br /&gt;
Astel in functie de cum rulam scriptul $$ are alta valoare:source f1 - $$ reprezinta PID bash (shell curent) ./f1 - $$ reprezinta PID noului sub-shell creat in care se executa comenzile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.&#039;&#039;&#039; $! - reprezinta PID ultimului proces executat in background.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Script care sterge fisierul sau directorul pe care-l primeste ca argument&lt;br /&gt;
 #!/bin/bash rm -rf $1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Afisarea numelui scriptului&lt;br /&gt;
 #!/bin/bash Echo &amp;quot;Numele scriptului executat este: $0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==1.4 Alte facilitati Bash==&lt;br /&gt;
===Alias===&lt;br /&gt;
Un alias reprezinta un mod prin care o comanda sau o serie de comenzi se executa folosind un alt nume.&lt;br /&gt;
Pentru a crea un alias se foloseste comanda: alias comanda_noua=&#039;comanda_substituita&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. alias copy=&#039;cp&#039;&lt;br /&gt;
2. alias search=&#039;grep&#039;&lt;br /&gt;
3. alias ls=&#039;ls -F&#039;&lt;br /&gt;
4. alias rm=&#039;rm -i&#039;&lt;br /&gt;
5. alias ll=&#039;ls -l&#039;&lt;br /&gt;
6. alias stop=&#039;kill -9&#039;&lt;br /&gt;
&lt;br /&gt;
Daca aliasul este compus din mai multe cuvinte acestea trebuie incadrate intre&lt;br /&gt;
ghilimele simple (apostrof).Pentru a vizualiza toate aliasurile din sistem se foloseste comanda alias fara nici un argument.Pentru a executa comanda originala in locul aliasului se foloseste \ (backslash) urmat de comanda.&lt;br /&gt;
&lt;br /&gt;
Example: \ls&lt;br /&gt;
Pentru a sterge un alias se foloseste comanda unalias&lt;br /&gt;
Exemplu: unalias ls&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Un alias exista doar in shell-ul curent (nu exista nici macar in subshell-urile shell-ului curent).&lt;br /&gt;
&lt;br /&gt;
===Customizare Environment===&lt;br /&gt;
Prompting variables (prompt strings)&lt;br /&gt;
&lt;br /&gt;
Bash foloseste 4 variabile speciale numite &amp;quot;prompt strings&amp;quot;: PS1, PS2, PS3 si PS4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; PS1 este numit &amp;quot;primary prompt string&amp;quot; si reprezinta prompterul curent.&lt;br /&gt;
De cele mai multe ori acesta se modifica pentru a arata informatii cat mai utile despre sesiunea curenta.&lt;br /&gt;
&lt;br /&gt;
 PS1 foloseste niste macro-uri care se expandeaza cu un anumit continut astfel:&lt;br /&gt;
 \A - current time in HH:MM hours format&lt;br /&gt;
 \d - current date&lt;br /&gt;
 \@ - the current time in 12 hours format&lt;br /&gt;
 \H - the hostname&lt;br /&gt;
 \h - the hostname up to the first dot (.)&lt;br /&gt;
 \s - the name of the shell&lt;br /&gt;
 \u - username of the EUID&lt;br /&gt;
 \w - the current working directory&lt;br /&gt;
 \W - the current working directory (basename) - relativ&lt;br /&gt;
 \$ - if EUID==0 print # else print $&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Un exemplu excelent de modificare PS1 este: export PS1=&#039;[\u@\h \w]$&#039;&lt;br /&gt;
Avand acest prompter adminul are intotdeauna informatii despre userul cu care s-a conectat, host-ul pe care este conectat precum si calea absoluta a directorului curent. Linia de mai sus se adauga in fisierul de customizare ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; PS2 este numit &amp;quot;secondary prompt string&amp;quot; si are valoarea default &amp;gt; (mai mare).&lt;br /&gt;
Se foloseste atunci cand se scrie o comanda incompleta si se apasa ENTER.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; PS3 se numeste &amp;quot;prompt string for the select command&amp;quot; si se foloseste in scripting impreuna cu comanda select&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; PS4 se numeste &amp;quot;prompt string for the xtrace option&amp;quot; si reprezinta un prompt string folosit in debugging si flow control.&lt;br /&gt;
&lt;br /&gt;
===Environment===&lt;br /&gt;
Fiecare utilizator are propriul mediu de lucru numit si Environment. Customizarea&lt;br /&gt;
Environmentului presupune modificarea unor variabile si parametri astfel incat mediul de lucru sa fie cat mai prietenos si sa ne ofere cat mai multe informatii.&lt;br /&gt;
Din mediul de lucru al unui utilizator fac parte: aliasurile sale, umask, modul de&lt;br /&gt;
afisare al prompterului, variabila PATH in care shellul cauta comenzile, ulimit etc&lt;br /&gt;
&lt;br /&gt;
Exista fisiere de initializare pentru fiecare user care sunt citite de shell la fiecare&lt;br /&gt;
pornire a acestuia:&lt;br /&gt;
&lt;br /&gt;
~/.bashrc - este primul fisier citit de shell la login. In acest fisier trebuie declarate variabile,&lt;br /&gt;
alias-uri etc pentru fiecare user.&lt;br /&gt;
~/.bash_profile - este citit dupa ~/.bashrc&lt;br /&gt;
~/.bash_logout - este citit de shell inainte de logout. In acest fisier se pot reseta variabile, sterge fisiere temporare sau alte functii care vrem sa aiba loc inainte de logout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fisierul /etc/profile este un alt fisier de customizare &amp;quot;system-wide&amp;quot;. Acesta nu&lt;br /&gt;
apartine unui anumit user, iar in el se configureaza mediul pentru toti userii. Il folosim de exemplu daca dorim setarea unui alias pentru toti userii din sistem.&lt;br /&gt;
Aceste fisiere nu sunt recitite automat de shell dupa modificare. Toate configurarile au efect dupa o noua logare in cazul ~/.bashrc sau ~/.bash_profile sau dupa o restartare a sistemului in cazul /etc/profile.Pentru a forta recitirea lor se foloseste comanda source sau . (dot) urmata de nume fisier. source sau . executa comenzile din interiorul fisierului in shellul curent.&lt;br /&gt;
&lt;br /&gt;
Exemplu: source ~/.bashrc sau . ~/.bashrc&lt;br /&gt;
Daca ~/.bash_profile nu exista shell-ul cauta ~/.bash_login. Daca nici aceasta nu exista cauta ~/.profile.&lt;br /&gt;
In aceste fisiere speciale de initializare se seteaza: PS1, TMOUT, PATH, alias, umask etc pentru fiecare utilizator&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Fisierele de initializare pentru fiecare utilizator se gasesc in home directory al acestuia (~) si sunt ascunse fiindca incep cu .(punct). Pentru vizualizarea lor se foloseste comanda ls cu optiunea -a Exemplu: ls -la ~&lt;br /&gt;
&lt;br /&gt;
In functie de distributia de Linux numele si ordinea de citire a fisierelor de customizare a mediului de lucru pentru fiecare user poate sa difere. Totusi, pe marea majoritate a distributiilor de Linux (RedHat, Fedora, CentOS, Suse, Ubuntu, Kubuntu, Debian) exista ~/.bashrc. In acest caz se recomanda folosirea doar a acestuia&lt;br /&gt;
&lt;br /&gt;
Exemplu ~/.bashrc:&lt;br /&gt;
&lt;br /&gt;
 # User specific aliases and functions &lt;br /&gt;
 alias rm=&#039;rm -i&#039; &lt;br /&gt;
 alias cp=&#039;cp -i&#039; &lt;br /&gt;
 alias mv=&#039;mv -i&#039; &lt;br /&gt;
 alias cauta=find &lt;br /&gt;
 alias muta=mv &lt;br /&gt;
 alias S=&#039;ssh -l root -p 7890 ssh.crystalmind.ro&#039; &lt;br /&gt;
 # Source global definitions &lt;br /&gt;
 if [ -f /etc/bashrc ]; then &lt;br /&gt;
   . /etc/bashrc &lt;br /&gt;
 fi &lt;br /&gt;
 export PS1=&#039;[\u@\h \w]$&#039; &lt;br /&gt;
 export PATH=:/home/gabriel/scripts &lt;br /&gt;
 umask=0022&lt;br /&gt;
&lt;br /&gt;
==1.5 Flow Control==&lt;br /&gt;
===Conditii de testare===&lt;br /&gt;
Nota&lt;br /&gt;
Informatiile din acesta pagina au scopul de referinta pentru testele folosite de structurile de control ce urmeaza a fi prezentate. Ele nu trebuie invatate la acest moment in afara conextului de flow control ci doar impreuna cu structurile if..then..else, while, case etc&lt;br /&gt;
&lt;br /&gt;
Structurile de control (if..then..else, while etc) presupun conditii de testare.&lt;br /&gt;
&lt;br /&gt;
Acestea sunt:&lt;br /&gt;
 1. Pentru fisiere&lt;br /&gt;
 -e = fisierul exista&lt;br /&gt;
 -f = fisierul exista si este de tipul regular file&lt;br /&gt;
 Exemplu: -f $FILE&lt;br /&gt;
 -s = fisierul nu are dimensiunea zero&lt;br /&gt;
 -d = fisierul exista si este de tip director&lt;br /&gt;
 -c = fisierul exista si este de tip char device&lt;br /&gt;
 -b = fisierul exista si este de tip block device&lt;br /&gt;
 -r = fisierul exista si are permisiunea read&lt;br /&gt;
 -w = fisierul exista si are permisiunea write&lt;br /&gt;
 -x = fisierul exista si are permisiunea execute&lt;br /&gt;
 -g = fisierul are GUID setat&lt;br /&gt;
 -u = fisierul are SUID setat&lt;br /&gt;
 -k = fisierul are sticky bit setat&lt;br /&gt;
 -nt = fisierul este mai nou decat un alt fisier&lt;br /&gt;
 Exemplu: file1 -nt file = file1 is newer than file2&lt;br /&gt;
 ! -&amp;gt; inverseaza sensul (neaga)&lt;br /&gt;
&lt;br /&gt;
2. Pentru comparatie&lt;br /&gt;
 -eq = equal to&lt;br /&gt;
 -ne = not equal to&lt;br /&gt;
 -gt = greater than&lt;br /&gt;
 Exemplu: $i -gt -$j&lt;br /&gt;
 -ge = greater than or equal&lt;br /&gt;
 -lt = less than&lt;br /&gt;
 -le = less than or egal&lt;br /&gt;
&lt;br /&gt;
3. Pentru stringuri (siruri de caractere)&lt;br /&gt;
 -z = lungimea sirului este zero&lt;br /&gt;
 -n = lungimea sirului este non-zero&lt;br /&gt;
 = egal (comparativ cu alte limbaje de programare operatorul de comparatie este un singur egal) != diferit&lt;br /&gt;
 Exemplu: $str1 != $str2&lt;br /&gt;
 -a = SI LOGIC (AND)&lt;br /&gt;
 -o = SAU LOGIC (OR)&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Testul este adevarat daca ambele conditii sunt adevarate simultan (valoarea variabilei USER este root si valoarea variabilei SHELL este bash)&lt;br /&gt;
 $USER = &amp;quot;root&amp;quot; -a $SHELL = &amp;quot;bash&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In cazul comparatiei a doua stringuri din punct de vedere al sintaxei bash este obligatoriu un spatiu inainte de = (egal) si un spatiu dupa = (egal).&lt;br /&gt;
 Exemplu: $USER=&amp;quot;root&amp;quot; este gresit, $USER = &amp;quot;root&amp;quot; este corect.&lt;br /&gt;
&lt;br /&gt;
2. Testul este adevarat daca una dintre conditii este adevarata(i mai mic ca 10 SAU i mai mare ca 100) $i -lt 10 -o $i gt 100&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Contiditiile de testare prezentate mai sus sunt doar cele mai folosite. Pentru lista completa executati: &lt;br /&gt;
  man test &lt;br /&gt;
  test EXPR &#039;&#039;sau&#039;&#039; [ EXPR ] #au acelasi rezultat.&lt;br /&gt;
&lt;br /&gt;
===If..then..else===&lt;br /&gt;
Cea mai simpla constructie de flow control este cea conditionala reprezentata de if.&lt;br /&gt;
In functie de o valoarea de adevar a unei conditii se stabilesc instructiunile ce trebuie executate. Conditiile de test se refera la proprietati ale fisierelor, comparatii numerice sau sunt referitoare la stringuri.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if este:&lt;br /&gt;
 if [ conditie_de_test ] then lista_de_instructiuni fi&lt;br /&gt;
Daca conditia de test este adevarata se executa lista de instructiuni, altfel aceasta nu se executa.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Daca primul argument al scriptului este fisier se executa: cat fisier&lt;br /&gt;
 if [ -f $1 ] then cat $1 fi&lt;br /&gt;
&lt;br /&gt;
2. Daca valoarea variabilei i este 10 se afiseaza mesajul &amp;quot;Variabila i are valoarea 10&amp;quot; if [ $i -eq 10 ] then echo &amp;quot;Variabila i are valoarea 10&amp;quot; fi&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if..else este:&lt;br /&gt;
 if [ conditie_de_test ] then lista_de_instructiuni else lista_de_instructiuni_default fi&lt;br /&gt;
&lt;br /&gt;
Data conditia de test este adevarata se executa lista_de_instructiuni, altfel se executa lista_de_instructiuni_default&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Daca valoarea variabilei VARSTA citita de la tastatura este mai mica decat 18 se afiseaza mesajul &amp;quot;Esti minor!&amp;quot;, altfel se afiseaza mesajul &amp;quot;Esti major!&amp;quot;&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 echo &amp;quot;Introdu varsta:&amp;quot; &lt;br /&gt;
 read VARSTA &lt;br /&gt;
 if [ $VARSTA -lt 18 ]; then&lt;br /&gt;
   echo &amp;quot;Esti minor!&amp;quot; &lt;br /&gt;
 else &lt;br /&gt;
   echo &amp;quot;Esti major!&amp;quot; &lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if..elif..else este:&lt;br /&gt;
&lt;br /&gt;
 if [ conditie_de_test1 ]; then&lt;br /&gt;
   &#039;&#039;lista_de_instructiuni_1&#039;&#039; &lt;br /&gt;
 elif [ conditie_de_test2 ]; then&lt;br /&gt;
   &#039;&#039;lista_de_instructiuni_2&#039;&#039; &lt;br /&gt;
 elif [ conditie_de_test3 ]; then&lt;br /&gt;
   &#039;&#039;lista_de_instructiuni_3&#039;&#039; &lt;br /&gt;
 else&lt;br /&gt;
   &#039;&#039;lista_de_instructiuni_default&#039;&#039;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplu:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 Daca variabila ORA citita de la tastatura este mai mica decat 12 se afiseaza mesajul &amp;quot;Buna dimineata&amp;quot;, daca este intre 12 si 18 se afiseaza mesajul &amp;quot;Buna ziua&amp;quot;, daca este intre 18 si 24 se afiseaza &amp;quot;Noapte Buna!&amp;quot;. Pentru orice alta situatie se afiseaza mesajul &amp;quot;Eroare!&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 read i &lt;br /&gt;
 if [ $i -lt 12 ]; then&lt;br /&gt;
   echo &amp;quot;Buna dimineata!&amp;quot; &lt;br /&gt;
 elif [ $i -ge 12 -a $i -lt 18 ]; then &lt;br /&gt;
   echo &amp;quot;Buna ziua!&amp;quot; &lt;br /&gt;
 elif [ $i -ge 18 -a $i -le 24 ]; then &lt;br /&gt;
   echo &amp;quot;Noapte buna !&amp;quot; &lt;br /&gt;
 else &lt;br /&gt;
   echo &amp;quot;Eroare!&amp;quot; &lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
-a reprezinta SI LOGIC (AND). Testul este adevarat daca ambele conditii sunt adevarate simultan.&lt;br /&gt;
&lt;br /&gt;
-o reprezinta SAU LOGIC (OR). Testul este adevarat daca una dintre contitii este adevarata.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplu&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Testul este adevarat daca ambele conditii sunt adevarate (primul parametru este fisier si exista si are si permisiunea de read). Ambele conditii sunt adevarate simultan.&lt;br /&gt;
 if [ -e $1 -a -r ]&lt;br /&gt;
&lt;br /&gt;
2. Testul este adevarat daca primul parametru primit de script este fisier SAU acesta este director. Una dintre conditii este adevarata.&lt;br /&gt;
 if [ -f $1 -o -d $1 ]&lt;br /&gt;
&lt;br /&gt;
===For===&lt;br /&gt;
For se foloseste pentru a executa o sectiune de cod de un numar repetat de ori&lt;br /&gt;
(ciclu). Varianta clasica de for din Bash este diferita de cea din alte limbaje de programare.&lt;br /&gt;
Sintaxa pentru for este:&lt;br /&gt;
for VAR in lista_de_valori do instructiuni done&lt;br /&gt;
Se executa instructiunile specificate de atatea ori cate valori avem in lista. Pentru fiecare iteratie variabila VAR ia o valoare din lista_de_valori. Separatorul pentru valorile din lista este default spatiu sau valoarea variabilei globale IFS.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Script care exemplifica ciclul de tip for prin trimiterea unui pachet ping la fiecare din cele 3 IP-uri.&lt;br /&gt;
&lt;br /&gt;
Instructiunile dintre do si done se executa de atatea ori cate valori avem in lista (3 valori).&lt;br /&gt;
&lt;br /&gt;
Pentru fiecare ciclu valoarea variabilei IP este o valoare din lista. Valorile din lista sunt separate prin spatiu.&lt;br /&gt;
 #!/bin/bash for IP in 192.168.0.1 192.168.0.2 192.168.0.3 do ping -c 1 $IP done&lt;br /&gt;
&lt;br /&gt;
2. Exemplu for modificand valoara variabilei IFS care este separatorul valorilor.&lt;br /&gt;
 #!/bin/bash #Acest script afiseaza fiecare director din $PATH pe cate un rand IFS=: for DIR in $PATH do echo $DIR done&lt;br /&gt;
&lt;br /&gt;
In Bash exista si structura de tip for ca in C/C++. Aceasta este insa mai putin folosita.&lt;br /&gt;
&lt;br /&gt;
 Exemplu&lt;br /&gt;
 for ca in C/C++:&lt;br /&gt;
 LIMIT=10 for((a=0;a&amp;lt;=$LIMIT;a++)) do echo $a done&lt;br /&gt;
&lt;br /&gt;
===While===&lt;br /&gt;
Structura de tip while se foloseste pentru a executa o serie de instructiuni (cele&lt;br /&gt;
dintre do si done) atata timp cat conditia de test este adevarata.&lt;br /&gt;
&lt;br /&gt;
while [ conditie_de_test ] do lista_de_instructiuni done&lt;br /&gt;
&lt;br /&gt;
Exemplu while:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 #script care afiseaza numerele intre 0 zi 100&lt;br /&gt;
 LIMIT=100&lt;br /&gt;
 i=0&lt;br /&gt;
 while [ $i –le $LIMIT ]&lt;br /&gt;
 do&lt;br /&gt;
 echo &amp;quot;i=$i&amp;quot;&lt;br /&gt;
 let i=i+1&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Case===&lt;br /&gt;
Structura de tip case se foloseste pentru a executa o serie de instructiuni in functie de diferite conditii de testare.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru case este:&lt;br /&gt;
&lt;br /&gt;
 case VARIABILA in&lt;br /&gt;
 valoare1)&lt;br /&gt;
 instructiuni1&lt;br /&gt;
 ;;&lt;br /&gt;
 valoare2)&lt;br /&gt;
 instructiuni&lt;br /&gt;
 ;;&lt;br /&gt;
 *)&lt;br /&gt;
 instructiuni_default&lt;br /&gt;
 ;;&lt;br /&gt;
 esac&lt;br /&gt;
 * -&amp;gt; reprezinta instructiunile ce se vor executa default daca variabila nu are niciuna dintre valorile de mai sus.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 #!/bin/bash echo &amp;quot;Introdu nr:&amp;quot; read nr case $nr in 1) echo &amp;quot;nr este 1&amp;quot; ;; 2) echo &amp;quot;nr este2&amp;quot; ;; *) echo &amp;quot;nr are alta valoare&amp;quot; ;; esac&lt;br /&gt;
Structura de tip case poate fi oricand inlocuita cu o structura de tip if..elif..else&lt;br /&gt;
&lt;br /&gt;
Exemplul de mai sus folosind if..elif..else este:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 echo &amp;quot;Introdu nr:&amp;quot;&lt;br /&gt;
 read nr&lt;br /&gt;
 if [ $nr -eq 1 ]&lt;br /&gt;
 then echo &amp;quot;nr este 1&amp;quot;&lt;br /&gt;
 elif [ $nr -eq 2 ]&lt;br /&gt;
 then&lt;br /&gt;
 echo &amp;quot;nr este 2&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
 echo &amp;quot;nr este altceva&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Important&lt;br /&gt;
&lt;br /&gt;
Structura de tip case este foarte importanta si trebuie inteleasa bine. Toate&lt;br /&gt;
scripturile de initializare a serviciilor (cele din /etc/init.d ) folosesc o structura de tip case.&lt;br /&gt;
&lt;br /&gt;
Structura unui script de initializare din /etc/init.d este:&lt;br /&gt;
 case $1 in&lt;br /&gt;
 start) instructiuni de pornire serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 stop) instuctiuni de oprire serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 restart) instructiuni de restartare serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 *) afisare help script &lt;br /&gt;
 esac&lt;br /&gt;
&lt;br /&gt;
$1 reprezinta primul parametru al scriptului si poate fi start, stop sau restart.&lt;br /&gt;
&lt;br /&gt;
Exemplu: Pentru restartarea retelei se foloseste: /etc/init.d/network restart, unde network este scriptul de initializare iar restart primul parametru pe care-l primeste.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Presupunem ca am compilat si instalat serverul Apache in directorul /opt/apache.&lt;br /&gt;
Daemonul http se porneste ruland comanda: /opt/apache/bin/apachectl start, se opreste cu /opt/apache/bin/apachectl stop si se restarteaza cu /opt/apache/bin/apachectl restart. Se doreste pornirea serverului la butarea sistemului, mai exact la intrarea in runlevel 3.&lt;br /&gt;
&lt;br /&gt;
Etape:&lt;br /&gt;
1. Se creaza un script in /etc/init.d. Numele poate fi ales aleator, in exemplul nostru acesta se numeste init_apache&lt;br /&gt;
2. Se creaza un symlink catre /etc/init.d/init_apache in /etc/init.d/rc3.d numit S99Apache. Numele symlinkului este important sa inceapa cu litera S urmata de un umar intre 0 si 99.&lt;br /&gt;
&lt;br /&gt;
La intrarea in runlevel 3 se va rula automat acest script cu parametrul start.&lt;br /&gt;
Structura scriptului /etc/init.d/init_apache este:&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 case $1 in&lt;br /&gt;
 start)&lt;br /&gt;
 echo &amp;quot;Starting Apache...&amp;quot; /opt/apache/bin/apachectl start echo &amp;quot;OK&amp;quot;&lt;br /&gt;
 ;;&lt;br /&gt;
 stop) echo &amp;quot;Shutting down Apache...&amp;quot; /opt/apache/bin/apachectl stop echo &amp;quot;OK&amp;quot;&lt;br /&gt;
 ;;&lt;br /&gt;
 restart) $0 stop $0 start&lt;br /&gt;
 ;;&lt;br /&gt;
 *) echo &amp;quot;init_apache &amp;lt;start|stop|restart&amp;gt;&amp;quot;&lt;br /&gt;
 esac&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Pentru detalii complete despre modul de pornire a serviciilor la butare cititi capitolul &amp;quot;Managementul Serviciilor&amp;quot; din cursul &amp;quot;Linux Basic Administration&amp;quot; disponibil de asemenea online.&lt;br /&gt;
&lt;br /&gt;
===Select===&lt;br /&gt;
Structura de tip select este specifica doar Bash-ului si se foloseste pentru crearea de meniuri.&lt;br /&gt;
&lt;br /&gt;
Sintaxa acesteia este:&lt;br /&gt;
 select MENUITEM in menu_list&lt;br /&gt;
 do&lt;br /&gt;
 lista_de_comenzi&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
Detalii:&lt;br /&gt;
- menu_list este lista de meniuri. Valorile din lista sunt separate prin spatiu;&lt;br /&gt;
- intre do si done sunt instruciunile ce se executa in functie de meniul ales;&lt;br /&gt;
- intre do si done avem acces la urmatoarele 2 variabile: MENUITEM care contine meniul&lt;br /&gt;
&lt;br /&gt;
selectat si REPLY care se creaza automat si contine inputul userului (ce a scris acesta la consola);&lt;br /&gt;
&lt;br /&gt;
- PS3 contine prompterul de selectare a meniurilor;&lt;br /&gt;
- userul alege un meniu din lista folosind un nr. de ordine: alege 1 pentru primul meniu, 2 pentru al doilea etc;&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 PS3=&amp;quot;Alege:&amp;quot;&lt;br /&gt;
 select ITEM in &amp;quot;Afiseaza continut /etc&amp;quot; &amp;quot;Afiseaza spatiu liber&amp;quot; &amp;quot;Exit&amp;quot;&lt;br /&gt;
 do&lt;br /&gt;
 case $REPLY in&lt;br /&gt;
 1) ls -l /etc&lt;br /&gt;
 ;;&lt;br /&gt;
 2) df -h&lt;br /&gt;
 ;;&lt;br /&gt;
 3) exit 0&lt;br /&gt;
 ;;&lt;br /&gt;
 *) echo &amp;quot;Optiune incorecta&amp;quot;&lt;br /&gt;
 esac&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
==1.6 Substituirea comenzilor==&lt;br /&gt;
&lt;br /&gt;
Unei variabile i se poate asigna o valoare in 2 moduri:&lt;br /&gt;
&lt;br /&gt;
1. Folosind NUME_VAR=valoare&lt;br /&gt;
&lt;br /&gt;
Exemplu: &lt;br /&gt;
  &lt;br /&gt;
  EDITOR=&amp;quot;VIM&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Substituind o comanda cu outputul ei&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
  &lt;br /&gt;
  VAR=`ls /etc` -&amp;gt; in acest exemplu comanda ls /etc se substituie sau inlocuieste cu outputul ei care se asigneaza variabilei VAR. Variabila VAR va contine outputul comenzii ls -l.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Substituirea unei comenzi cu outputul ei reprezinta unul dintre caracteristicile cele mai puternice ale Bash-ului, iar majoritatea scripturilor folosesc acest mod de lucru.&lt;br /&gt;
&lt;br /&gt;
Pentru a substitui o comanda cu outputul ei exista 2 variante:&lt;br /&gt;
&lt;br /&gt;
1. Comanda sa incadreza in backquotes ( ``). Atentie, backquotes nu sunt apostroafe sau ghilimele simple.&lt;br /&gt;
&lt;br /&gt;
Exemplu: &lt;br /&gt;
 ME=`whoami ` -&amp;gt; variabila ME va contine outputul comenzii whoami (atentie! nu exista spatii in jurul semnului = (stanga/dreapta)&lt;br /&gt;
&lt;br /&gt;
2. Comanda se incadreza intre $( si )&lt;br /&gt;
&lt;br /&gt;
Exemplu: &lt;br /&gt;
  ETH0= $(ifconfig eth0) -&amp;gt; variabila numita ETH0 va contine outputul comenzii &#039;&#039;&#039;ifconfig eth0&#039;&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Exemplu script ce nu poate fi rulat de catre root&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 &lt;br /&gt;
 if [ &amp;quot;$(whoami)&amp;quot; = &amp;quot;root&amp;quot; ]&lt;br /&gt;
 then&lt;br /&gt;
   echo &amp;quot;Esti root, sorry !&amp;quot;&lt;br /&gt;
   exit 1;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
#incep instructiunile ce nu pot fi rulate de catre root&amp;quot;&lt;br /&gt;
 ls -la ~&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In momentul in care o variabila de tip string este testat folosind un test pentru stringuri este bine ca aceasta sa fie incadrata intre ghilimele duble pentru a forta tipul ei catre string.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
&lt;br /&gt;
  VAR=&amp;quot;`ifconfig eth0`&amp;quot; &lt;br /&gt;
  if [ -z &amp;quot;$VAR&amp;quot; ]; then &lt;br /&gt;
   echo &amp;quot;Interfata eth0 nu exista!&amp;quot; &lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
==Subshells==&lt;br /&gt;
&lt;br /&gt;
Utilizarea subshell-urilor în Bash poate fi avantajoasă din mai multe motive, inclusiv:&lt;br /&gt;
&lt;br /&gt;
 1. Izolarea comenzilor: comenzile executate într -un subshell sunt izolate de cochilie părinte. Aceasta înseamnă că orice modificări aduse la variabile, directoare sau alte setări de mediu din subshell nu vor afecta shell-ul părinte.&lt;br /&gt;
&lt;br /&gt;
 2. Scoping: Variabilele definite într -un subshell au un domeniu local și nu vor afecta variabile cu același nume în shell-ul părinte.&lt;br /&gt;
&lt;br /&gt;
 3. Manevrarea erorilor: subshell -urile pot fi utilizate pentru o mai bună gestionare a erorilor. De exemplu, puteți executa o serie de comenzi într-un subshell și puteți verifica starea de returnare a acesteia fără a afecta fluxul principal al scriptului dvs.&lt;br /&gt;
&lt;br /&gt;
Iată câteva exemple de utilizare a subshell-urilor în Bash:&lt;br /&gt;
&lt;br /&gt;
Schimbarea directorului temporar:&lt;br /&gt;
&lt;br /&gt;
Aceasta schimbă temporar directorul în/calea/în/director, execută comanda &#039;&#039;ls&#039;&#039;, apoi se întoarce în directorul original. Schimbarea directorului afectează doar subshell-ul.&lt;br /&gt;
&lt;br /&gt;
-Execuție paralelă:&lt;br /&gt;
&lt;br /&gt;
Aceasta execută mai multe comenzi concomitent în subshell-uri, permițându-le să funcționeze în paralel.&lt;br /&gt;
&lt;br /&gt;
-Manevrarea erorilor:&lt;br /&gt;
&lt;br /&gt;
Aceasta execută comanda1 și comanda2 într -un subshell. Dacă Command1 sau Command2 eșuează (returnează un statut de ieșire non-zero), atunci este ecou „eroare”.&lt;br /&gt;
&lt;br /&gt;
-Setări temporare ale mediului:&lt;br /&gt;
&lt;br /&gt;
Aceasta stabilește o variabilă de mediu temporară la valoare pentru durata comenzii. Odată ce comanda se termină, variabila revine la valoarea sa anterioară (sau este nesetată dacă nu exista înainte).&lt;br /&gt;
&lt;br /&gt;
Subshell-urile sunt versatile și pot fi utilizate creativ pentru a atinge diverse obiective de script, menținând controlul asupra mediului și fluxului de execuție al comenzilor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;In incheierea cursului Linux Essentials:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La ce pot fi folosite parantezele ( ) in bash?&lt;br /&gt;
&lt;br /&gt;
Utilizari comune&lt;br /&gt;
    1. Substitutia comenzii:&lt;br /&gt;
        ◦ $(command) or `command`: Executa comanda si ii substituie iesirea.&lt;br /&gt;
        ◦ Example: echo $(date) or echo \date``&lt;br /&gt;
    2. Expansie aritmetica:&lt;br /&gt;
        ◦ (( expression )): Performa operatuni aritmetice si le evalueaza expresia.&lt;br /&gt;
        ◦ Example: (( x = 5 + 3 ))&lt;br /&gt;
    3. Crearea unui subshell:&lt;br /&gt;
        ◦ ( commands ): Execute comenzi intr-un subshell, izolandu-i mediul de cea principala.&lt;br /&gt;
        ◦ Example: (cd /path/to/directory &amp;amp;&amp;amp; ls)&lt;br /&gt;
    4. Declararea unei functii:&lt;br /&gt;
        ◦ function_name () { commands; }: Declara o functie.&lt;br /&gt;
    5. Gruparea comenzilor:&lt;br /&gt;
        ◦ { commands; }: Grupeaza mai multe comenzi impreuna, permitandu-le sa ruleze ca si o singura comanda.&lt;br /&gt;
        ◦ Example: { echo &amp;quot;Hello&amp;quot;; echo &amp;quot;World&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Essentials_Pagina_7|Pagina anterioară]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Essentials_Pagina_8&amp;diff=546</id>
		<title>Essentials Pagina 8</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Essentials_Pagina_8&amp;diff=546"/>
		<updated>2025-04-11T08:09:40Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* If..then..else */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Laborator 8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Shell Scripts=&lt;br /&gt;
&lt;br /&gt;
==1.1 Introducere in Bash==&lt;br /&gt;
Shellul este interpretorul de comenzi. Acesta parseaza comenzile introduse de&lt;br /&gt;
utilizator, le verifica din punct de vedere al sintaxei si le trimite kernel-ului spre executie.&lt;br /&gt;
&lt;br /&gt;
Exista mai multe shelluri (Bourne, C Shell, recent aparute Zsh si Fish, etc), dar default pe Linux este shellul numit Bash (Bourne Again Shell). Acesta este reprezentat de fisierul &#039;&#039;/bin/bash&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Pe langa interpretarea si executia comenzilor, Bash-ul ofera si alte facilitati printre&lt;br /&gt;
care: editarea liniei de comanda, history, alias-uri, dar si un limbaj de programare structurat propriu.&lt;br /&gt;
&lt;br /&gt;
Un script de shell este un fisier text (ASCII) care contine comenzi de shell organizate intr-un mod logic. Pe langa comenzi, script-ul mai contine si variabile (locale sau globale), parametri pozitionali precum si structuri de programare specifice (if..then..else, while, do, until, for, case, selsect etc). Un script este folosit pentru a imbina comenzi si diverse structuri de control pentru a oferi o noua functionalitate sau a automatiza task-uri.&lt;br /&gt;
&lt;br /&gt;
Etapele crearii unui script sunt:&lt;br /&gt;
&lt;br /&gt;
a) crearea unui fisier text folosind editorul preferat (Exemplu: vim)&lt;br /&gt;
b) editarea fisierului pentru a contine functionalitatea dorita&lt;br /&gt;
c) testarea scriptului adica executia/rularea acestuia&lt;br /&gt;
&lt;br /&gt;
Modul de executie a unui script numit script1:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Din directorul care contine scriptul se ruleaza : ./script1&lt;br /&gt;
Fisierul script1 trebuie sa aiba dreptul de executie. Fiindca directorul curent (.) nu&lt;br /&gt;
se afla in $PATH (altfel grave probleme de securitate), scriptul trebuie sa fie executat cu calea absoluta sau cu ./nume_script In acest caz se porneste un shell nou ca sub proces al shellului curent in care se executa comenzile din script.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Din directorul care contine fisierul script1 se ruleaza: . script1 sau source script1.&lt;br /&gt;
Se executa comenzile din script1 in shell-ul curent. Fisierul script1 nu trebuie sa&lt;br /&gt;
aiba dreptul de executie. Una dintre diferentele dintre prima si a doua varianta este ca variabilele exportate sau globale sunt vizibile in shell-ul curent in varianta a doua, dar nu si in prima varianta.&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Varianta cea mai folosita de executie a unui script este prima: ./script&lt;br /&gt;
Un script trebuie sa contina pe prima linie o referire la programul cu care se executa (Bash, Perl, PHP, Python etc). Astfel prima linie a unui script Bash este invariabil: #!/bin/bash. In interiorul scriptului #(diez) reprezinta un comentariu. Exceptie face prima linie.&lt;br /&gt;
&lt;br /&gt;
echo se foloseste pentru afisa un string (sir de caractere) sau o variabila la consola.&lt;br /&gt;
Exemplu: echo &amp;quot;Linux&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Script care afiseaza mesajul: Acesta este primul exemplu !&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 echo &amp;quot;Acesta este primul exemplu !&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Script care creaza un fiser numit continut_etc.txt in directorul curent ce contine fisierele si directoarele din directorul /etc, iar apoi afiseaza spatiul total, ocupat si liber de pe fiecare partitie de pe Hard Disk.&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 ls -l /etc &amp;gt; continut_etc.txt&lt;br /&gt;
 echo &amp;quot;Fisierul continut_etc.txt a fost creat in directorul curent!&amp;quot;&lt;br /&gt;
 echo &amp;quot;Informatii partitii:&amp;quot;&lt;br /&gt;
 df -h Important&lt;br /&gt;
&lt;br /&gt;
O cunoastere acceptabila a modului de creare de scripturi este esentiala pentru orice Administrator de sistem. In cazul persoanelor incepatoare care nu au experienta in programare (orice limbaj) procesul de scripting pare la prima vedere extrem de complicat.&lt;br /&gt;
&lt;br /&gt;
Este nevoie de multe exercitii si exemple pentru o intelegere aprofundata. Intotdeauna se incepe cu exercitii simple si anume scripturi formate din cateva randuri.&lt;br /&gt;
&lt;br /&gt;
==1.2 Variabile, constante si functii==&lt;br /&gt;
&lt;br /&gt;
Prezentare generala:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; O variabila reprezinta un nume pentru o locatie de memorie unde se gaseste o valoare. Se obisnuieste (nu este obligatoriu) ca variabilele sa se scrie cu litera mare.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Comparativ cu alte limbaje de programare (C/C++, JAVA) variabilele in Bash nu au tip. Ele sunt string-uri, dar in functie de context pot fi evaluate ca integer etc.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; O variabila se declara: NUME_VAR=valoare&lt;br /&gt;
&lt;br /&gt;
Important&lt;br /&gt;
Nu se foloseste spatiu intre NUME_VAR si valoare. i = 1 reprezinta eroare. Sintaxa bash - ului este extrem de stricta. Un spatiu in plus sau in minus reprezinta o eroare fatala.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 NUME=&amp;quot;dan&amp;quot;&lt;br /&gt;
 varsta=20&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4&#039;&#039;&#039;. Pentru a ne referi la continutul unei varibile se foloseste semnul $ (dollar) in fata numelui variabilei.&lt;br /&gt;
Exemplu: echo $varsta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5&#039;&#039;&#039;. Variabilele pot fi locale sau globale. Cele locale sunt vizibile doar in shell-ul curent, iar cele globale sunt vizibile in shell-ul curent si in toate subprocesele shell-ului curent. Astfel in interiorul unui script daca se foloseste o variabila globala aceasta va fi accesibila oricarei comenzi/program lansata din acel script. Variabilele globale nu sunt accesibile parintelui unui proces, adica shell-ului de unde s-a executat scriptul. Exceptie face varianta 2 de executie a unui script adica folosind source nume_script&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6&#039;&#039;&#039;. Pentru a declara o variabila globala aceasta trebuie exportata. Se foloseste cuvantul cheie export&lt;br /&gt;
&lt;br /&gt;
 Exemplu: export VARSTA=20&lt;br /&gt;
 variabilele globale se numesc de environment;&lt;br /&gt;
 pentru a vizualiza variabilele locale se foloseste comanda set;&lt;br /&gt;
 pentru a vizualiza variabilele globale se foloseste comanda env;&lt;br /&gt;
 pentru sterge o variabila se foloseste comanda unset NUME_VAR;&lt;br /&gt;
&lt;br /&gt;
Exemplu de varibile globale predefinite:&lt;br /&gt;
 PATH -&amp;gt; contine o lista de directoare in care shell-ul cauta comanda care se executa.&lt;br /&gt;
&lt;br /&gt;
Pentru a concatena un string la variabila PATH se foloseste caracterul : (doua puncte).&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&lt;br /&gt;
Daca dorim sa adaugam directorul /home/dan/scripts in PATH: export&lt;br /&gt;
 PATH=PATH:/home/stud/scripts&lt;br /&gt;
&lt;br /&gt;
Dupa aceasta scripturi si comenzi din /home/stud/scripts pot fi rulate in orice director ne am afla doar prin numele lor. Altfel trebuie folosita calea absoluta sau aflandu-ne in&lt;br /&gt;
director se executa: ./nume_comanda&lt;br /&gt;
 HOSTNAME -&amp;gt; contine hostname-ul calculatorului&lt;br /&gt;
 SHELL -&amp;gt; contine shell-ul default&lt;br /&gt;
 HISTSIZE - contine nr. de comenzi care vor fi memorate in history&lt;br /&gt;
 USER -&amp;gt; contine EUID&lt;br /&gt;
 PWD -&amp;gt; contine directorul curent&lt;br /&gt;
 OLDPWD -&amp;gt; contine directorul precedent si se foloseste de comanda: cd –&lt;br /&gt;
 HOME -&amp;gt; contine home directory al EUID&lt;br /&gt;
 RANDOM -&amp;gt; variabila al carei continut este pseudoaleator&lt;br /&gt;
 TMOUT -&amp;gt; nr in secunde dupa care se face logout automat daca nu se executa nicio comanda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7&#039;&#039;&#039;. Diferenta dintre ghilimele simple(apostrof) si ghilimele duble este aceea ca ghilimele simple nu interpreteaza $ ca si caracter special. In interiorul ghilimelelor simple fiecare caracter special cu exceptia &#039; (ghilimea simpla) este interpretat literal.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 varsta=20 echo &amp;quot;$varsta&amp;quot; ##se afiseaza 20 echo &#039;$varsta&#039; ##se afiseaza $varsta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8&#039;&#039;&#039;. O variabila poate fi declarata read-only sau de tip array. O variabila read-only se mai numeste si constanta.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 &#039;&#039;&#039;1.&#039;&#039;&#039; var1 este readonly. Aceasta nu poate fi modificata sau stearsa folosind unset.&lt;br /&gt;
 declare -r var1=7&lt;br /&gt;
 &#039;&#039;&#039;2.&#039;&#039;&#039; Pentru a declara un array/vector:&lt;br /&gt;
 ARRAY=(unu doi trei) echo ${ARRAY[*]} echo ${ARRAY[1]} i=2 echo&lt;br /&gt;
 ${ARRAY[]} unset ARRAY[1] unset ARRAY&lt;br /&gt;
 ARRAY nu este cuvant cheie. In loc de ARRAY poate fi orice cuvant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;9&#039;&#039;&#039;. Pentru a citi o variabila de la tastatura se foloseste cuvantul cheie read&lt;br /&gt;
Exemplu:&lt;br /&gt;
 #!/bin/bash echo &amp;quot;Introdu nume fisier:&amp;quot; read FILE echo &amp;quot;Fisierul introdus este $FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10&#039;&#039;&#039;. In bash exista caractere speciale care sunt interpretate in mod deosebit.&lt;br /&gt;
 Exemple: $ (dollar), &amp;quot;(ghilimea dubla) sau \ (backslash). Pentru a anula efectul special al&lt;br /&gt;
caracterului, acesta se precede cu \ (backslash).&lt;br /&gt;
&lt;br /&gt;
 Exemplu: echo \$var -&amp;gt; Afiseaza $var. $ nu mai este caracter special.&lt;br /&gt;
&lt;br /&gt;
==1.3 Parametri pozitionali==&lt;br /&gt;
Bash-ul foloseste parametri speciali la care ne putem referi in interiorul unui script&lt;br /&gt;
pentru a avea acces la anumite valori. Acesti parametri speciali se pot folosi ca si&lt;br /&gt;
variabilele, doar ca exista default si nu trebuie creati. Continutul acestora este de asemenea standard.&lt;br /&gt;
&lt;br /&gt;
Acestia sunt:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; $0 - contine numele scriptului&lt;br /&gt;
Scriptul poate actiona diferit in functie de numele cu care a fost rulat ( Exemplu:&lt;br /&gt;
daca se ruleaza folosind un simlink al scriptului. Vezi comanda /bin/egrep care este un simlink catre /bin/grep dar are totusi functionalitate diferita).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; $1 - reprezinta primul argument al scriptului, $2 al doilea argument al scriptului etc. Incepand cu argumentul 10 acesta trebuie incadrat intre acolade ${10}, ${11} etc.&lt;br /&gt;
Se folosesc pentru a evita erori in momentul in care scriptul este rulat fara argumente sau cu un alt nr. de argumente (iar acesta asteapta sa primeasca argumente).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; $? - reprezinta statusul ultimei comenzi executate.&lt;br /&gt;
In Bash Zero este statusul pentru non-error iar diferit de zero este statusul pentru eroare. Orice comanda/program are un status de exit, zero sau non-zero. Se foloseste pentru a continua executia scriptului (sau a modifica comportamentul acestuia) in functie de statusul comenzilor anterioare.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; $# - reprezinta nr. de argumente ale scriptului Se poate lua o decizie in functie de nr. de argumente cu care a fost rulat scriptul.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.&#039;&#039;&#039; $* - reprezinta toate argumentele date scriptului.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.&#039;&#039;&#039; $$ - reprezinta PID shell.&lt;br /&gt;
Astel in functie de cum rulam scriptul $$ are alta valoare:source f1 - $$ reprezinta PID bash (shell curent) ./f1 - $$ reprezinta PID noului sub-shell creat in care se executa comenzile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.&#039;&#039;&#039; $! - reprezinta PID ultimului proces executat in background.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Script care sterge fisierul sau directorul pe care-l primeste ca argument&lt;br /&gt;
 #!/bin/bash rm -rf $1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Afisarea numelui scriptului&lt;br /&gt;
 #!/bin/bash Echo &amp;quot;Numele scriptului executat este: $0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==1.4 Alte facilitati Bash==&lt;br /&gt;
===Alias===&lt;br /&gt;
Un alias reprezinta un mod prin care o comanda sau o serie de comenzi se executa folosind un alt nume.&lt;br /&gt;
Pentru a crea un alias se foloseste comanda: alias comanda_noua=&#039;comanda_substituita&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. alias copy=&#039;cp&#039;&lt;br /&gt;
2. alias search=&#039;grep&#039;&lt;br /&gt;
3. alias ls=&#039;ls -F&#039;&lt;br /&gt;
4. alias rm=&#039;rm -i&#039;&lt;br /&gt;
5. alias ll=&#039;ls -l&#039;&lt;br /&gt;
6. alias stop=&#039;kill -9&#039;&lt;br /&gt;
&lt;br /&gt;
Daca aliasul este compus din mai multe cuvinte acestea trebuie incadrate intre&lt;br /&gt;
ghilimele simple (apostrof).Pentru a vizualiza toate aliasurile din sistem se foloseste comanda alias fara nici un argument.Pentru a executa comanda originala in locul aliasului se foloseste \ (backslash) urmat de comanda.&lt;br /&gt;
&lt;br /&gt;
Example: \ls&lt;br /&gt;
Pentru a sterge un alias se foloseste comanda unalias&lt;br /&gt;
Exemplu: unalias ls&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Un alias exista doar in shell-ul curent (nu exista nici macar in subshell-urile shell-ului curent).&lt;br /&gt;
&lt;br /&gt;
===Customizare Environment===&lt;br /&gt;
Prompting variables (prompt strings)&lt;br /&gt;
&lt;br /&gt;
Bash foloseste 4 variabile speciale numite &amp;quot;prompt strings&amp;quot;: PS1, PS2, PS3 si PS4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; PS1 este numit &amp;quot;primary prompt string&amp;quot; si reprezinta prompterul curent.&lt;br /&gt;
De cele mai multe ori acesta se modifica pentru a arata informatii cat mai utile despre sesiunea curenta.&lt;br /&gt;
&lt;br /&gt;
 PS1 foloseste niste macro-uri care se expandeaza cu un anumit continut astfel:&lt;br /&gt;
 \A - current time in HH:MM hours format&lt;br /&gt;
 \d - current date&lt;br /&gt;
 \@ - the current time in 12 hours format&lt;br /&gt;
 \H - the hostname&lt;br /&gt;
 \h - the hostname up to the first dot (.)&lt;br /&gt;
 \s - the name of the shell&lt;br /&gt;
 \u - username of the EUID&lt;br /&gt;
 \w - the current working directory&lt;br /&gt;
 \W - the current working directory (basename) - relativ&lt;br /&gt;
 \$ - if EUID==0 print # else print $&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Un exemplu excelent de modificare PS1 este: export PS1=&#039;[\u@\h \w]$&#039;&lt;br /&gt;
Avand acest prompter adminul are intotdeauna informatii despre userul cu care s-a conectat, host-ul pe care este conectat precum si calea absoluta a directorului curent. Linia de mai sus se adauga in fisierul de customizare ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; PS2 este numit &amp;quot;secondary prompt string&amp;quot; si are valoarea default &amp;gt; (mai mare).&lt;br /&gt;
Se foloseste atunci cand se scrie o comanda incompleta si se apasa ENTER.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; PS3 se numeste &amp;quot;prompt string for the select command&amp;quot; si se foloseste in scripting impreuna cu comanda select&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; PS4 se numeste &amp;quot;prompt string for the xtrace option&amp;quot; si reprezinta un prompt string folosit in debugging si flow control.&lt;br /&gt;
&lt;br /&gt;
===Environment===&lt;br /&gt;
Fiecare utilizator are propriul mediu de lucru numit si Environment. Customizarea&lt;br /&gt;
Environmentului presupune modificarea unor variabile si parametri astfel incat mediul de lucru sa fie cat mai prietenos si sa ne ofere cat mai multe informatii.&lt;br /&gt;
Din mediul de lucru al unui utilizator fac parte: aliasurile sale, umask, modul de&lt;br /&gt;
afisare al prompterului, variabila PATH in care shellul cauta comenzile, ulimit etc&lt;br /&gt;
&lt;br /&gt;
Exista fisiere de initializare pentru fiecare user care sunt citite de shell la fiecare&lt;br /&gt;
pornire a acestuia:&lt;br /&gt;
&lt;br /&gt;
~/.bashrc - este primul fisier citit de shell la login. In acest fisier trebuie declarate variabile,&lt;br /&gt;
alias-uri etc pentru fiecare user.&lt;br /&gt;
~/.bash_profile - este citit dupa ~/.bashrc&lt;br /&gt;
~/.bash_logout - este citit de shell inainte de logout. In acest fisier se pot reseta variabile, sterge fisiere temporare sau alte functii care vrem sa aiba loc inainte de logout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fisierul /etc/profile este un alt fisier de customizare &amp;quot;system-wide&amp;quot;. Acesta nu&lt;br /&gt;
apartine unui anumit user, iar in el se configureaza mediul pentru toti userii. Il folosim de exemplu daca dorim setarea unui alias pentru toti userii din sistem.&lt;br /&gt;
Aceste fisiere nu sunt recitite automat de shell dupa modificare. Toate configurarile au efect dupa o noua logare in cazul ~/.bashrc sau ~/.bash_profile sau dupa o restartare a sistemului in cazul /etc/profile.Pentru a forta recitirea lor se foloseste comanda source sau . (dot) urmata de nume fisier. source sau . executa comenzile din interiorul fisierului in shellul curent.&lt;br /&gt;
&lt;br /&gt;
Exemplu: source ~/.bashrc sau . ~/.bashrc&lt;br /&gt;
Daca ~/.bash_profile nu exista shell-ul cauta ~/.bash_login. Daca nici aceasta nu exista cauta ~/.profile.&lt;br /&gt;
In aceste fisiere speciale de initializare se seteaza: PS1, TMOUT, PATH, alias, umask etc pentru fiecare utilizator&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Fisierele de initializare pentru fiecare utilizator se gasesc in home directory al acestuia (~) si sunt ascunse fiindca incep cu .(punct). Pentru vizualizarea lor se foloseste comanda ls cu optiunea -a Exemplu: ls -la ~&lt;br /&gt;
&lt;br /&gt;
In functie de distributia de Linux numele si ordinea de citire a fisierelor de customizare a mediului de lucru pentru fiecare user poate sa difere. Totusi, pe marea majoritate a distributiilor de Linux (RedHat, Fedora, CentOS, Suse, Ubuntu, Kubuntu, Debian) exista ~/.bashrc. In acest caz se recomanda folosirea doar a acestuia&lt;br /&gt;
&lt;br /&gt;
Exemplu ~/.bashrc:&lt;br /&gt;
&lt;br /&gt;
 # User specific aliases and functions &lt;br /&gt;
 alias rm=&#039;rm -i&#039; &lt;br /&gt;
 alias cp=&#039;cp -i&#039; &lt;br /&gt;
 alias mv=&#039;mv -i&#039; &lt;br /&gt;
 alias cauta=find &lt;br /&gt;
 alias muta=mv &lt;br /&gt;
 alias S=&#039;ssh -l root -p 7890 ssh.crystalmind.ro&#039; &lt;br /&gt;
 # Source global definitions &lt;br /&gt;
 if [ -f /etc/bashrc ]; then &lt;br /&gt;
   . /etc/bashrc &lt;br /&gt;
 fi &lt;br /&gt;
 export PS1=&#039;[\u@\h \w]$&#039; &lt;br /&gt;
 export PATH=:/home/gabriel/scripts &lt;br /&gt;
 umask=0022&lt;br /&gt;
&lt;br /&gt;
==1.5 Flow Control==&lt;br /&gt;
===Conditii de testare===&lt;br /&gt;
Nota&lt;br /&gt;
Informatiile din acesta pagina au scopul de referinta pentru testele folosite de structurile de control ce urmeaza a fi prezentate. Ele nu trebuie invatate la acest moment in afara conextului de flow control ci doar impreuna cu structurile if..then..else, while, case etc&lt;br /&gt;
&lt;br /&gt;
Structurile de control (if..then..else, while etc) presupun conditii de testare.&lt;br /&gt;
&lt;br /&gt;
Acestea sunt:&lt;br /&gt;
 1. Pentru fisiere&lt;br /&gt;
 -e = fisierul exista&lt;br /&gt;
 -f = fisierul exista si este de tipul regular file&lt;br /&gt;
 Exemplu: -f $FILE&lt;br /&gt;
 -s = fisierul nu are dimensiunea zero&lt;br /&gt;
 -d = fisierul exista si este de tip director&lt;br /&gt;
 -c = fisierul exista si este de tip char device&lt;br /&gt;
 -b = fisierul exista si este de tip block device&lt;br /&gt;
 -r = fisierul exista si are permisiunea read&lt;br /&gt;
 -w = fisierul exista si are permisiunea write&lt;br /&gt;
 -x = fisierul exista si are permisiunea execute&lt;br /&gt;
 -g = fisierul are GUID setat&lt;br /&gt;
 -u = fisierul are SUID setat&lt;br /&gt;
 -k = fisierul are sticky bit setat&lt;br /&gt;
 -nt = fisierul este mai nou decat un alt fisier&lt;br /&gt;
 Exemplu: file1 -nt file = file1 is newer than file2&lt;br /&gt;
 ! -&amp;gt; inverseaza sensul (neaga)&lt;br /&gt;
&lt;br /&gt;
2. Pentru comparatie&lt;br /&gt;
 -eq = equal to&lt;br /&gt;
 -ne = not equal to&lt;br /&gt;
 -gt = greater than&lt;br /&gt;
 Exemplu: $i -gt -$j&lt;br /&gt;
 -ge = greater than or equal&lt;br /&gt;
 -lt = less than&lt;br /&gt;
 -le = less than or egal&lt;br /&gt;
&lt;br /&gt;
3. Pentru stringuri (siruri de caractere)&lt;br /&gt;
 -z = lungimea sirului este zero&lt;br /&gt;
 -n = lungimea sirului este non-zero&lt;br /&gt;
 = egal (comparativ cu alte limbaje de programare operatorul de comparatie este un singur egal) != diferit&lt;br /&gt;
 Exemplu: $str1 != $str2&lt;br /&gt;
 -a = SI LOGIC (AND)&lt;br /&gt;
 -o = SAU LOGIC (OR)&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Testul este adevarat daca ambele conditii sunt adevarate simultan (valoarea variabilei USER este root si valoarea variabilei SHELL este bash)&lt;br /&gt;
 $USER = &amp;quot;root&amp;quot; -a $SHELL = &amp;quot;bash&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In cazul comparatiei a doua stringuri din punct de vedere al sintaxei bash este obligatoriu un spatiu inainte de = (egal) si un spatiu dupa = (egal).&lt;br /&gt;
 Exemplu: $USER=&amp;quot;root&amp;quot; este gresit, $USER = &amp;quot;root&amp;quot; este corect.&lt;br /&gt;
&lt;br /&gt;
2. Testul este adevarat daca una dintre conditii este adevarata(i mai mic ca 10 SAU i mai mare ca 100) $i -lt 10 -o $i gt 100&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Contiditiile de testare prezentate mai sus sunt doar cele mai folosite. Pentru lista completa executati: &lt;br /&gt;
  man test &lt;br /&gt;
  test EXPR &#039;&#039;sau&#039;&#039; [ EXPR ] #au acelasi rezultat.&lt;br /&gt;
&lt;br /&gt;
===If..then..else===&lt;br /&gt;
Cea mai simpla constructie de flow control este cea conditionala reprezentata de if.&lt;br /&gt;
In functie de o valoarea de adevar a unei conditii se stabilesc instructiunile ce trebuie executate. Conditiile de test se refera la proprietati ale fisierelor, comparatii numerice sau sunt referitoare la stringuri.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if este:&lt;br /&gt;
 if [ conditie_de_test ] then lista_de_instructiuni fi&lt;br /&gt;
Daca conditia de test este adevarata se executa lista de instructiuni, altfel aceasta nu se executa.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Daca primul argument al scriptului este fisier se executa: cat fisier&lt;br /&gt;
 if [ -f $1 ] then cat $1 fi&lt;br /&gt;
&lt;br /&gt;
2. Daca valoarea variabilei i este 10 se afiseaza mesajul &amp;quot;Variabila i are valoarea 10&amp;quot; if [ $i -eq 10 ] then echo &amp;quot;Variabila i are valoarea 10&amp;quot; fi&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if..else este:&lt;br /&gt;
 if [ conditie_de_test ] then lista_de_instructiuni else lista_de_instructiuni_default fi&lt;br /&gt;
&lt;br /&gt;
Data conditia de test este adevarata se executa lista_de_instructiuni, altfel se executa lista_de_instructiuni_default&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Daca valoarea variabilei VARSTA citita de la tastatura este mai mica decat 18 se afiseaza mesajul &amp;quot;Esti minor!&amp;quot;, altfel se afiseaza mesajul &amp;quot;Esti major!&amp;quot;&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 echo &amp;quot;Introdu varsta:&amp;quot; &lt;br /&gt;
 read VARSTA &lt;br /&gt;
 if [ $VARSTA -lt 18 ]; then&lt;br /&gt;
   echo &amp;quot;Esti minor!&amp;quot; &lt;br /&gt;
 else &lt;br /&gt;
   echo &amp;quot;Esti major!&amp;quot; &lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if..elif..else este:&lt;br /&gt;
&lt;br /&gt;
 if [ conditie_de_test1 ]; then&lt;br /&gt;
   &#039;&#039;lista_de_instructiuni_1&#039;&#039; &lt;br /&gt;
 elif [ conditie_de_test2 ]; then&lt;br /&gt;
   &#039;&#039;lista_de_instructiuni_2&#039;&#039; &lt;br /&gt;
 elif [ conditie_de_test3 ]; then&lt;br /&gt;
   &#039;&#039;lista_de_instructiuni_3&#039;&#039; &lt;br /&gt;
 else&lt;br /&gt;
   &#039;&#039;lista_de_instructiuni_default&#039;&#039;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplu:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 Daca variabila ORA citita de la tastatura este mai mica decat 12 se afiseaza mesajul &amp;quot;Buna dimineata&amp;quot;, daca este intre 12 si 18 se afiseaza mesajul &amp;quot;Buna ziua&amp;quot;, daca este intre 18 si 24 se afiseaza &amp;quot;Noapte Buna!&amp;quot;. Pentru orice alta situatie se afiseaza mesajul &amp;quot;Eroare!&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 read i &lt;br /&gt;
 if [ $i -lt 12 ]; then&lt;br /&gt;
   echo &amp;quot;Buna dimineata!&amp;quot; &lt;br /&gt;
 elif [ $i -ge 12 -a $i -lt 18 ]; then &lt;br /&gt;
   echo &amp;quot;Buna ziua!&amp;quot; &lt;br /&gt;
 elif [ $i -ge 18 -a $i -le 24 ]; then &lt;br /&gt;
   echo &amp;quot;Noapte buna !&amp;quot; &lt;br /&gt;
 else &lt;br /&gt;
   echo &amp;quot;Eroare!&amp;quot; &lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
-a reprezinta SI LOGIC (AND). Testul este adevarat daca ambele conditii sunt adevarate simultan.&lt;br /&gt;
&lt;br /&gt;
-o reprezinta SAU LOGIC (OR). Testul este adevarat daca una dintre contitii este adevarata.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplu&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Testul este adevarat daca ambele conditii sunt adevarate (primul parametru este fisier si exista si are si permisiunea de read). Ambele conditii sunt adevarate simultan.&lt;br /&gt;
 if [ -e $1 -a -r ]&lt;br /&gt;
&lt;br /&gt;
2. Testul este adevarat daca primul parametru primit de script este fisier SAU acesta este director. Una dintre conditii este adevarata.&lt;br /&gt;
 if [ -f $1 -o -d $1 ]&lt;br /&gt;
&lt;br /&gt;
===For===&lt;br /&gt;
For se foloseste pentru a executa o sectiune de cod de un numar repetat de ori&lt;br /&gt;
(ciclu). Varianta clasica de for din Bash este diferita de cea din alte limbaje de programare.&lt;br /&gt;
Sintaxa pentru for este:&lt;br /&gt;
for VAR in lista_de_valori do instructiuni done&lt;br /&gt;
Se executa instructiunile specificate de atatea ori cate valori avem in lista. Pentru fiecare iteratie variabila VAR ia o valoare din lista_de_valori. Separatorul pentru valorile din lista este default spatiu sau valoarea variabilei globale IFS.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Script care exemplifica ciclul de tip for prin trimiterea unui pachet ping la fiecare din cele 3 IP-uri.&lt;br /&gt;
&lt;br /&gt;
Instructiunile dintre do si done se executa de atatea ori cate valori avem in lista (3 valori).&lt;br /&gt;
&lt;br /&gt;
Pentru fiecare ciclu valoarea variabilei IP este o valoare din lista. Valorile din lista sunt separate prin spatiu.&lt;br /&gt;
 #!/bin/bash for IP in 192.168.0.1 192.168.0.2 192.168.0.3 do ping -c 1 $IP done&lt;br /&gt;
&lt;br /&gt;
2. Exemplu for modificand valoara variabilei IFS care este separatorul valorilor.&lt;br /&gt;
 #!/bin/bash #Acest script afiseaza fiecare director din $PATH pe cate un rand IFS=: for DIR in $PATH do echo $DIR done&lt;br /&gt;
&lt;br /&gt;
In Bash exista si structura de tip for ca in C/C++. Aceasta este insa mai putin folosita.&lt;br /&gt;
&lt;br /&gt;
 Exemplu&lt;br /&gt;
 for ca in C/C++:&lt;br /&gt;
 LIMIT=10 for((a=0;a&amp;lt;=$LIMIT;a++)) do echo $a done&lt;br /&gt;
&lt;br /&gt;
===While===&lt;br /&gt;
Structura de tip while se foloseste pentru a executa o serie de instructiuni (cele&lt;br /&gt;
dintre do si done) atata timp cat conditia de test este adevarata.&lt;br /&gt;
&lt;br /&gt;
while [ conditie_de_test ] do lista_de_instructiuni done&lt;br /&gt;
&lt;br /&gt;
Exemplu while:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 #script care afiseaza numerele intre 0 zi 100&lt;br /&gt;
 LIMIT=100&lt;br /&gt;
 i=0&lt;br /&gt;
 while [ $i –le $LIMIT ]&lt;br /&gt;
 do&lt;br /&gt;
 echo &amp;quot;i=$i&amp;quot;&lt;br /&gt;
 let i=i+1&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Case===&lt;br /&gt;
Structura de tip case se foloseste pentru a executa o serie de instructiuni in functie de diferite conditii de testare.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru case este:&lt;br /&gt;
&lt;br /&gt;
 case VARIABILA in&lt;br /&gt;
 valoare1)&lt;br /&gt;
 instructiuni1&lt;br /&gt;
 ;;&lt;br /&gt;
 valoare2)&lt;br /&gt;
 instructiuni&lt;br /&gt;
 ;;&lt;br /&gt;
 *)&lt;br /&gt;
 instructiuni_default&lt;br /&gt;
 ;;&lt;br /&gt;
 esac&lt;br /&gt;
 * -&amp;gt; reprezinta instructiunile ce se vor executa default daca variabila nu are niciuna dintre valorile de mai sus.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 #!/bin/bash echo &amp;quot;Introdu nr:&amp;quot; read nr case $nr in 1) echo &amp;quot;nr este 1&amp;quot; ;; 2) echo &amp;quot;nr este2&amp;quot; ;; *) echo &amp;quot;nr are alta valoare&amp;quot; ;; esac&lt;br /&gt;
Structura de tip case poate fi oricand inlocuita cu o structura de tip if..elif..else&lt;br /&gt;
&lt;br /&gt;
Exemplul de mai sus folosind if..elif..else este:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 echo &amp;quot;Introdu nr:&amp;quot;&lt;br /&gt;
 read nr&lt;br /&gt;
 if [ $nr -eq 1 ]&lt;br /&gt;
 then echo &amp;quot;nr este 1&amp;quot;&lt;br /&gt;
 elif [ $nr -eq 2 ]&lt;br /&gt;
 then&lt;br /&gt;
 echo &amp;quot;nr este 2&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
 echo &amp;quot;nr este altceva&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Important&lt;br /&gt;
&lt;br /&gt;
Structura de tip case este foarte importanta si trebuie inteleasa bine. Toate&lt;br /&gt;
scripturile de initializare a serviciilor (cele din /etc/init.d ) folosesc o structura de tip case.&lt;br /&gt;
&lt;br /&gt;
Structura unui script de initializare din /etc/init.d este:&lt;br /&gt;
 case $1 in&lt;br /&gt;
 start) instructiuni de pornire serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 stop) instuctiuni de oprire serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 restart) instructiuni de restartare serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 *) afisare help script &lt;br /&gt;
 esac&lt;br /&gt;
&lt;br /&gt;
$1 reprezinta primul parametru al scriptului si poate fi start, stop sau restart.&lt;br /&gt;
&lt;br /&gt;
Exemplu: Pentru restartarea retelei se foloseste: /etc/init.d/network restart, unde network este scriptul de initializare iar restart primul parametru pe care-l primeste.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Presupunem ca am compilat si instalat serverul Apache in directorul /opt/apache.&lt;br /&gt;
Daemonul http se porneste ruland comanda: /opt/apache/bin/apachectl start, se opreste cu /opt/apache/bin/apachectl stop si se restarteaza cu /opt/apache/bin/apachectl restart. Se doreste pornirea serverului la butarea sistemului, mai exact la intrarea in runlevel 3.&lt;br /&gt;
&lt;br /&gt;
Etape:&lt;br /&gt;
1. Se creaza un script in /etc/init.d. Numele poate fi ales aleator, in exemplul nostru acesta se numeste init_apache&lt;br /&gt;
2. Se creaza un symlink catre /etc/init.d/init_apache in /etc/init.d/rc3.d numit S99Apache. Numele symlinkului este important sa inceapa cu litera S urmata de un umar intre 0 si 99.&lt;br /&gt;
&lt;br /&gt;
La intrarea in runlevel 3 se va rula automat acest script cu parametrul start.&lt;br /&gt;
Structura scriptului /etc/init.d/init_apache este:&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 case $1 in&lt;br /&gt;
 start)&lt;br /&gt;
 echo &amp;quot;Starting Apache...&amp;quot; /opt/apache/bin/apachectl start echo &amp;quot;OK&amp;quot;&lt;br /&gt;
 ;;&lt;br /&gt;
 stop) echo &amp;quot;Shutting down Apache...&amp;quot; /opt/apache/bin/apachectl stop echo &amp;quot;OK&amp;quot;&lt;br /&gt;
 ;;&lt;br /&gt;
 restart) $0 stop $0 start&lt;br /&gt;
 ;;&lt;br /&gt;
 *) echo &amp;quot;init_apache &amp;lt;start|stop|restart&amp;gt;&amp;quot;&lt;br /&gt;
 esac&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Pentru detalii complete despre modul de pornire a serviciilor la butare cititi capitolul &amp;quot;Managementul Serviciilor&amp;quot; din cursul &amp;quot;Linux Basic Administration&amp;quot; disponibil de asemenea online.&lt;br /&gt;
&lt;br /&gt;
===Select===&lt;br /&gt;
Structura de tip select este specifica doar Bash-ului si se foloseste pentru crearea de meniuri.&lt;br /&gt;
&lt;br /&gt;
Sintaxa acesteia este:&lt;br /&gt;
 select MENUITEM in menu_list&lt;br /&gt;
 do&lt;br /&gt;
 lista_de_comenzi&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
Detalii:&lt;br /&gt;
- menu_list este lista de meniuri. Valorile din lista sunt separate prin spatiu;&lt;br /&gt;
- intre do si done sunt instruciunile ce se executa in functie de meniul ales;&lt;br /&gt;
- intre do si done avem acces la urmatoarele 2 variabile: MENUITEM care contine meniul&lt;br /&gt;
&lt;br /&gt;
selectat si REPLY care se creaza automat si contine inputul userului (ce a scris acesta la consola);&lt;br /&gt;
&lt;br /&gt;
- PS3 contine prompterul de selectare a meniurilor;&lt;br /&gt;
- userul alege un meniu din lista folosind un nr. de ordine: alege 1 pentru primul meniu, 2 pentru al doilea etc;&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 PS3=&amp;quot;Alege:&amp;quot;&lt;br /&gt;
 select ITEM in &amp;quot;Afiseaza continut /etc&amp;quot; &amp;quot;Afiseaza spatiu liber&amp;quot; &amp;quot;Exit&amp;quot;&lt;br /&gt;
 do&lt;br /&gt;
 case $REPLY in&lt;br /&gt;
 1) ls -l /etc&lt;br /&gt;
 ;;&lt;br /&gt;
 2) df -h&lt;br /&gt;
 ;;&lt;br /&gt;
 3) exit 0&lt;br /&gt;
 ;;&lt;br /&gt;
 *) echo &amp;quot;Optiune incorecta&amp;quot;&lt;br /&gt;
 esac&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
==1.6 Substituirea comenzilor==&lt;br /&gt;
Unei variabile i se poate asigna o valoare in 2 moduri:&lt;br /&gt;
1. Folosind NUME_VAR=valoare&lt;br /&gt;
&lt;br /&gt;
Exemplu: EDITOR=&amp;quot;VIM&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Substituind o comanda cu outputul ei&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 VAR=`ls /etc` -&amp;gt; in acest exemplu comanda ls /etc se substituie sau inlocuieste cu outputul ei care se asigneaza variabilei VAR. Variabila VAR va contine outputul comenzii ls -l.&lt;br /&gt;
Nota&lt;br /&gt;
Substituirea unei comenzi cu outputul ei reprezinta unul dintre caracteristicile cele mai puternice ale Bashului, iar majoritatea scripturilor folosesc acest mod de lucru.&lt;br /&gt;
&lt;br /&gt;
Pentru a substitui o comanda cu outputul ei exista 2 variante:&lt;br /&gt;
&lt;br /&gt;
1. Comanda sa incadreza in backquotes ( ``). Atentie, backquotes nu sunt apostroafe sau&lt;br /&gt;
ghilimele simple.&lt;br /&gt;
 Exemplu: ME= `whoiam ` -&amp;gt; variabila ME va contine outputul comenzii whoami&lt;br /&gt;
&lt;br /&gt;
2. Comanda se incadreza intre $( si )&lt;br /&gt;
 Exemplu: ETH0= $(ifconfig eth0) -&amp;gt; variabila numita ETH0 va contine outputul comenzii&lt;br /&gt;
 ifconfig eth0&lt;br /&gt;
 Exemplu script ce nu poate fi rulat de catre root&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 if [ &amp;quot;$(whoami)&amp;quot; = &amp;quot;root&amp;quot; ]&lt;br /&gt;
 then&lt;br /&gt;
 echo &amp;quot;Esti root, sorry !&amp;quot;&lt;br /&gt;
 exit 1;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
#incep instructiunile ce nu pot fi rulate de catre root&amp;quot;&lt;br /&gt;
 ls -la ~&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
&lt;br /&gt;
In momentul in care o variabila de tip string este testat folosind un test pentru stringuri este bine ca aceasta sa fie incadrata intre ghilimele duble pentru a forta tipul ei catre string.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
VAR=&amp;quot;`ifconfig eth0`&amp;quot; if [ -z &amp;quot;$VAR&amp;quot; ] then echo &amp;quot;Interfata eth0 nu exista!&amp;quot; fi&lt;br /&gt;
&lt;br /&gt;
Subshells&lt;br /&gt;
&lt;br /&gt;
Utilizarea subshell-urilor în Bash poate fi avantajoasă din mai multe motive, inclusiv:&lt;br /&gt;
&lt;br /&gt;
 1. Izolarea comenzilor: comenzile executate într -un subshell sunt izolate de cochilie părinte. Aceasta înseamnă că orice modificări aduse la variabile, directoare sau alte setări de mediu din subshell nu vor afecta shell-ul părinte.&lt;br /&gt;
&lt;br /&gt;
 2. Scoping: Variabilele definite într -un subshell au un domeniu local și nu vor afecta variabile cu același nume în shell-ul părinte.&lt;br /&gt;
&lt;br /&gt;
 3. Manevrarea erorilor: subshell -urile pot fi utilizate pentru o mai bună gestionare a erorilor. De exemplu, puteți executa o serie de comenzi într-un subshell și puteți verifica starea de returnare a acesteia fără a afecta fluxul principal al scriptului dvs.&lt;br /&gt;
&lt;br /&gt;
Iată câteva exemple de utilizare a subshell-urilor în Bash:&lt;br /&gt;
&lt;br /&gt;
Schimbarea directorului temporar:&lt;br /&gt;
&lt;br /&gt;
Aceasta schimbă temporar directorul în/calea/în/director, execută comanda LS, apoi se întoarce în directorul original. Schimbarea directorului afectează doar subshell-ul.&lt;br /&gt;
&lt;br /&gt;
-Execuție paralelă:&lt;br /&gt;
&lt;br /&gt;
Aceasta execută mai multe comenzi concomitent în subshell-uri, permițându-le să funcționeze în paralel.&lt;br /&gt;
&lt;br /&gt;
-Manevrarea erorilor:&lt;br /&gt;
&lt;br /&gt;
Aceasta execută comanda1 și comanda2 într -un subshell. Dacă Command1 sau Command2 eșuează (returnează un statut de ieșire non-zero), atunci este ecou „eroare”.&lt;br /&gt;
&lt;br /&gt;
-Setări temporare ale mediului:&lt;br /&gt;
&lt;br /&gt;
Aceasta stabilește o variabilă de mediu temporară la valoare pentru durata comenzii. Odată ce comanda se termină, variabila revine la valoarea sa anterioară (sau este nesetată dacă nu exista înainte).&lt;br /&gt;
&lt;br /&gt;
Subshell-urile sunt versatile și pot fi utilizate creativ pentru a atinge diverse obiective de script, menținând controlul asupra mediului și fluxului de execuție al comenzilor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;In inchiderea cursului Linux Essentials:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La ce pot fi folosite parantezele ( ) in bash?&lt;br /&gt;
&lt;br /&gt;
Utilizari comune&lt;br /&gt;
    1. Substitutia comenzii:&lt;br /&gt;
        ◦ $(command) or `command`: Executa comanda si ii substituie iesirea.&lt;br /&gt;
        ◦ Example: echo $(date) or echo \date``&lt;br /&gt;
    2. Expansie aritmetica:&lt;br /&gt;
        ◦ (( expression )): Performa operatuni aritmetice si le evalueaza expresia.&lt;br /&gt;
        ◦ Example: (( x = 5 + 3 ))&lt;br /&gt;
    3. Crearea unui subshell:&lt;br /&gt;
        ◦ ( commands ): Execute comenzi intr-un subshell, izolandu-i mediul de cea principala.&lt;br /&gt;
        ◦ Example: (cd /path/to/directory &amp;amp;&amp;amp; ls)&lt;br /&gt;
    4. Declararea unei functii:&lt;br /&gt;
        ◦ function_name () { commands; }: Declara o functie.&lt;br /&gt;
    5. Gruparea comenzilor:&lt;br /&gt;
        ◦ { commands; }: Grupeaza mai multe comenzi impreuna, permitandu-le sa ruleze ca si o singura comanda.&lt;br /&gt;
        ◦ Example: { echo &amp;quot;Hello&amp;quot;; echo &amp;quot;World&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Essentials_Pagina_7|Pagina anterioară]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Essentials_Pagina_8&amp;diff=545</id>
		<title>Essentials Pagina 8</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Essentials_Pagina_8&amp;diff=545"/>
		<updated>2025-04-11T08:07:12Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* If..then..else */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Laborator 8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Shell Scripts=&lt;br /&gt;
&lt;br /&gt;
==1.1 Introducere in Bash==&lt;br /&gt;
Shellul este interpretorul de comenzi. Acesta parseaza comenzile introduse de&lt;br /&gt;
utilizator, le verifica din punct de vedere al sintaxei si le trimite kernel-ului spre executie.&lt;br /&gt;
&lt;br /&gt;
Exista mai multe shelluri (Bourne, C Shell, recent aparute Zsh si Fish, etc), dar default pe Linux este shellul numit Bash (Bourne Again Shell). Acesta este reprezentat de fisierul &#039;&#039;/bin/bash&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Pe langa interpretarea si executia comenzilor, Bash-ul ofera si alte facilitati printre&lt;br /&gt;
care: editarea liniei de comanda, history, alias-uri, dar si un limbaj de programare structurat propriu.&lt;br /&gt;
&lt;br /&gt;
Un script de shell este un fisier text (ASCII) care contine comenzi de shell organizate intr-un mod logic. Pe langa comenzi, script-ul mai contine si variabile (locale sau globale), parametri pozitionali precum si structuri de programare specifice (if..then..else, while, do, until, for, case, selsect etc). Un script este folosit pentru a imbina comenzi si diverse structuri de control pentru a oferi o noua functionalitate sau a automatiza task-uri.&lt;br /&gt;
&lt;br /&gt;
Etapele crearii unui script sunt:&lt;br /&gt;
&lt;br /&gt;
a) crearea unui fisier text folosind editorul preferat (Exemplu: vim)&lt;br /&gt;
b) editarea fisierului pentru a contine functionalitatea dorita&lt;br /&gt;
c) testarea scriptului adica executia/rularea acestuia&lt;br /&gt;
&lt;br /&gt;
Modul de executie a unui script numit script1:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Din directorul care contine scriptul se ruleaza : ./script1&lt;br /&gt;
Fisierul script1 trebuie sa aiba dreptul de executie. Fiindca directorul curent (.) nu&lt;br /&gt;
se afla in $PATH (altfel grave probleme de securitate), scriptul trebuie sa fie executat cu calea absoluta sau cu ./nume_script In acest caz se porneste un shell nou ca sub proces al shellului curent in care se executa comenzile din script.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Din directorul care contine fisierul script1 se ruleaza: . script1 sau source script1.&lt;br /&gt;
Se executa comenzile din script1 in shell-ul curent. Fisierul script1 nu trebuie sa&lt;br /&gt;
aiba dreptul de executie. Una dintre diferentele dintre prima si a doua varianta este ca variabilele exportate sau globale sunt vizibile in shell-ul curent in varianta a doua, dar nu si in prima varianta.&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Varianta cea mai folosita de executie a unui script este prima: ./script&lt;br /&gt;
Un script trebuie sa contina pe prima linie o referire la programul cu care se executa (Bash, Perl, PHP, Python etc). Astfel prima linie a unui script Bash este invariabil: #!/bin/bash. In interiorul scriptului #(diez) reprezinta un comentariu. Exceptie face prima linie.&lt;br /&gt;
&lt;br /&gt;
echo se foloseste pentru afisa un string (sir de caractere) sau o variabila la consola.&lt;br /&gt;
Exemplu: echo &amp;quot;Linux&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Script care afiseaza mesajul: Acesta este primul exemplu !&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 echo &amp;quot;Acesta este primul exemplu !&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Script care creaza un fiser numit continut_etc.txt in directorul curent ce contine fisierele si directoarele din directorul /etc, iar apoi afiseaza spatiul total, ocupat si liber de pe fiecare partitie de pe Hard Disk.&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 ls -l /etc &amp;gt; continut_etc.txt&lt;br /&gt;
 echo &amp;quot;Fisierul continut_etc.txt a fost creat in directorul curent!&amp;quot;&lt;br /&gt;
 echo &amp;quot;Informatii partitii:&amp;quot;&lt;br /&gt;
 df -h Important&lt;br /&gt;
&lt;br /&gt;
O cunoastere acceptabila a modului de creare de scripturi este esentiala pentru orice Administrator de sistem. In cazul persoanelor incepatoare care nu au experienta in programare (orice limbaj) procesul de scripting pare la prima vedere extrem de complicat.&lt;br /&gt;
&lt;br /&gt;
Este nevoie de multe exercitii si exemple pentru o intelegere aprofundata. Intotdeauna se incepe cu exercitii simple si anume scripturi formate din cateva randuri.&lt;br /&gt;
&lt;br /&gt;
==1.2 Variabile, constante si functii==&lt;br /&gt;
&lt;br /&gt;
Prezentare generala:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; O variabila reprezinta un nume pentru o locatie de memorie unde se gaseste o valoare. Se obisnuieste (nu este obligatoriu) ca variabilele sa se scrie cu litera mare.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Comparativ cu alte limbaje de programare (C/C++, JAVA) variabilele in Bash nu au tip. Ele sunt string-uri, dar in functie de context pot fi evaluate ca integer etc.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; O variabila se declara: NUME_VAR=valoare&lt;br /&gt;
&lt;br /&gt;
Important&lt;br /&gt;
Nu se foloseste spatiu intre NUME_VAR si valoare. i = 1 reprezinta eroare. Sintaxa bash - ului este extrem de stricta. Un spatiu in plus sau in minus reprezinta o eroare fatala.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 NUME=&amp;quot;dan&amp;quot;&lt;br /&gt;
 varsta=20&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4&#039;&#039;&#039;. Pentru a ne referi la continutul unei varibile se foloseste semnul $ (dollar) in fata numelui variabilei.&lt;br /&gt;
Exemplu: echo $varsta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5&#039;&#039;&#039;. Variabilele pot fi locale sau globale. Cele locale sunt vizibile doar in shell-ul curent, iar cele globale sunt vizibile in shell-ul curent si in toate subprocesele shell-ului curent. Astfel in interiorul unui script daca se foloseste o variabila globala aceasta va fi accesibila oricarei comenzi/program lansata din acel script. Variabilele globale nu sunt accesibile parintelui unui proces, adica shell-ului de unde s-a executat scriptul. Exceptie face varianta 2 de executie a unui script adica folosind source nume_script&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6&#039;&#039;&#039;. Pentru a declara o variabila globala aceasta trebuie exportata. Se foloseste cuvantul cheie export&lt;br /&gt;
&lt;br /&gt;
 Exemplu: export VARSTA=20&lt;br /&gt;
 variabilele globale se numesc de environment;&lt;br /&gt;
 pentru a vizualiza variabilele locale se foloseste comanda set;&lt;br /&gt;
 pentru a vizualiza variabilele globale se foloseste comanda env;&lt;br /&gt;
 pentru sterge o variabila se foloseste comanda unset NUME_VAR;&lt;br /&gt;
&lt;br /&gt;
Exemplu de varibile globale predefinite:&lt;br /&gt;
 PATH -&amp;gt; contine o lista de directoare in care shell-ul cauta comanda care se executa.&lt;br /&gt;
&lt;br /&gt;
Pentru a concatena un string la variabila PATH se foloseste caracterul : (doua puncte).&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&lt;br /&gt;
Daca dorim sa adaugam directorul /home/dan/scripts in PATH: export&lt;br /&gt;
 PATH=PATH:/home/stud/scripts&lt;br /&gt;
&lt;br /&gt;
Dupa aceasta scripturi si comenzi din /home/stud/scripts pot fi rulate in orice director ne am afla doar prin numele lor. Altfel trebuie folosita calea absoluta sau aflandu-ne in&lt;br /&gt;
director se executa: ./nume_comanda&lt;br /&gt;
 HOSTNAME -&amp;gt; contine hostname-ul calculatorului&lt;br /&gt;
 SHELL -&amp;gt; contine shell-ul default&lt;br /&gt;
 HISTSIZE - contine nr. de comenzi care vor fi memorate in history&lt;br /&gt;
 USER -&amp;gt; contine EUID&lt;br /&gt;
 PWD -&amp;gt; contine directorul curent&lt;br /&gt;
 OLDPWD -&amp;gt; contine directorul precedent si se foloseste de comanda: cd –&lt;br /&gt;
 HOME -&amp;gt; contine home directory al EUID&lt;br /&gt;
 RANDOM -&amp;gt; variabila al carei continut este pseudoaleator&lt;br /&gt;
 TMOUT -&amp;gt; nr in secunde dupa care se face logout automat daca nu se executa nicio comanda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7&#039;&#039;&#039;. Diferenta dintre ghilimele simple(apostrof) si ghilimele duble este aceea ca ghilimele simple nu interpreteaza $ ca si caracter special. In interiorul ghilimelelor simple fiecare caracter special cu exceptia &#039; (ghilimea simpla) este interpretat literal.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 varsta=20 echo &amp;quot;$varsta&amp;quot; ##se afiseaza 20 echo &#039;$varsta&#039; ##se afiseaza $varsta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8&#039;&#039;&#039;. O variabila poate fi declarata read-only sau de tip array. O variabila read-only se mai numeste si constanta.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 &#039;&#039;&#039;1.&#039;&#039;&#039; var1 este readonly. Aceasta nu poate fi modificata sau stearsa folosind unset.&lt;br /&gt;
 declare -r var1=7&lt;br /&gt;
 &#039;&#039;&#039;2.&#039;&#039;&#039; Pentru a declara un array/vector:&lt;br /&gt;
 ARRAY=(unu doi trei) echo ${ARRAY[*]} echo ${ARRAY[1]} i=2 echo&lt;br /&gt;
 ${ARRAY[]} unset ARRAY[1] unset ARRAY&lt;br /&gt;
 ARRAY nu este cuvant cheie. In loc de ARRAY poate fi orice cuvant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;9&#039;&#039;&#039;. Pentru a citi o variabila de la tastatura se foloseste cuvantul cheie read&lt;br /&gt;
Exemplu:&lt;br /&gt;
 #!/bin/bash echo &amp;quot;Introdu nume fisier:&amp;quot; read FILE echo &amp;quot;Fisierul introdus este $FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10&#039;&#039;&#039;. In bash exista caractere speciale care sunt interpretate in mod deosebit.&lt;br /&gt;
 Exemple: $ (dollar), &amp;quot;(ghilimea dubla) sau \ (backslash). Pentru a anula efectul special al&lt;br /&gt;
caracterului, acesta se precede cu \ (backslash).&lt;br /&gt;
&lt;br /&gt;
 Exemplu: echo \$var -&amp;gt; Afiseaza $var. $ nu mai este caracter special.&lt;br /&gt;
&lt;br /&gt;
==1.3 Parametri pozitionali==&lt;br /&gt;
Bash-ul foloseste parametri speciali la care ne putem referi in interiorul unui script&lt;br /&gt;
pentru a avea acces la anumite valori. Acesti parametri speciali se pot folosi ca si&lt;br /&gt;
variabilele, doar ca exista default si nu trebuie creati. Continutul acestora este de asemenea standard.&lt;br /&gt;
&lt;br /&gt;
Acestia sunt:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; $0 - contine numele scriptului&lt;br /&gt;
Scriptul poate actiona diferit in functie de numele cu care a fost rulat ( Exemplu:&lt;br /&gt;
daca se ruleaza folosind un simlink al scriptului. Vezi comanda /bin/egrep care este un simlink catre /bin/grep dar are totusi functionalitate diferita).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; $1 - reprezinta primul argument al scriptului, $2 al doilea argument al scriptului etc. Incepand cu argumentul 10 acesta trebuie incadrat intre acolade ${10}, ${11} etc.&lt;br /&gt;
Se folosesc pentru a evita erori in momentul in care scriptul este rulat fara argumente sau cu un alt nr. de argumente (iar acesta asteapta sa primeasca argumente).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; $? - reprezinta statusul ultimei comenzi executate.&lt;br /&gt;
In Bash Zero este statusul pentru non-error iar diferit de zero este statusul pentru eroare. Orice comanda/program are un status de exit, zero sau non-zero. Se foloseste pentru a continua executia scriptului (sau a modifica comportamentul acestuia) in functie de statusul comenzilor anterioare.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; $# - reprezinta nr. de argumente ale scriptului Se poate lua o decizie in functie de nr. de argumente cu care a fost rulat scriptul.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.&#039;&#039;&#039; $* - reprezinta toate argumentele date scriptului.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.&#039;&#039;&#039; $$ - reprezinta PID shell.&lt;br /&gt;
Astel in functie de cum rulam scriptul $$ are alta valoare:source f1 - $$ reprezinta PID bash (shell curent) ./f1 - $$ reprezinta PID noului sub-shell creat in care se executa comenzile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.&#039;&#039;&#039; $! - reprezinta PID ultimului proces executat in background.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Script care sterge fisierul sau directorul pe care-l primeste ca argument&lt;br /&gt;
 #!/bin/bash rm -rf $1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Afisarea numelui scriptului&lt;br /&gt;
 #!/bin/bash Echo &amp;quot;Numele scriptului executat este: $0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==1.4 Alte facilitati Bash==&lt;br /&gt;
===Alias===&lt;br /&gt;
Un alias reprezinta un mod prin care o comanda sau o serie de comenzi se executa folosind un alt nume.&lt;br /&gt;
Pentru a crea un alias se foloseste comanda: alias comanda_noua=&#039;comanda_substituita&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. alias copy=&#039;cp&#039;&lt;br /&gt;
2. alias search=&#039;grep&#039;&lt;br /&gt;
3. alias ls=&#039;ls -F&#039;&lt;br /&gt;
4. alias rm=&#039;rm -i&#039;&lt;br /&gt;
5. alias ll=&#039;ls -l&#039;&lt;br /&gt;
6. alias stop=&#039;kill -9&#039;&lt;br /&gt;
&lt;br /&gt;
Daca aliasul este compus din mai multe cuvinte acestea trebuie incadrate intre&lt;br /&gt;
ghilimele simple (apostrof).Pentru a vizualiza toate aliasurile din sistem se foloseste comanda alias fara nici un argument.Pentru a executa comanda originala in locul aliasului se foloseste \ (backslash) urmat de comanda.&lt;br /&gt;
&lt;br /&gt;
Example: \ls&lt;br /&gt;
Pentru a sterge un alias se foloseste comanda unalias&lt;br /&gt;
Exemplu: unalias ls&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Un alias exista doar in shell-ul curent (nu exista nici macar in subshell-urile shell-ului curent).&lt;br /&gt;
&lt;br /&gt;
===Customizare Environment===&lt;br /&gt;
Prompting variables (prompt strings)&lt;br /&gt;
&lt;br /&gt;
Bash foloseste 4 variabile speciale numite &amp;quot;prompt strings&amp;quot;: PS1, PS2, PS3 si PS4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; PS1 este numit &amp;quot;primary prompt string&amp;quot; si reprezinta prompterul curent.&lt;br /&gt;
De cele mai multe ori acesta se modifica pentru a arata informatii cat mai utile despre sesiunea curenta.&lt;br /&gt;
&lt;br /&gt;
 PS1 foloseste niste macro-uri care se expandeaza cu un anumit continut astfel:&lt;br /&gt;
 \A - current time in HH:MM hours format&lt;br /&gt;
 \d - current date&lt;br /&gt;
 \@ - the current time in 12 hours format&lt;br /&gt;
 \H - the hostname&lt;br /&gt;
 \h - the hostname up to the first dot (.)&lt;br /&gt;
 \s - the name of the shell&lt;br /&gt;
 \u - username of the EUID&lt;br /&gt;
 \w - the current working directory&lt;br /&gt;
 \W - the current working directory (basename) - relativ&lt;br /&gt;
 \$ - if EUID==0 print # else print $&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Un exemplu excelent de modificare PS1 este: export PS1=&#039;[\u@\h \w]$&#039;&lt;br /&gt;
Avand acest prompter adminul are intotdeauna informatii despre userul cu care s-a conectat, host-ul pe care este conectat precum si calea absoluta a directorului curent. Linia de mai sus se adauga in fisierul de customizare ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; PS2 este numit &amp;quot;secondary prompt string&amp;quot; si are valoarea default &amp;gt; (mai mare).&lt;br /&gt;
Se foloseste atunci cand se scrie o comanda incompleta si se apasa ENTER.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; PS3 se numeste &amp;quot;prompt string for the select command&amp;quot; si se foloseste in scripting impreuna cu comanda select&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; PS4 se numeste &amp;quot;prompt string for the xtrace option&amp;quot; si reprezinta un prompt string folosit in debugging si flow control.&lt;br /&gt;
&lt;br /&gt;
===Environment===&lt;br /&gt;
Fiecare utilizator are propriul mediu de lucru numit si Environment. Customizarea&lt;br /&gt;
Environmentului presupune modificarea unor variabile si parametri astfel incat mediul de lucru sa fie cat mai prietenos si sa ne ofere cat mai multe informatii.&lt;br /&gt;
Din mediul de lucru al unui utilizator fac parte: aliasurile sale, umask, modul de&lt;br /&gt;
afisare al prompterului, variabila PATH in care shellul cauta comenzile, ulimit etc&lt;br /&gt;
&lt;br /&gt;
Exista fisiere de initializare pentru fiecare user care sunt citite de shell la fiecare&lt;br /&gt;
pornire a acestuia:&lt;br /&gt;
&lt;br /&gt;
~/.bashrc - este primul fisier citit de shell la login. In acest fisier trebuie declarate variabile,&lt;br /&gt;
alias-uri etc pentru fiecare user.&lt;br /&gt;
~/.bash_profile - este citit dupa ~/.bashrc&lt;br /&gt;
~/.bash_logout - este citit de shell inainte de logout. In acest fisier se pot reseta variabile, sterge fisiere temporare sau alte functii care vrem sa aiba loc inainte de logout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fisierul /etc/profile este un alt fisier de customizare &amp;quot;system-wide&amp;quot;. Acesta nu&lt;br /&gt;
apartine unui anumit user, iar in el se configureaza mediul pentru toti userii. Il folosim de exemplu daca dorim setarea unui alias pentru toti userii din sistem.&lt;br /&gt;
Aceste fisiere nu sunt recitite automat de shell dupa modificare. Toate configurarile au efect dupa o noua logare in cazul ~/.bashrc sau ~/.bash_profile sau dupa o restartare a sistemului in cazul /etc/profile.Pentru a forta recitirea lor se foloseste comanda source sau . (dot) urmata de nume fisier. source sau . executa comenzile din interiorul fisierului in shellul curent.&lt;br /&gt;
&lt;br /&gt;
Exemplu: source ~/.bashrc sau . ~/.bashrc&lt;br /&gt;
Daca ~/.bash_profile nu exista shell-ul cauta ~/.bash_login. Daca nici aceasta nu exista cauta ~/.profile.&lt;br /&gt;
In aceste fisiere speciale de initializare se seteaza: PS1, TMOUT, PATH, alias, umask etc pentru fiecare utilizator&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Fisierele de initializare pentru fiecare utilizator se gasesc in home directory al acestuia (~) si sunt ascunse fiindca incep cu .(punct). Pentru vizualizarea lor se foloseste comanda ls cu optiunea -a Exemplu: ls -la ~&lt;br /&gt;
&lt;br /&gt;
In functie de distributia de Linux numele si ordinea de citire a fisierelor de customizare a mediului de lucru pentru fiecare user poate sa difere. Totusi, pe marea majoritate a distributiilor de Linux (RedHat, Fedora, CentOS, Suse, Ubuntu, Kubuntu, Debian) exista ~/.bashrc. In acest caz se recomanda folosirea doar a acestuia&lt;br /&gt;
&lt;br /&gt;
Exemplu ~/.bashrc:&lt;br /&gt;
&lt;br /&gt;
 # User specific aliases and functions &lt;br /&gt;
 alias rm=&#039;rm -i&#039; &lt;br /&gt;
 alias cp=&#039;cp -i&#039; &lt;br /&gt;
 alias mv=&#039;mv -i&#039; &lt;br /&gt;
 alias cauta=find &lt;br /&gt;
 alias muta=mv &lt;br /&gt;
 alias S=&#039;ssh -l root -p 7890 ssh.crystalmind.ro&#039; &lt;br /&gt;
 # Source global definitions &lt;br /&gt;
 if [ -f /etc/bashrc ]; then &lt;br /&gt;
   . /etc/bashrc &lt;br /&gt;
 fi &lt;br /&gt;
 export PS1=&#039;[\u@\h \w]$&#039; &lt;br /&gt;
 export PATH=:/home/gabriel/scripts &lt;br /&gt;
 umask=0022&lt;br /&gt;
&lt;br /&gt;
==1.5 Flow Control==&lt;br /&gt;
===Conditii de testare===&lt;br /&gt;
Nota&lt;br /&gt;
Informatiile din acesta pagina au scopul de referinta pentru testele folosite de structurile de control ce urmeaza a fi prezentate. Ele nu trebuie invatate la acest moment in afara conextului de flow control ci doar impreuna cu structurile if..then..else, while, case etc&lt;br /&gt;
&lt;br /&gt;
Structurile de control (if..then..else, while etc) presupun conditii de testare.&lt;br /&gt;
&lt;br /&gt;
Acestea sunt:&lt;br /&gt;
 1. Pentru fisiere&lt;br /&gt;
 -e = fisierul exista&lt;br /&gt;
 -f = fisierul exista si este de tipul regular file&lt;br /&gt;
 Exemplu: -f $FILE&lt;br /&gt;
 -s = fisierul nu are dimensiunea zero&lt;br /&gt;
 -d = fisierul exista si este de tip director&lt;br /&gt;
 -c = fisierul exista si este de tip char device&lt;br /&gt;
 -b = fisierul exista si este de tip block device&lt;br /&gt;
 -r = fisierul exista si are permisiunea read&lt;br /&gt;
 -w = fisierul exista si are permisiunea write&lt;br /&gt;
 -x = fisierul exista si are permisiunea execute&lt;br /&gt;
 -g = fisierul are GUID setat&lt;br /&gt;
 -u = fisierul are SUID setat&lt;br /&gt;
 -k = fisierul are sticky bit setat&lt;br /&gt;
 -nt = fisierul este mai nou decat un alt fisier&lt;br /&gt;
 Exemplu: file1 -nt file = file1 is newer than file2&lt;br /&gt;
 ! -&amp;gt; inverseaza sensul (neaga)&lt;br /&gt;
&lt;br /&gt;
2. Pentru comparatie&lt;br /&gt;
 -eq = equal to&lt;br /&gt;
 -ne = not equal to&lt;br /&gt;
 -gt = greater than&lt;br /&gt;
 Exemplu: $i -gt -$j&lt;br /&gt;
 -ge = greater than or equal&lt;br /&gt;
 -lt = less than&lt;br /&gt;
 -le = less than or egal&lt;br /&gt;
&lt;br /&gt;
3. Pentru stringuri (siruri de caractere)&lt;br /&gt;
 -z = lungimea sirului este zero&lt;br /&gt;
 -n = lungimea sirului este non-zero&lt;br /&gt;
 = egal (comparativ cu alte limbaje de programare operatorul de comparatie este un singur egal) != diferit&lt;br /&gt;
 Exemplu: $str1 != $str2&lt;br /&gt;
 -a = SI LOGIC (AND)&lt;br /&gt;
 -o = SAU LOGIC (OR)&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Testul este adevarat daca ambele conditii sunt adevarate simultan (valoarea variabilei USER este root si valoarea variabilei SHELL este bash)&lt;br /&gt;
 $USER = &amp;quot;root&amp;quot; -a $SHELL = &amp;quot;bash&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In cazul comparatiei a doua stringuri din punct de vedere al sintaxei bash este obligatoriu un spatiu inainte de = (egal) si un spatiu dupa = (egal).&lt;br /&gt;
 Exemplu: $USER=&amp;quot;root&amp;quot; este gresit, $USER = &amp;quot;root&amp;quot; este corect.&lt;br /&gt;
&lt;br /&gt;
2. Testul este adevarat daca una dintre conditii este adevarata(i mai mic ca 10 SAU i mai mare ca 100) $i -lt 10 -o $i gt 100&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Contiditiile de testare prezentate mai sus sunt doar cele mai folosite. Pentru lista completa executati: &lt;br /&gt;
  man test &lt;br /&gt;
  test EXPR &#039;&#039;sau&#039;&#039; [ EXPR ] #au acelasi rezultat.&lt;br /&gt;
&lt;br /&gt;
===If..then..else===&lt;br /&gt;
Cea mai simpla constructie de flow control este cea conditionala reprezentata de if.&lt;br /&gt;
In functie de o valoarea de adevar a unei conditii se stabilesc instructiunile ce trebuie executate. Conditiile de test se refera la proprietati ale fisierelor, comparatii numerice sau sunt referitoare la stringuri.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if este:&lt;br /&gt;
 if [ conditie_de_test ] then lista_de_instructiuni fi&lt;br /&gt;
Daca conditia de test este adevarata se executa lista de instructiuni, altfel aceasta nu se executa.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Daca primul argument al scriptului este fisier se executa: cat fisier&lt;br /&gt;
 if [ -f $1 ] then cat $1 fi&lt;br /&gt;
&lt;br /&gt;
2. Daca valoarea variabilei i este 10 se afiseaza mesajul &amp;quot;Variabila i are valoarea 10&amp;quot; if [ $i -eq 10 ] then echo &amp;quot;Variabila i are valoarea 10&amp;quot; fi&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if..else este:&lt;br /&gt;
 if [ conditie_de_test ] then lista_de_instructiuni else lista_de_instructiuni_default fi&lt;br /&gt;
&lt;br /&gt;
Data conditia de test este adevarata se executa lista_de_instructiuni, altfel se executa lista_de_instructiuni_default&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Daca valoarea variabilei VARSTA citita de la tastatura este mai mica decat 18 se afiseaza mesajul &amp;quot;Esti minor!&amp;quot;, altfel se afiseaza mesajul &amp;quot;Esti major!&amp;quot;&lt;br /&gt;
 #!/bin/bash echo &amp;quot;Introdu varsta:&amp;quot; read VARSTA if [ $VARSTA -lt 18 ] then echo &amp;quot;Esti minor!&amp;quot; else echo &amp;quot;Esti major!&amp;quot; fi&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if..elif..else este:&lt;br /&gt;
 if [ conditie_de_test1 ] then lista_de_instructiuni1 elif [ conditie_de_test2 ] then&lt;br /&gt;
 lista_de_instructiuni2 elif [ conditie_de_test3 ] then lista_de_instructiuni3 else&lt;br /&gt;
 lista_de_instructiuni_default fi&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Daca variabila ORA citita de la tastatura este mai mica decat 12 se afiseaza mesajul &amp;quot;Buna dimineata&amp;quot; daca este intre 12 si 18 se afiseaza mesajul &amp;quot;Buna ziua&amp;quot;, daca este intre 18 si 24 se afiseaza &amp;quot;Noapte Buna!&amp;quot;. Pentru orice alta situatie se afiseaza mesajul &amp;quot;Eroare!&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 read i &lt;br /&gt;
 if [ $i -lt 12 ]; then&lt;br /&gt;
   echo &amp;quot;Buna dimineata!&amp;quot; &lt;br /&gt;
 elif [ $i -ge 12 -a $i -lt 18 ]; then &lt;br /&gt;
   echo &amp;quot;Buna ziua!&amp;quot; &lt;br /&gt;
 elif [ $i -ge 18 -a $i -le 24 ]; then &lt;br /&gt;
   echo &amp;quot;Noapte buna !&amp;quot; &lt;br /&gt;
 else &lt;br /&gt;
   echo &amp;quot;Eroare!&amp;quot; &lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
-a reprezinta SI LOGIC (AND). Testul este adevarat daca ambele conditii sunt adevarate simultan.&lt;br /&gt;
&lt;br /&gt;
-o reprezinta SAU LOGIC (OR). Testul este adevarat daca una dintre contitii este adevarata.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exemplu&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
1. Testul este adevarat daca ambele conditii sunt adevarate (primul parametru este fisier si exista si are si permisiunea de read). Ambele conditii sunt adevarate simultan.&lt;br /&gt;
 if [ -e $1 -a -r ]&lt;br /&gt;
&lt;br /&gt;
2. Testul este adevarat daca primul parametru primit de script este fisier SAU acesta este director. Una dintre conditii este adevarata.&lt;br /&gt;
 if [ -f $1 -o -d $1 ]&lt;br /&gt;
&lt;br /&gt;
===For===&lt;br /&gt;
For se foloseste pentru a executa o sectiune de cod de un numar repetat de ori&lt;br /&gt;
(ciclu). Varianta clasica de for din Bash este diferita de cea din alte limbaje de programare.&lt;br /&gt;
Sintaxa pentru for este:&lt;br /&gt;
for VAR in lista_de_valori do instructiuni done&lt;br /&gt;
Se executa instructiunile specificate de atatea ori cate valori avem in lista. Pentru fiecare iteratie variabila VAR ia o valoare din lista_de_valori. Separatorul pentru valorile din lista este default spatiu sau valoarea variabilei globale IFS.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Script care exemplifica ciclul de tip for prin trimiterea unui pachet ping la fiecare din cele 3 IP-uri.&lt;br /&gt;
&lt;br /&gt;
Instructiunile dintre do si done se executa de atatea ori cate valori avem in lista (3 valori).&lt;br /&gt;
&lt;br /&gt;
Pentru fiecare ciclu valoarea variabilei IP este o valoare din lista. Valorile din lista sunt separate prin spatiu.&lt;br /&gt;
 #!/bin/bash for IP in 192.168.0.1 192.168.0.2 192.168.0.3 do ping -c 1 $IP done&lt;br /&gt;
&lt;br /&gt;
2. Exemplu for modificand valoara variabilei IFS care este separatorul valorilor.&lt;br /&gt;
 #!/bin/bash #Acest script afiseaza fiecare director din $PATH pe cate un rand IFS=: for DIR in $PATH do echo $DIR done&lt;br /&gt;
&lt;br /&gt;
In Bash exista si structura de tip for ca in C/C++. Aceasta este insa mai putin folosita.&lt;br /&gt;
&lt;br /&gt;
 Exemplu&lt;br /&gt;
 for ca in C/C++:&lt;br /&gt;
 LIMIT=10 for((a=0;a&amp;lt;=$LIMIT;a++)) do echo $a done&lt;br /&gt;
&lt;br /&gt;
===While===&lt;br /&gt;
Structura de tip while se foloseste pentru a executa o serie de instructiuni (cele&lt;br /&gt;
dintre do si done) atata timp cat conditia de test este adevarata.&lt;br /&gt;
&lt;br /&gt;
while [ conditie_de_test ] do lista_de_instructiuni done&lt;br /&gt;
&lt;br /&gt;
Exemplu while:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 #script care afiseaza numerele intre 0 zi 100&lt;br /&gt;
 LIMIT=100&lt;br /&gt;
 i=0&lt;br /&gt;
 while [ $i –le $LIMIT ]&lt;br /&gt;
 do&lt;br /&gt;
 echo &amp;quot;i=$i&amp;quot;&lt;br /&gt;
 let i=i+1&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Case===&lt;br /&gt;
Structura de tip case se foloseste pentru a executa o serie de instructiuni in functie de diferite conditii de testare.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru case este:&lt;br /&gt;
&lt;br /&gt;
 case VARIABILA in&lt;br /&gt;
 valoare1)&lt;br /&gt;
 instructiuni1&lt;br /&gt;
 ;;&lt;br /&gt;
 valoare2)&lt;br /&gt;
 instructiuni&lt;br /&gt;
 ;;&lt;br /&gt;
 *)&lt;br /&gt;
 instructiuni_default&lt;br /&gt;
 ;;&lt;br /&gt;
 esac&lt;br /&gt;
 * -&amp;gt; reprezinta instructiunile ce se vor executa default daca variabila nu are niciuna dintre valorile de mai sus.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 #!/bin/bash echo &amp;quot;Introdu nr:&amp;quot; read nr case $nr in 1) echo &amp;quot;nr este 1&amp;quot; ;; 2) echo &amp;quot;nr este2&amp;quot; ;; *) echo &amp;quot;nr are alta valoare&amp;quot; ;; esac&lt;br /&gt;
Structura de tip case poate fi oricand inlocuita cu o structura de tip if..elif..else&lt;br /&gt;
&lt;br /&gt;
Exemplul de mai sus folosind if..elif..else este:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 echo &amp;quot;Introdu nr:&amp;quot;&lt;br /&gt;
 read nr&lt;br /&gt;
 if [ $nr -eq 1 ]&lt;br /&gt;
 then echo &amp;quot;nr este 1&amp;quot;&lt;br /&gt;
 elif [ $nr -eq 2 ]&lt;br /&gt;
 then&lt;br /&gt;
 echo &amp;quot;nr este 2&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
 echo &amp;quot;nr este altceva&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Important&lt;br /&gt;
&lt;br /&gt;
Structura de tip case este foarte importanta si trebuie inteleasa bine. Toate&lt;br /&gt;
scripturile de initializare a serviciilor (cele din /etc/init.d ) folosesc o structura de tip case.&lt;br /&gt;
&lt;br /&gt;
Structura unui script de initializare din /etc/init.d este:&lt;br /&gt;
 case $1 in&lt;br /&gt;
 start) instructiuni de pornire serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 stop) instuctiuni de oprire serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 restart) instructiuni de restartare serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 *) afisare help script &lt;br /&gt;
 esac&lt;br /&gt;
&lt;br /&gt;
$1 reprezinta primul parametru al scriptului si poate fi start, stop sau restart.&lt;br /&gt;
&lt;br /&gt;
Exemplu: Pentru restartarea retelei se foloseste: /etc/init.d/network restart, unde network este scriptul de initializare iar restart primul parametru pe care-l primeste.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Presupunem ca am compilat si instalat serverul Apache in directorul /opt/apache.&lt;br /&gt;
Daemonul http se porneste ruland comanda: /opt/apache/bin/apachectl start, se opreste cu /opt/apache/bin/apachectl stop si se restarteaza cu /opt/apache/bin/apachectl restart. Se doreste pornirea serverului la butarea sistemului, mai exact la intrarea in runlevel 3.&lt;br /&gt;
&lt;br /&gt;
Etape:&lt;br /&gt;
1. Se creaza un script in /etc/init.d. Numele poate fi ales aleator, in exemplul nostru acesta se numeste init_apache&lt;br /&gt;
2. Se creaza un symlink catre /etc/init.d/init_apache in /etc/init.d/rc3.d numit S99Apache. Numele symlinkului este important sa inceapa cu litera S urmata de un umar intre 0 si 99.&lt;br /&gt;
&lt;br /&gt;
La intrarea in runlevel 3 se va rula automat acest script cu parametrul start.&lt;br /&gt;
Structura scriptului /etc/init.d/init_apache este:&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 case $1 in&lt;br /&gt;
 start)&lt;br /&gt;
 echo &amp;quot;Starting Apache...&amp;quot; /opt/apache/bin/apachectl start echo &amp;quot;OK&amp;quot;&lt;br /&gt;
 ;;&lt;br /&gt;
 stop) echo &amp;quot;Shutting down Apache...&amp;quot; /opt/apache/bin/apachectl stop echo &amp;quot;OK&amp;quot;&lt;br /&gt;
 ;;&lt;br /&gt;
 restart) $0 stop $0 start&lt;br /&gt;
 ;;&lt;br /&gt;
 *) echo &amp;quot;init_apache &amp;lt;start|stop|restart&amp;gt;&amp;quot;&lt;br /&gt;
 esac&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Pentru detalii complete despre modul de pornire a serviciilor la butare cititi capitolul &amp;quot;Managementul Serviciilor&amp;quot; din cursul &amp;quot;Linux Basic Administration&amp;quot; disponibil de asemenea online.&lt;br /&gt;
&lt;br /&gt;
===Select===&lt;br /&gt;
Structura de tip select este specifica doar Bash-ului si se foloseste pentru crearea de meniuri.&lt;br /&gt;
&lt;br /&gt;
Sintaxa acesteia este:&lt;br /&gt;
 select MENUITEM in menu_list&lt;br /&gt;
 do&lt;br /&gt;
 lista_de_comenzi&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
Detalii:&lt;br /&gt;
- menu_list este lista de meniuri. Valorile din lista sunt separate prin spatiu;&lt;br /&gt;
- intre do si done sunt instruciunile ce se executa in functie de meniul ales;&lt;br /&gt;
- intre do si done avem acces la urmatoarele 2 variabile: MENUITEM care contine meniul&lt;br /&gt;
&lt;br /&gt;
selectat si REPLY care se creaza automat si contine inputul userului (ce a scris acesta la consola);&lt;br /&gt;
&lt;br /&gt;
- PS3 contine prompterul de selectare a meniurilor;&lt;br /&gt;
- userul alege un meniu din lista folosind un nr. de ordine: alege 1 pentru primul meniu, 2 pentru al doilea etc;&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 PS3=&amp;quot;Alege:&amp;quot;&lt;br /&gt;
 select ITEM in &amp;quot;Afiseaza continut /etc&amp;quot; &amp;quot;Afiseaza spatiu liber&amp;quot; &amp;quot;Exit&amp;quot;&lt;br /&gt;
 do&lt;br /&gt;
 case $REPLY in&lt;br /&gt;
 1) ls -l /etc&lt;br /&gt;
 ;;&lt;br /&gt;
 2) df -h&lt;br /&gt;
 ;;&lt;br /&gt;
 3) exit 0&lt;br /&gt;
 ;;&lt;br /&gt;
 *) echo &amp;quot;Optiune incorecta&amp;quot;&lt;br /&gt;
 esac&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
==1.6 Substituirea comenzilor==&lt;br /&gt;
Unei variabile i se poate asigna o valoare in 2 moduri:&lt;br /&gt;
1. Folosind NUME_VAR=valoare&lt;br /&gt;
&lt;br /&gt;
Exemplu: EDITOR=&amp;quot;VIM&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Substituind o comanda cu outputul ei&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 VAR=`ls /etc` -&amp;gt; in acest exemplu comanda ls /etc se substituie sau inlocuieste cu outputul ei care se asigneaza variabilei VAR. Variabila VAR va contine outputul comenzii ls -l.&lt;br /&gt;
Nota&lt;br /&gt;
Substituirea unei comenzi cu outputul ei reprezinta unul dintre caracteristicile cele mai puternice ale Bashului, iar majoritatea scripturilor folosesc acest mod de lucru.&lt;br /&gt;
&lt;br /&gt;
Pentru a substitui o comanda cu outputul ei exista 2 variante:&lt;br /&gt;
&lt;br /&gt;
1. Comanda sa incadreza in backquotes ( ``). Atentie, backquotes nu sunt apostroafe sau&lt;br /&gt;
ghilimele simple.&lt;br /&gt;
 Exemplu: ME= `whoiam ` -&amp;gt; variabila ME va contine outputul comenzii whoami&lt;br /&gt;
&lt;br /&gt;
2. Comanda se incadreza intre $( si )&lt;br /&gt;
 Exemplu: ETH0= $(ifconfig eth0) -&amp;gt; variabila numita ETH0 va contine outputul comenzii&lt;br /&gt;
 ifconfig eth0&lt;br /&gt;
 Exemplu script ce nu poate fi rulat de catre root&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 if [ &amp;quot;$(whoami)&amp;quot; = &amp;quot;root&amp;quot; ]&lt;br /&gt;
 then&lt;br /&gt;
 echo &amp;quot;Esti root, sorry !&amp;quot;&lt;br /&gt;
 exit 1;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
#incep instructiunile ce nu pot fi rulate de catre root&amp;quot;&lt;br /&gt;
 ls -la ~&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
&lt;br /&gt;
In momentul in care o variabila de tip string este testat folosind un test pentru stringuri este bine ca aceasta sa fie incadrata intre ghilimele duble pentru a forta tipul ei catre string.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
VAR=&amp;quot;`ifconfig eth0`&amp;quot; if [ -z &amp;quot;$VAR&amp;quot; ] then echo &amp;quot;Interfata eth0 nu exista!&amp;quot; fi&lt;br /&gt;
&lt;br /&gt;
Subshells&lt;br /&gt;
&lt;br /&gt;
Utilizarea subshell-urilor în Bash poate fi avantajoasă din mai multe motive, inclusiv:&lt;br /&gt;
&lt;br /&gt;
 1. Izolarea comenzilor: comenzile executate într -un subshell sunt izolate de cochilie părinte. Aceasta înseamnă că orice modificări aduse la variabile, directoare sau alte setări de mediu din subshell nu vor afecta shell-ul părinte.&lt;br /&gt;
&lt;br /&gt;
 2. Scoping: Variabilele definite într -un subshell au un domeniu local și nu vor afecta variabile cu același nume în shell-ul părinte.&lt;br /&gt;
&lt;br /&gt;
 3. Manevrarea erorilor: subshell -urile pot fi utilizate pentru o mai bună gestionare a erorilor. De exemplu, puteți executa o serie de comenzi într-un subshell și puteți verifica starea de returnare a acesteia fără a afecta fluxul principal al scriptului dvs.&lt;br /&gt;
&lt;br /&gt;
Iată câteva exemple de utilizare a subshell-urilor în Bash:&lt;br /&gt;
&lt;br /&gt;
Schimbarea directorului temporar:&lt;br /&gt;
&lt;br /&gt;
Aceasta schimbă temporar directorul în/calea/în/director, execută comanda LS, apoi se întoarce în directorul original. Schimbarea directorului afectează doar subshell-ul.&lt;br /&gt;
&lt;br /&gt;
-Execuție paralelă:&lt;br /&gt;
&lt;br /&gt;
Aceasta execută mai multe comenzi concomitent în subshell-uri, permițându-le să funcționeze în paralel.&lt;br /&gt;
&lt;br /&gt;
-Manevrarea erorilor:&lt;br /&gt;
&lt;br /&gt;
Aceasta execută comanda1 și comanda2 într -un subshell. Dacă Command1 sau Command2 eșuează (returnează un statut de ieșire non-zero), atunci este ecou „eroare”.&lt;br /&gt;
&lt;br /&gt;
-Setări temporare ale mediului:&lt;br /&gt;
&lt;br /&gt;
Aceasta stabilește o variabilă de mediu temporară la valoare pentru durata comenzii. Odată ce comanda se termină, variabila revine la valoarea sa anterioară (sau este nesetată dacă nu exista înainte).&lt;br /&gt;
&lt;br /&gt;
Subshell-urile sunt versatile și pot fi utilizate creativ pentru a atinge diverse obiective de script, menținând controlul asupra mediului și fluxului de execuție al comenzilor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;In inchiderea cursului Linux Essentials:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La ce pot fi folosite parantezele ( ) in bash?&lt;br /&gt;
&lt;br /&gt;
Utilizari comune&lt;br /&gt;
    1. Substitutia comenzii:&lt;br /&gt;
        ◦ $(command) or `command`: Executa comanda si ii substituie iesirea.&lt;br /&gt;
        ◦ Example: echo $(date) or echo \date``&lt;br /&gt;
    2. Expansie aritmetica:&lt;br /&gt;
        ◦ (( expression )): Performa operatuni aritmetice si le evalueaza expresia.&lt;br /&gt;
        ◦ Example: (( x = 5 + 3 ))&lt;br /&gt;
    3. Crearea unui subshell:&lt;br /&gt;
        ◦ ( commands ): Execute comenzi intr-un subshell, izolandu-i mediul de cea principala.&lt;br /&gt;
        ◦ Example: (cd /path/to/directory &amp;amp;&amp;amp; ls)&lt;br /&gt;
    4. Declararea unei functii:&lt;br /&gt;
        ◦ function_name () { commands; }: Declara o functie.&lt;br /&gt;
    5. Gruparea comenzilor:&lt;br /&gt;
        ◦ { commands; }: Grupeaza mai multe comenzi impreuna, permitandu-le sa ruleze ca si o singura comanda.&lt;br /&gt;
        ◦ Example: { echo &amp;quot;Hello&amp;quot;; echo &amp;quot;World&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Essentials_Pagina_7|Pagina anterioară]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Essentials_Pagina_8&amp;diff=544</id>
		<title>Essentials Pagina 8</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Essentials_Pagina_8&amp;diff=544"/>
		<updated>2025-04-11T08:04:19Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Conditii de testare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Laborator 8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Shell Scripts=&lt;br /&gt;
&lt;br /&gt;
==1.1 Introducere in Bash==&lt;br /&gt;
Shellul este interpretorul de comenzi. Acesta parseaza comenzile introduse de&lt;br /&gt;
utilizator, le verifica din punct de vedere al sintaxei si le trimite kernel-ului spre executie.&lt;br /&gt;
&lt;br /&gt;
Exista mai multe shelluri (Bourne, C Shell, recent aparute Zsh si Fish, etc), dar default pe Linux este shellul numit Bash (Bourne Again Shell). Acesta este reprezentat de fisierul &#039;&#039;/bin/bash&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Pe langa interpretarea si executia comenzilor, Bash-ul ofera si alte facilitati printre&lt;br /&gt;
care: editarea liniei de comanda, history, alias-uri, dar si un limbaj de programare structurat propriu.&lt;br /&gt;
&lt;br /&gt;
Un script de shell este un fisier text (ASCII) care contine comenzi de shell organizate intr-un mod logic. Pe langa comenzi, script-ul mai contine si variabile (locale sau globale), parametri pozitionali precum si structuri de programare specifice (if..then..else, while, do, until, for, case, selsect etc). Un script este folosit pentru a imbina comenzi si diverse structuri de control pentru a oferi o noua functionalitate sau a automatiza task-uri.&lt;br /&gt;
&lt;br /&gt;
Etapele crearii unui script sunt:&lt;br /&gt;
&lt;br /&gt;
a) crearea unui fisier text folosind editorul preferat (Exemplu: vim)&lt;br /&gt;
b) editarea fisierului pentru a contine functionalitatea dorita&lt;br /&gt;
c) testarea scriptului adica executia/rularea acestuia&lt;br /&gt;
&lt;br /&gt;
Modul de executie a unui script numit script1:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Din directorul care contine scriptul se ruleaza : ./script1&lt;br /&gt;
Fisierul script1 trebuie sa aiba dreptul de executie. Fiindca directorul curent (.) nu&lt;br /&gt;
se afla in $PATH (altfel grave probleme de securitate), scriptul trebuie sa fie executat cu calea absoluta sau cu ./nume_script In acest caz se porneste un shell nou ca sub proces al shellului curent in care se executa comenzile din script.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Din directorul care contine fisierul script1 se ruleaza: . script1 sau source script1.&lt;br /&gt;
Se executa comenzile din script1 in shell-ul curent. Fisierul script1 nu trebuie sa&lt;br /&gt;
aiba dreptul de executie. Una dintre diferentele dintre prima si a doua varianta este ca variabilele exportate sau globale sunt vizibile in shell-ul curent in varianta a doua, dar nu si in prima varianta.&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Varianta cea mai folosita de executie a unui script este prima: ./script&lt;br /&gt;
Un script trebuie sa contina pe prima linie o referire la programul cu care se executa (Bash, Perl, PHP, Python etc). Astfel prima linie a unui script Bash este invariabil: #!/bin/bash. In interiorul scriptului #(diez) reprezinta un comentariu. Exceptie face prima linie.&lt;br /&gt;
&lt;br /&gt;
echo se foloseste pentru afisa un string (sir de caractere) sau o variabila la consola.&lt;br /&gt;
Exemplu: echo &amp;quot;Linux&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Script care afiseaza mesajul: Acesta este primul exemplu !&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 echo &amp;quot;Acesta este primul exemplu !&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Script care creaza un fiser numit continut_etc.txt in directorul curent ce contine fisierele si directoarele din directorul /etc, iar apoi afiseaza spatiul total, ocupat si liber de pe fiecare partitie de pe Hard Disk.&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 ls -l /etc &amp;gt; continut_etc.txt&lt;br /&gt;
 echo &amp;quot;Fisierul continut_etc.txt a fost creat in directorul curent!&amp;quot;&lt;br /&gt;
 echo &amp;quot;Informatii partitii:&amp;quot;&lt;br /&gt;
 df -h Important&lt;br /&gt;
&lt;br /&gt;
O cunoastere acceptabila a modului de creare de scripturi este esentiala pentru orice Administrator de sistem. In cazul persoanelor incepatoare care nu au experienta in programare (orice limbaj) procesul de scripting pare la prima vedere extrem de complicat.&lt;br /&gt;
&lt;br /&gt;
Este nevoie de multe exercitii si exemple pentru o intelegere aprofundata. Intotdeauna se incepe cu exercitii simple si anume scripturi formate din cateva randuri.&lt;br /&gt;
&lt;br /&gt;
==1.2 Variabile, constante si functii==&lt;br /&gt;
&lt;br /&gt;
Prezentare generala:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; O variabila reprezinta un nume pentru o locatie de memorie unde se gaseste o valoare. Se obisnuieste (nu este obligatoriu) ca variabilele sa se scrie cu litera mare.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Comparativ cu alte limbaje de programare (C/C++, JAVA) variabilele in Bash nu au tip. Ele sunt string-uri, dar in functie de context pot fi evaluate ca integer etc.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; O variabila se declara: NUME_VAR=valoare&lt;br /&gt;
&lt;br /&gt;
Important&lt;br /&gt;
Nu se foloseste spatiu intre NUME_VAR si valoare. i = 1 reprezinta eroare. Sintaxa bash - ului este extrem de stricta. Un spatiu in plus sau in minus reprezinta o eroare fatala.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 NUME=&amp;quot;dan&amp;quot;&lt;br /&gt;
 varsta=20&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4&#039;&#039;&#039;. Pentru a ne referi la continutul unei varibile se foloseste semnul $ (dollar) in fata numelui variabilei.&lt;br /&gt;
Exemplu: echo $varsta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5&#039;&#039;&#039;. Variabilele pot fi locale sau globale. Cele locale sunt vizibile doar in shell-ul curent, iar cele globale sunt vizibile in shell-ul curent si in toate subprocesele shell-ului curent. Astfel in interiorul unui script daca se foloseste o variabila globala aceasta va fi accesibila oricarei comenzi/program lansata din acel script. Variabilele globale nu sunt accesibile parintelui unui proces, adica shell-ului de unde s-a executat scriptul. Exceptie face varianta 2 de executie a unui script adica folosind source nume_script&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6&#039;&#039;&#039;. Pentru a declara o variabila globala aceasta trebuie exportata. Se foloseste cuvantul cheie export&lt;br /&gt;
&lt;br /&gt;
 Exemplu: export VARSTA=20&lt;br /&gt;
 variabilele globale se numesc de environment;&lt;br /&gt;
 pentru a vizualiza variabilele locale se foloseste comanda set;&lt;br /&gt;
 pentru a vizualiza variabilele globale se foloseste comanda env;&lt;br /&gt;
 pentru sterge o variabila se foloseste comanda unset NUME_VAR;&lt;br /&gt;
&lt;br /&gt;
Exemplu de varibile globale predefinite:&lt;br /&gt;
 PATH -&amp;gt; contine o lista de directoare in care shell-ul cauta comanda care se executa.&lt;br /&gt;
&lt;br /&gt;
Pentru a concatena un string la variabila PATH se foloseste caracterul : (doua puncte).&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&lt;br /&gt;
Daca dorim sa adaugam directorul /home/dan/scripts in PATH: export&lt;br /&gt;
 PATH=PATH:/home/stud/scripts&lt;br /&gt;
&lt;br /&gt;
Dupa aceasta scripturi si comenzi din /home/stud/scripts pot fi rulate in orice director ne am afla doar prin numele lor. Altfel trebuie folosita calea absoluta sau aflandu-ne in&lt;br /&gt;
director se executa: ./nume_comanda&lt;br /&gt;
 HOSTNAME -&amp;gt; contine hostname-ul calculatorului&lt;br /&gt;
 SHELL -&amp;gt; contine shell-ul default&lt;br /&gt;
 HISTSIZE - contine nr. de comenzi care vor fi memorate in history&lt;br /&gt;
 USER -&amp;gt; contine EUID&lt;br /&gt;
 PWD -&amp;gt; contine directorul curent&lt;br /&gt;
 OLDPWD -&amp;gt; contine directorul precedent si se foloseste de comanda: cd –&lt;br /&gt;
 HOME -&amp;gt; contine home directory al EUID&lt;br /&gt;
 RANDOM -&amp;gt; variabila al carei continut este pseudoaleator&lt;br /&gt;
 TMOUT -&amp;gt; nr in secunde dupa care se face logout automat daca nu se executa nicio comanda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7&#039;&#039;&#039;. Diferenta dintre ghilimele simple(apostrof) si ghilimele duble este aceea ca ghilimele simple nu interpreteaza $ ca si caracter special. In interiorul ghilimelelor simple fiecare caracter special cu exceptia &#039; (ghilimea simpla) este interpretat literal.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 varsta=20 echo &amp;quot;$varsta&amp;quot; ##se afiseaza 20 echo &#039;$varsta&#039; ##se afiseaza $varsta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8&#039;&#039;&#039;. O variabila poate fi declarata read-only sau de tip array. O variabila read-only se mai numeste si constanta.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 &#039;&#039;&#039;1.&#039;&#039;&#039; var1 este readonly. Aceasta nu poate fi modificata sau stearsa folosind unset.&lt;br /&gt;
 declare -r var1=7&lt;br /&gt;
 &#039;&#039;&#039;2.&#039;&#039;&#039; Pentru a declara un array/vector:&lt;br /&gt;
 ARRAY=(unu doi trei) echo ${ARRAY[*]} echo ${ARRAY[1]} i=2 echo&lt;br /&gt;
 ${ARRAY[]} unset ARRAY[1] unset ARRAY&lt;br /&gt;
 ARRAY nu este cuvant cheie. In loc de ARRAY poate fi orice cuvant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;9&#039;&#039;&#039;. Pentru a citi o variabila de la tastatura se foloseste cuvantul cheie read&lt;br /&gt;
Exemplu:&lt;br /&gt;
 #!/bin/bash echo &amp;quot;Introdu nume fisier:&amp;quot; read FILE echo &amp;quot;Fisierul introdus este $FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10&#039;&#039;&#039;. In bash exista caractere speciale care sunt interpretate in mod deosebit.&lt;br /&gt;
 Exemple: $ (dollar), &amp;quot;(ghilimea dubla) sau \ (backslash). Pentru a anula efectul special al&lt;br /&gt;
caracterului, acesta se precede cu \ (backslash).&lt;br /&gt;
&lt;br /&gt;
 Exemplu: echo \$var -&amp;gt; Afiseaza $var. $ nu mai este caracter special.&lt;br /&gt;
&lt;br /&gt;
==1.3 Parametri pozitionali==&lt;br /&gt;
Bash-ul foloseste parametri speciali la care ne putem referi in interiorul unui script&lt;br /&gt;
pentru a avea acces la anumite valori. Acesti parametri speciali se pot folosi ca si&lt;br /&gt;
variabilele, doar ca exista default si nu trebuie creati. Continutul acestora este de asemenea standard.&lt;br /&gt;
&lt;br /&gt;
Acestia sunt:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; $0 - contine numele scriptului&lt;br /&gt;
Scriptul poate actiona diferit in functie de numele cu care a fost rulat ( Exemplu:&lt;br /&gt;
daca se ruleaza folosind un simlink al scriptului. Vezi comanda /bin/egrep care este un simlink catre /bin/grep dar are totusi functionalitate diferita).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; $1 - reprezinta primul argument al scriptului, $2 al doilea argument al scriptului etc. Incepand cu argumentul 10 acesta trebuie incadrat intre acolade ${10}, ${11} etc.&lt;br /&gt;
Se folosesc pentru a evita erori in momentul in care scriptul este rulat fara argumente sau cu un alt nr. de argumente (iar acesta asteapta sa primeasca argumente).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; $? - reprezinta statusul ultimei comenzi executate.&lt;br /&gt;
In Bash Zero este statusul pentru non-error iar diferit de zero este statusul pentru eroare. Orice comanda/program are un status de exit, zero sau non-zero. Se foloseste pentru a continua executia scriptului (sau a modifica comportamentul acestuia) in functie de statusul comenzilor anterioare.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; $# - reprezinta nr. de argumente ale scriptului Se poate lua o decizie in functie de nr. de argumente cu care a fost rulat scriptul.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.&#039;&#039;&#039; $* - reprezinta toate argumentele date scriptului.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.&#039;&#039;&#039; $$ - reprezinta PID shell.&lt;br /&gt;
Astel in functie de cum rulam scriptul $$ are alta valoare:source f1 - $$ reprezinta PID bash (shell curent) ./f1 - $$ reprezinta PID noului sub-shell creat in care se executa comenzile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.&#039;&#039;&#039; $! - reprezinta PID ultimului proces executat in background.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Script care sterge fisierul sau directorul pe care-l primeste ca argument&lt;br /&gt;
 #!/bin/bash rm -rf $1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Afisarea numelui scriptului&lt;br /&gt;
 #!/bin/bash Echo &amp;quot;Numele scriptului executat este: $0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==1.4 Alte facilitati Bash==&lt;br /&gt;
===Alias===&lt;br /&gt;
Un alias reprezinta un mod prin care o comanda sau o serie de comenzi se executa folosind un alt nume.&lt;br /&gt;
Pentru a crea un alias se foloseste comanda: alias comanda_noua=&#039;comanda_substituita&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. alias copy=&#039;cp&#039;&lt;br /&gt;
2. alias search=&#039;grep&#039;&lt;br /&gt;
3. alias ls=&#039;ls -F&#039;&lt;br /&gt;
4. alias rm=&#039;rm -i&#039;&lt;br /&gt;
5. alias ll=&#039;ls -l&#039;&lt;br /&gt;
6. alias stop=&#039;kill -9&#039;&lt;br /&gt;
&lt;br /&gt;
Daca aliasul este compus din mai multe cuvinte acestea trebuie incadrate intre&lt;br /&gt;
ghilimele simple (apostrof).Pentru a vizualiza toate aliasurile din sistem se foloseste comanda alias fara nici un argument.Pentru a executa comanda originala in locul aliasului se foloseste \ (backslash) urmat de comanda.&lt;br /&gt;
&lt;br /&gt;
Example: \ls&lt;br /&gt;
Pentru a sterge un alias se foloseste comanda unalias&lt;br /&gt;
Exemplu: unalias ls&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Un alias exista doar in shell-ul curent (nu exista nici macar in subshell-urile shell-ului curent).&lt;br /&gt;
&lt;br /&gt;
===Customizare Environment===&lt;br /&gt;
Prompting variables (prompt strings)&lt;br /&gt;
&lt;br /&gt;
Bash foloseste 4 variabile speciale numite &amp;quot;prompt strings&amp;quot;: PS1, PS2, PS3 si PS4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; PS1 este numit &amp;quot;primary prompt string&amp;quot; si reprezinta prompterul curent.&lt;br /&gt;
De cele mai multe ori acesta se modifica pentru a arata informatii cat mai utile despre sesiunea curenta.&lt;br /&gt;
&lt;br /&gt;
 PS1 foloseste niste macro-uri care se expandeaza cu un anumit continut astfel:&lt;br /&gt;
 \A - current time in HH:MM hours format&lt;br /&gt;
 \d - current date&lt;br /&gt;
 \@ - the current time in 12 hours format&lt;br /&gt;
 \H - the hostname&lt;br /&gt;
 \h - the hostname up to the first dot (.)&lt;br /&gt;
 \s - the name of the shell&lt;br /&gt;
 \u - username of the EUID&lt;br /&gt;
 \w - the current working directory&lt;br /&gt;
 \W - the current working directory (basename) - relativ&lt;br /&gt;
 \$ - if EUID==0 print # else print $&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Un exemplu excelent de modificare PS1 este: export PS1=&#039;[\u@\h \w]$&#039;&lt;br /&gt;
Avand acest prompter adminul are intotdeauna informatii despre userul cu care s-a conectat, host-ul pe care este conectat precum si calea absoluta a directorului curent. Linia de mai sus se adauga in fisierul de customizare ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; PS2 este numit &amp;quot;secondary prompt string&amp;quot; si are valoarea default &amp;gt; (mai mare).&lt;br /&gt;
Se foloseste atunci cand se scrie o comanda incompleta si se apasa ENTER.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; PS3 se numeste &amp;quot;prompt string for the select command&amp;quot; si se foloseste in scripting impreuna cu comanda select&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; PS4 se numeste &amp;quot;prompt string for the xtrace option&amp;quot; si reprezinta un prompt string folosit in debugging si flow control.&lt;br /&gt;
&lt;br /&gt;
===Environment===&lt;br /&gt;
Fiecare utilizator are propriul mediu de lucru numit si Environment. Customizarea&lt;br /&gt;
Environmentului presupune modificarea unor variabile si parametri astfel incat mediul de lucru sa fie cat mai prietenos si sa ne ofere cat mai multe informatii.&lt;br /&gt;
Din mediul de lucru al unui utilizator fac parte: aliasurile sale, umask, modul de&lt;br /&gt;
afisare al prompterului, variabila PATH in care shellul cauta comenzile, ulimit etc&lt;br /&gt;
&lt;br /&gt;
Exista fisiere de initializare pentru fiecare user care sunt citite de shell la fiecare&lt;br /&gt;
pornire a acestuia:&lt;br /&gt;
&lt;br /&gt;
~/.bashrc - este primul fisier citit de shell la login. In acest fisier trebuie declarate variabile,&lt;br /&gt;
alias-uri etc pentru fiecare user.&lt;br /&gt;
~/.bash_profile - este citit dupa ~/.bashrc&lt;br /&gt;
~/.bash_logout - este citit de shell inainte de logout. In acest fisier se pot reseta variabile, sterge fisiere temporare sau alte functii care vrem sa aiba loc inainte de logout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fisierul /etc/profile este un alt fisier de customizare &amp;quot;system-wide&amp;quot;. Acesta nu&lt;br /&gt;
apartine unui anumit user, iar in el se configureaza mediul pentru toti userii. Il folosim de exemplu daca dorim setarea unui alias pentru toti userii din sistem.&lt;br /&gt;
Aceste fisiere nu sunt recitite automat de shell dupa modificare. Toate configurarile au efect dupa o noua logare in cazul ~/.bashrc sau ~/.bash_profile sau dupa o restartare a sistemului in cazul /etc/profile.Pentru a forta recitirea lor se foloseste comanda source sau . (dot) urmata de nume fisier. source sau . executa comenzile din interiorul fisierului in shellul curent.&lt;br /&gt;
&lt;br /&gt;
Exemplu: source ~/.bashrc sau . ~/.bashrc&lt;br /&gt;
Daca ~/.bash_profile nu exista shell-ul cauta ~/.bash_login. Daca nici aceasta nu exista cauta ~/.profile.&lt;br /&gt;
In aceste fisiere speciale de initializare se seteaza: PS1, TMOUT, PATH, alias, umask etc pentru fiecare utilizator&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Fisierele de initializare pentru fiecare utilizator se gasesc in home directory al acestuia (~) si sunt ascunse fiindca incep cu .(punct). Pentru vizualizarea lor se foloseste comanda ls cu optiunea -a Exemplu: ls -la ~&lt;br /&gt;
&lt;br /&gt;
In functie de distributia de Linux numele si ordinea de citire a fisierelor de customizare a mediului de lucru pentru fiecare user poate sa difere. Totusi, pe marea majoritate a distributiilor de Linux (RedHat, Fedora, CentOS, Suse, Ubuntu, Kubuntu, Debian) exista ~/.bashrc. In acest caz se recomanda folosirea doar a acestuia&lt;br /&gt;
&lt;br /&gt;
Exemplu ~/.bashrc:&lt;br /&gt;
&lt;br /&gt;
 # User specific aliases and functions &lt;br /&gt;
 alias rm=&#039;rm -i&#039; &lt;br /&gt;
 alias cp=&#039;cp -i&#039; &lt;br /&gt;
 alias mv=&#039;mv -i&#039; &lt;br /&gt;
 alias cauta=find &lt;br /&gt;
 alias muta=mv &lt;br /&gt;
 alias S=&#039;ssh -l root -p 7890 ssh.crystalmind.ro&#039; &lt;br /&gt;
 # Source global definitions &lt;br /&gt;
 if [ -f /etc/bashrc ]; then &lt;br /&gt;
   . /etc/bashrc &lt;br /&gt;
 fi &lt;br /&gt;
 export PS1=&#039;[\u@\h \w]$&#039; &lt;br /&gt;
 export PATH=:/home/gabriel/scripts &lt;br /&gt;
 umask=0022&lt;br /&gt;
&lt;br /&gt;
==1.5 Flow Control==&lt;br /&gt;
===Conditii de testare===&lt;br /&gt;
Nota&lt;br /&gt;
Informatiile din acesta pagina au scopul de referinta pentru testele folosite de structurile de control ce urmeaza a fi prezentate. Ele nu trebuie invatate la acest moment in afara conextului de flow control ci doar impreuna cu structurile if..then..else, while, case etc&lt;br /&gt;
&lt;br /&gt;
Structurile de control (if..then..else, while etc) presupun conditii de testare.&lt;br /&gt;
&lt;br /&gt;
Acestea sunt:&lt;br /&gt;
 1. Pentru fisiere&lt;br /&gt;
 -e = fisierul exista&lt;br /&gt;
 -f = fisierul exista si este de tipul regular file&lt;br /&gt;
 Exemplu: -f $FILE&lt;br /&gt;
 -s = fisierul nu are dimensiunea zero&lt;br /&gt;
 -d = fisierul exista si este de tip director&lt;br /&gt;
 -c = fisierul exista si este de tip char device&lt;br /&gt;
 -b = fisierul exista si este de tip block device&lt;br /&gt;
 -r = fisierul exista si are permisiunea read&lt;br /&gt;
 -w = fisierul exista si are permisiunea write&lt;br /&gt;
 -x = fisierul exista si are permisiunea execute&lt;br /&gt;
 -g = fisierul are GUID setat&lt;br /&gt;
 -u = fisierul are SUID setat&lt;br /&gt;
 -k = fisierul are sticky bit setat&lt;br /&gt;
 -nt = fisierul este mai nou decat un alt fisier&lt;br /&gt;
 Exemplu: file1 -nt file = file1 is newer than file2&lt;br /&gt;
 ! -&amp;gt; inverseaza sensul (neaga)&lt;br /&gt;
&lt;br /&gt;
2. Pentru comparatie&lt;br /&gt;
 -eq = equal to&lt;br /&gt;
 -ne = not equal to&lt;br /&gt;
 -gt = greater than&lt;br /&gt;
 Exemplu: $i -gt -$j&lt;br /&gt;
 -ge = greater than or equal&lt;br /&gt;
 -lt = less than&lt;br /&gt;
 -le = less than or egal&lt;br /&gt;
&lt;br /&gt;
3. Pentru stringuri (siruri de caractere)&lt;br /&gt;
 -z = lungimea sirului este zero&lt;br /&gt;
 -n = lungimea sirului este non-zero&lt;br /&gt;
 = egal (comparativ cu alte limbaje de programare operatorul de comparatie este un singur egal) != diferit&lt;br /&gt;
 Exemplu: $str1 != $str2&lt;br /&gt;
 -a = SI LOGIC (AND)&lt;br /&gt;
 -o = SAU LOGIC (OR)&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Testul este adevarat daca ambele conditii sunt adevarate simultan (valoarea variabilei USER este root si valoarea variabilei SHELL este bash)&lt;br /&gt;
 $USER = &amp;quot;root&amp;quot; -a $SHELL = &amp;quot;bash&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In cazul comparatiei a doua stringuri din punct de vedere al sintaxei bash este obligatoriu un spatiu inainte de = (egal) si un spatiu dupa = (egal).&lt;br /&gt;
 Exemplu: $USER=&amp;quot;root&amp;quot; este gresit, $USER = &amp;quot;root&amp;quot; este corect.&lt;br /&gt;
&lt;br /&gt;
2. Testul este adevarat daca una dintre conditii este adevarata(i mai mic ca 10 SAU i mai mare ca 100) $i -lt 10 -o $i gt 100&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Contiditiile de testare prezentate mai sus sunt doar cele mai folosite. Pentru lista completa executati: &lt;br /&gt;
  man test &lt;br /&gt;
  test EXPR &#039;&#039;sau&#039;&#039; [ EXPR ] #au acelasi rezultat.&lt;br /&gt;
&lt;br /&gt;
===If..then..else===&lt;br /&gt;
Cea mai simpla constructie de flow control este cea conditionala reprezentata de if.&lt;br /&gt;
In functie de o valoarea de adevar a unei conditii se stabilesc instructiunile ce trebuie executate. Conditiile de test se refera la proprietati ale fisierelor, comparatii numerice sau sunt referitoare la stringuri.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if este:&lt;br /&gt;
 if [ conditie_de_test ] then lista_de_instructiuni fi&lt;br /&gt;
Daca conditia de test este adevarata se executa lista de instructiuni, altfel aceasta nu se executa.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Daca primul argument al scriptului este fisier se executa: cat fisier&lt;br /&gt;
 if [ -f $1 ] then cat $1 fi&lt;br /&gt;
&lt;br /&gt;
2. Daca valoarea variabilei i este 10 se afiseaza mesajul &amp;quot;Variabila i are valoarea 10&amp;quot; if [ $i -eq 10 ] then echo &amp;quot;Variabila i are valoarea 10&amp;quot; fi&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if..else este:&lt;br /&gt;
 if [ conditie_de_test ] then lista_de_instructiuni else lista_de_instructiuni_default fi&lt;br /&gt;
&lt;br /&gt;
Data conditia de test este adevarata se executa lista_de_instructiuni, altfel se executa lista_de_instructiuni_default&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Daca valoarea variabilei VARSTA citita de la tastatura este mai mica decat 18 se afiseaza mesajul &amp;quot;Esti minor!&amp;quot;, altfel se afiseaza mesajul &amp;quot;Esti major!&amp;quot;&lt;br /&gt;
 #!/bin/bash echo &amp;quot;Introdu varsta:&amp;quot; read VARSTA if [ $VARSTA -lt 18 ] then echo &amp;quot;Esti minor!&amp;quot; else echo &amp;quot;Esti major!&amp;quot; fi&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if..elif..else este:&lt;br /&gt;
 if [ conditie_de_test1 ] then lista_de_instructiuni1 elif [ conditie_de_test2 ] then&lt;br /&gt;
 lista_de_instructiuni2 elif [ conditie_de_test3 ] then lista_de_instructiuni3 else&lt;br /&gt;
 lista_de_instructiuni_default fi&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Daca variabila ORA citita de la tastatura este mai mica decat 12 se afiseaza mesajul &amp;quot;Buna dimineata&amp;quot; daca este intre 12 si 18 se afiseaza mesajul &amp;quot;Buna ziua&amp;quot;, daca este intre 18 si 24 se afiseaza &amp;quot;Noapte Buna!&amp;quot;. Pentru orice alta situatie se afiseaza mesajul &amp;quot;Eroare!&amp;quot;.&lt;br /&gt;
 #!/bin/bash read i if [ $i -lt 12 ] then echo &amp;quot;Buna dimineata!&amp;quot; elif [ $i -ge 12 -a $i -lt 18 ] then echo &amp;quot;Buna ziua!&amp;quot; elif [ $i -ge 18 -a $i -le 24 ] then echo &amp;quot;Noapte buna !&amp;quot; else echo &amp;quot;Eroare!&amp;quot; fi -a reprezinta SI LOGIC (AND). Testul este adevarat daca ambele conditii sunt adevarate simultan.&lt;br /&gt;
&lt;br /&gt;
-o reprezinta SAU LOGIC (OR). Testul este adevarat daca una dintre contitii este adevarata.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Testul este adevarat daca ambele conditii sunt adevarate (primul parametru este fisier si exista SI are permisiunea de read). Ambele conditii sunt adevarate simultan.&lt;br /&gt;
 if [ -e $1 -a -r ]&lt;br /&gt;
2. Testul este adevarat daca primul parametru primit de script este fisier SAU acesta este director. Una dintre conditii este adevarata.&lt;br /&gt;
 if [ -f $1 -o -d $1 ]&lt;br /&gt;
&lt;br /&gt;
===For===&lt;br /&gt;
For se foloseste pentru a executa o sectiune de cod de un numar repetat de ori&lt;br /&gt;
(ciclu). Varianta clasica de for din Bash este diferita de cea din alte limbaje de programare.&lt;br /&gt;
Sintaxa pentru for este:&lt;br /&gt;
for VAR in lista_de_valori do instructiuni done&lt;br /&gt;
Se executa instructiunile specificate de atatea ori cate valori avem in lista. Pentru fiecare iteratie variabila VAR ia o valoare din lista_de_valori. Separatorul pentru valorile din lista este default spatiu sau valoarea variabilei globale IFS.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Script care exemplifica ciclul de tip for prin trimiterea unui pachet ping la fiecare din cele 3 IP-uri.&lt;br /&gt;
&lt;br /&gt;
Instructiunile dintre do si done se executa de atatea ori cate valori avem in lista (3 valori).&lt;br /&gt;
&lt;br /&gt;
Pentru fiecare ciclu valoarea variabilei IP este o valoare din lista. Valorile din lista sunt separate prin spatiu.&lt;br /&gt;
 #!/bin/bash for IP in 192.168.0.1 192.168.0.2 192.168.0.3 do ping -c 1 $IP done&lt;br /&gt;
&lt;br /&gt;
2. Exemplu for modificand valoara variabilei IFS care este separatorul valorilor.&lt;br /&gt;
 #!/bin/bash #Acest script afiseaza fiecare director din $PATH pe cate un rand IFS=: for DIR in $PATH do echo $DIR done&lt;br /&gt;
&lt;br /&gt;
In Bash exista si structura de tip for ca in C/C++. Aceasta este insa mai putin folosita.&lt;br /&gt;
&lt;br /&gt;
 Exemplu&lt;br /&gt;
 for ca in C/C++:&lt;br /&gt;
 LIMIT=10 for((a=0;a&amp;lt;=$LIMIT;a++)) do echo $a done&lt;br /&gt;
&lt;br /&gt;
===While===&lt;br /&gt;
Structura de tip while se foloseste pentru a executa o serie de instructiuni (cele&lt;br /&gt;
dintre do si done) atata timp cat conditia de test este adevarata.&lt;br /&gt;
&lt;br /&gt;
while [ conditie_de_test ] do lista_de_instructiuni done&lt;br /&gt;
&lt;br /&gt;
Exemplu while:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 #script care afiseaza numerele intre 0 zi 100&lt;br /&gt;
 LIMIT=100&lt;br /&gt;
 i=0&lt;br /&gt;
 while [ $i –le $LIMIT ]&lt;br /&gt;
 do&lt;br /&gt;
 echo &amp;quot;i=$i&amp;quot;&lt;br /&gt;
 let i=i+1&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Case===&lt;br /&gt;
Structura de tip case se foloseste pentru a executa o serie de instructiuni in functie de diferite conditii de testare.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru case este:&lt;br /&gt;
&lt;br /&gt;
 case VARIABILA in&lt;br /&gt;
 valoare1)&lt;br /&gt;
 instructiuni1&lt;br /&gt;
 ;;&lt;br /&gt;
 valoare2)&lt;br /&gt;
 instructiuni&lt;br /&gt;
 ;;&lt;br /&gt;
 *)&lt;br /&gt;
 instructiuni_default&lt;br /&gt;
 ;;&lt;br /&gt;
 esac&lt;br /&gt;
 * -&amp;gt; reprezinta instructiunile ce se vor executa default daca variabila nu are niciuna dintre valorile de mai sus.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 #!/bin/bash echo &amp;quot;Introdu nr:&amp;quot; read nr case $nr in 1) echo &amp;quot;nr este 1&amp;quot; ;; 2) echo &amp;quot;nr este2&amp;quot; ;; *) echo &amp;quot;nr are alta valoare&amp;quot; ;; esac&lt;br /&gt;
Structura de tip case poate fi oricand inlocuita cu o structura de tip if..elif..else&lt;br /&gt;
&lt;br /&gt;
Exemplul de mai sus folosind if..elif..else este:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 echo &amp;quot;Introdu nr:&amp;quot;&lt;br /&gt;
 read nr&lt;br /&gt;
 if [ $nr -eq 1 ]&lt;br /&gt;
 then echo &amp;quot;nr este 1&amp;quot;&lt;br /&gt;
 elif [ $nr -eq 2 ]&lt;br /&gt;
 then&lt;br /&gt;
 echo &amp;quot;nr este 2&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
 echo &amp;quot;nr este altceva&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Important&lt;br /&gt;
&lt;br /&gt;
Structura de tip case este foarte importanta si trebuie inteleasa bine. Toate&lt;br /&gt;
scripturile de initializare a serviciilor (cele din /etc/init.d ) folosesc o structura de tip case.&lt;br /&gt;
&lt;br /&gt;
Structura unui script de initializare din /etc/init.d este:&lt;br /&gt;
 case $1 in&lt;br /&gt;
 start) instructiuni de pornire serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 stop) instuctiuni de oprire serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 restart) instructiuni de restartare serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 *) afisare help script &lt;br /&gt;
 esac&lt;br /&gt;
&lt;br /&gt;
$1 reprezinta primul parametru al scriptului si poate fi start, stop sau restart.&lt;br /&gt;
&lt;br /&gt;
Exemplu: Pentru restartarea retelei se foloseste: /etc/init.d/network restart, unde network este scriptul de initializare iar restart primul parametru pe care-l primeste.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Presupunem ca am compilat si instalat serverul Apache in directorul /opt/apache.&lt;br /&gt;
Daemonul http se porneste ruland comanda: /opt/apache/bin/apachectl start, se opreste cu /opt/apache/bin/apachectl stop si se restarteaza cu /opt/apache/bin/apachectl restart. Se doreste pornirea serverului la butarea sistemului, mai exact la intrarea in runlevel 3.&lt;br /&gt;
&lt;br /&gt;
Etape:&lt;br /&gt;
1. Se creaza un script in /etc/init.d. Numele poate fi ales aleator, in exemplul nostru acesta se numeste init_apache&lt;br /&gt;
2. Se creaza un symlink catre /etc/init.d/init_apache in /etc/init.d/rc3.d numit S99Apache. Numele symlinkului este important sa inceapa cu litera S urmata de un umar intre 0 si 99.&lt;br /&gt;
&lt;br /&gt;
La intrarea in runlevel 3 se va rula automat acest script cu parametrul start.&lt;br /&gt;
Structura scriptului /etc/init.d/init_apache este:&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 case $1 in&lt;br /&gt;
 start)&lt;br /&gt;
 echo &amp;quot;Starting Apache...&amp;quot; /opt/apache/bin/apachectl start echo &amp;quot;OK&amp;quot;&lt;br /&gt;
 ;;&lt;br /&gt;
 stop) echo &amp;quot;Shutting down Apache...&amp;quot; /opt/apache/bin/apachectl stop echo &amp;quot;OK&amp;quot;&lt;br /&gt;
 ;;&lt;br /&gt;
 restart) $0 stop $0 start&lt;br /&gt;
 ;;&lt;br /&gt;
 *) echo &amp;quot;init_apache &amp;lt;start|stop|restart&amp;gt;&amp;quot;&lt;br /&gt;
 esac&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Pentru detalii complete despre modul de pornire a serviciilor la butare cititi capitolul &amp;quot;Managementul Serviciilor&amp;quot; din cursul &amp;quot;Linux Basic Administration&amp;quot; disponibil de asemenea online.&lt;br /&gt;
&lt;br /&gt;
===Select===&lt;br /&gt;
Structura de tip select este specifica doar Bash-ului si se foloseste pentru crearea de meniuri.&lt;br /&gt;
&lt;br /&gt;
Sintaxa acesteia este:&lt;br /&gt;
 select MENUITEM in menu_list&lt;br /&gt;
 do&lt;br /&gt;
 lista_de_comenzi&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
Detalii:&lt;br /&gt;
- menu_list este lista de meniuri. Valorile din lista sunt separate prin spatiu;&lt;br /&gt;
- intre do si done sunt instruciunile ce se executa in functie de meniul ales;&lt;br /&gt;
- intre do si done avem acces la urmatoarele 2 variabile: MENUITEM care contine meniul&lt;br /&gt;
&lt;br /&gt;
selectat si REPLY care se creaza automat si contine inputul userului (ce a scris acesta la consola);&lt;br /&gt;
&lt;br /&gt;
- PS3 contine prompterul de selectare a meniurilor;&lt;br /&gt;
- userul alege un meniu din lista folosind un nr. de ordine: alege 1 pentru primul meniu, 2 pentru al doilea etc;&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 PS3=&amp;quot;Alege:&amp;quot;&lt;br /&gt;
 select ITEM in &amp;quot;Afiseaza continut /etc&amp;quot; &amp;quot;Afiseaza spatiu liber&amp;quot; &amp;quot;Exit&amp;quot;&lt;br /&gt;
 do&lt;br /&gt;
 case $REPLY in&lt;br /&gt;
 1) ls -l /etc&lt;br /&gt;
 ;;&lt;br /&gt;
 2) df -h&lt;br /&gt;
 ;;&lt;br /&gt;
 3) exit 0&lt;br /&gt;
 ;;&lt;br /&gt;
 *) echo &amp;quot;Optiune incorecta&amp;quot;&lt;br /&gt;
 esac&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
==1.6 Substituirea comenzilor==&lt;br /&gt;
Unei variabile i se poate asigna o valoare in 2 moduri:&lt;br /&gt;
1. Folosind NUME_VAR=valoare&lt;br /&gt;
&lt;br /&gt;
Exemplu: EDITOR=&amp;quot;VIM&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Substituind o comanda cu outputul ei&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 VAR=`ls /etc` -&amp;gt; in acest exemplu comanda ls /etc se substituie sau inlocuieste cu outputul ei care se asigneaza variabilei VAR. Variabila VAR va contine outputul comenzii ls -l.&lt;br /&gt;
Nota&lt;br /&gt;
Substituirea unei comenzi cu outputul ei reprezinta unul dintre caracteristicile cele mai puternice ale Bashului, iar majoritatea scripturilor folosesc acest mod de lucru.&lt;br /&gt;
&lt;br /&gt;
Pentru a substitui o comanda cu outputul ei exista 2 variante:&lt;br /&gt;
&lt;br /&gt;
1. Comanda sa incadreza in backquotes ( ``). Atentie, backquotes nu sunt apostroafe sau&lt;br /&gt;
ghilimele simple.&lt;br /&gt;
 Exemplu: ME= `whoiam ` -&amp;gt; variabila ME va contine outputul comenzii whoami&lt;br /&gt;
&lt;br /&gt;
2. Comanda se incadreza intre $( si )&lt;br /&gt;
 Exemplu: ETH0= $(ifconfig eth0) -&amp;gt; variabila numita ETH0 va contine outputul comenzii&lt;br /&gt;
 ifconfig eth0&lt;br /&gt;
 Exemplu script ce nu poate fi rulat de catre root&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 if [ &amp;quot;$(whoami)&amp;quot; = &amp;quot;root&amp;quot; ]&lt;br /&gt;
 then&lt;br /&gt;
 echo &amp;quot;Esti root, sorry !&amp;quot;&lt;br /&gt;
 exit 1;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
#incep instructiunile ce nu pot fi rulate de catre root&amp;quot;&lt;br /&gt;
 ls -la ~&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
&lt;br /&gt;
In momentul in care o variabila de tip string este testat folosind un test pentru stringuri este bine ca aceasta sa fie incadrata intre ghilimele duble pentru a forta tipul ei catre string.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
VAR=&amp;quot;`ifconfig eth0`&amp;quot; if [ -z &amp;quot;$VAR&amp;quot; ] then echo &amp;quot;Interfata eth0 nu exista!&amp;quot; fi&lt;br /&gt;
&lt;br /&gt;
Subshells&lt;br /&gt;
&lt;br /&gt;
Utilizarea subshell-urilor în Bash poate fi avantajoasă din mai multe motive, inclusiv:&lt;br /&gt;
&lt;br /&gt;
 1. Izolarea comenzilor: comenzile executate într -un subshell sunt izolate de cochilie părinte. Aceasta înseamnă că orice modificări aduse la variabile, directoare sau alte setări de mediu din subshell nu vor afecta shell-ul părinte.&lt;br /&gt;
&lt;br /&gt;
 2. Scoping: Variabilele definite într -un subshell au un domeniu local și nu vor afecta variabile cu același nume în shell-ul părinte.&lt;br /&gt;
&lt;br /&gt;
 3. Manevrarea erorilor: subshell -urile pot fi utilizate pentru o mai bună gestionare a erorilor. De exemplu, puteți executa o serie de comenzi într-un subshell și puteți verifica starea de returnare a acesteia fără a afecta fluxul principal al scriptului dvs.&lt;br /&gt;
&lt;br /&gt;
Iată câteva exemple de utilizare a subshell-urilor în Bash:&lt;br /&gt;
&lt;br /&gt;
Schimbarea directorului temporar:&lt;br /&gt;
&lt;br /&gt;
Aceasta schimbă temporar directorul în/calea/în/director, execută comanda LS, apoi se întoarce în directorul original. Schimbarea directorului afectează doar subshell-ul.&lt;br /&gt;
&lt;br /&gt;
-Execuție paralelă:&lt;br /&gt;
&lt;br /&gt;
Aceasta execută mai multe comenzi concomitent în subshell-uri, permițându-le să funcționeze în paralel.&lt;br /&gt;
&lt;br /&gt;
-Manevrarea erorilor:&lt;br /&gt;
&lt;br /&gt;
Aceasta execută comanda1 și comanda2 într -un subshell. Dacă Command1 sau Command2 eșuează (returnează un statut de ieșire non-zero), atunci este ecou „eroare”.&lt;br /&gt;
&lt;br /&gt;
-Setări temporare ale mediului:&lt;br /&gt;
&lt;br /&gt;
Aceasta stabilește o variabilă de mediu temporară la valoare pentru durata comenzii. Odată ce comanda se termină, variabila revine la valoarea sa anterioară (sau este nesetată dacă nu exista înainte).&lt;br /&gt;
&lt;br /&gt;
Subshell-urile sunt versatile și pot fi utilizate creativ pentru a atinge diverse obiective de script, menținând controlul asupra mediului și fluxului de execuție al comenzilor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;In inchiderea cursului Linux Essentials:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La ce pot fi folosite parantezele ( ) in bash?&lt;br /&gt;
&lt;br /&gt;
Utilizari comune&lt;br /&gt;
    1. Substitutia comenzii:&lt;br /&gt;
        ◦ $(command) or `command`: Executa comanda si ii substituie iesirea.&lt;br /&gt;
        ◦ Example: echo $(date) or echo \date``&lt;br /&gt;
    2. Expansie aritmetica:&lt;br /&gt;
        ◦ (( expression )): Performa operatuni aritmetice si le evalueaza expresia.&lt;br /&gt;
        ◦ Example: (( x = 5 + 3 ))&lt;br /&gt;
    3. Crearea unui subshell:&lt;br /&gt;
        ◦ ( commands ): Execute comenzi intr-un subshell, izolandu-i mediul de cea principala.&lt;br /&gt;
        ◦ Example: (cd /path/to/directory &amp;amp;&amp;amp; ls)&lt;br /&gt;
    4. Declararea unei functii:&lt;br /&gt;
        ◦ function_name () { commands; }: Declara o functie.&lt;br /&gt;
    5. Gruparea comenzilor:&lt;br /&gt;
        ◦ { commands; }: Grupeaza mai multe comenzi impreuna, permitandu-le sa ruleze ca si o singura comanda.&lt;br /&gt;
        ◦ Example: { echo &amp;quot;Hello&amp;quot;; echo &amp;quot;World&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Essentials_Pagina_7|Pagina anterioară]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Essentials_Pagina_8&amp;diff=543</id>
		<title>Essentials Pagina 8</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Essentials_Pagina_8&amp;diff=543"/>
		<updated>2025-04-11T08:02:34Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Environment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Laborator 8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Shell Scripts=&lt;br /&gt;
&lt;br /&gt;
==1.1 Introducere in Bash==&lt;br /&gt;
Shellul este interpretorul de comenzi. Acesta parseaza comenzile introduse de&lt;br /&gt;
utilizator, le verifica din punct de vedere al sintaxei si le trimite kernel-ului spre executie.&lt;br /&gt;
&lt;br /&gt;
Exista mai multe shelluri (Bourne, C Shell, recent aparute Zsh si Fish, etc), dar default pe Linux este shellul numit Bash (Bourne Again Shell). Acesta este reprezentat de fisierul &#039;&#039;/bin/bash&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Pe langa interpretarea si executia comenzilor, Bash-ul ofera si alte facilitati printre&lt;br /&gt;
care: editarea liniei de comanda, history, alias-uri, dar si un limbaj de programare structurat propriu.&lt;br /&gt;
&lt;br /&gt;
Un script de shell este un fisier text (ASCII) care contine comenzi de shell organizate intr-un mod logic. Pe langa comenzi, script-ul mai contine si variabile (locale sau globale), parametri pozitionali precum si structuri de programare specifice (if..then..else, while, do, until, for, case, selsect etc). Un script este folosit pentru a imbina comenzi si diverse structuri de control pentru a oferi o noua functionalitate sau a automatiza task-uri.&lt;br /&gt;
&lt;br /&gt;
Etapele crearii unui script sunt:&lt;br /&gt;
&lt;br /&gt;
a) crearea unui fisier text folosind editorul preferat (Exemplu: vim)&lt;br /&gt;
b) editarea fisierului pentru a contine functionalitatea dorita&lt;br /&gt;
c) testarea scriptului adica executia/rularea acestuia&lt;br /&gt;
&lt;br /&gt;
Modul de executie a unui script numit script1:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Din directorul care contine scriptul se ruleaza : ./script1&lt;br /&gt;
Fisierul script1 trebuie sa aiba dreptul de executie. Fiindca directorul curent (.) nu&lt;br /&gt;
se afla in $PATH (altfel grave probleme de securitate), scriptul trebuie sa fie executat cu calea absoluta sau cu ./nume_script In acest caz se porneste un shell nou ca sub proces al shellului curent in care se executa comenzile din script.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Din directorul care contine fisierul script1 se ruleaza: . script1 sau source script1.&lt;br /&gt;
Se executa comenzile din script1 in shell-ul curent. Fisierul script1 nu trebuie sa&lt;br /&gt;
aiba dreptul de executie. Una dintre diferentele dintre prima si a doua varianta este ca variabilele exportate sau globale sunt vizibile in shell-ul curent in varianta a doua, dar nu si in prima varianta.&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Varianta cea mai folosita de executie a unui script este prima: ./script&lt;br /&gt;
Un script trebuie sa contina pe prima linie o referire la programul cu care se executa (Bash, Perl, PHP, Python etc). Astfel prima linie a unui script Bash este invariabil: #!/bin/bash. In interiorul scriptului #(diez) reprezinta un comentariu. Exceptie face prima linie.&lt;br /&gt;
&lt;br /&gt;
echo se foloseste pentru afisa un string (sir de caractere) sau o variabila la consola.&lt;br /&gt;
Exemplu: echo &amp;quot;Linux&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Script care afiseaza mesajul: Acesta este primul exemplu !&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 echo &amp;quot;Acesta este primul exemplu !&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Script care creaza un fiser numit continut_etc.txt in directorul curent ce contine fisierele si directoarele din directorul /etc, iar apoi afiseaza spatiul total, ocupat si liber de pe fiecare partitie de pe Hard Disk.&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 ls -l /etc &amp;gt; continut_etc.txt&lt;br /&gt;
 echo &amp;quot;Fisierul continut_etc.txt a fost creat in directorul curent!&amp;quot;&lt;br /&gt;
 echo &amp;quot;Informatii partitii:&amp;quot;&lt;br /&gt;
 df -h Important&lt;br /&gt;
&lt;br /&gt;
O cunoastere acceptabila a modului de creare de scripturi este esentiala pentru orice Administrator de sistem. In cazul persoanelor incepatoare care nu au experienta in programare (orice limbaj) procesul de scripting pare la prima vedere extrem de complicat.&lt;br /&gt;
&lt;br /&gt;
Este nevoie de multe exercitii si exemple pentru o intelegere aprofundata. Intotdeauna se incepe cu exercitii simple si anume scripturi formate din cateva randuri.&lt;br /&gt;
&lt;br /&gt;
==1.2 Variabile, constante si functii==&lt;br /&gt;
&lt;br /&gt;
Prezentare generala:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; O variabila reprezinta un nume pentru o locatie de memorie unde se gaseste o valoare. Se obisnuieste (nu este obligatoriu) ca variabilele sa se scrie cu litera mare.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Comparativ cu alte limbaje de programare (C/C++, JAVA) variabilele in Bash nu au tip. Ele sunt string-uri, dar in functie de context pot fi evaluate ca integer etc.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; O variabila se declara: NUME_VAR=valoare&lt;br /&gt;
&lt;br /&gt;
Important&lt;br /&gt;
Nu se foloseste spatiu intre NUME_VAR si valoare. i = 1 reprezinta eroare. Sintaxa bash - ului este extrem de stricta. Un spatiu in plus sau in minus reprezinta o eroare fatala.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 NUME=&amp;quot;dan&amp;quot;&lt;br /&gt;
 varsta=20&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4&#039;&#039;&#039;. Pentru a ne referi la continutul unei varibile se foloseste semnul $ (dollar) in fata numelui variabilei.&lt;br /&gt;
Exemplu: echo $varsta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5&#039;&#039;&#039;. Variabilele pot fi locale sau globale. Cele locale sunt vizibile doar in shell-ul curent, iar cele globale sunt vizibile in shell-ul curent si in toate subprocesele shell-ului curent. Astfel in interiorul unui script daca se foloseste o variabila globala aceasta va fi accesibila oricarei comenzi/program lansata din acel script. Variabilele globale nu sunt accesibile parintelui unui proces, adica shell-ului de unde s-a executat scriptul. Exceptie face varianta 2 de executie a unui script adica folosind source nume_script&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6&#039;&#039;&#039;. Pentru a declara o variabila globala aceasta trebuie exportata. Se foloseste cuvantul cheie export&lt;br /&gt;
&lt;br /&gt;
 Exemplu: export VARSTA=20&lt;br /&gt;
 variabilele globale se numesc de environment;&lt;br /&gt;
 pentru a vizualiza variabilele locale se foloseste comanda set;&lt;br /&gt;
 pentru a vizualiza variabilele globale se foloseste comanda env;&lt;br /&gt;
 pentru sterge o variabila se foloseste comanda unset NUME_VAR;&lt;br /&gt;
&lt;br /&gt;
Exemplu de varibile globale predefinite:&lt;br /&gt;
 PATH -&amp;gt; contine o lista de directoare in care shell-ul cauta comanda care se executa.&lt;br /&gt;
&lt;br /&gt;
Pentru a concatena un string la variabila PATH se foloseste caracterul : (doua puncte).&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&lt;br /&gt;
Daca dorim sa adaugam directorul /home/dan/scripts in PATH: export&lt;br /&gt;
 PATH=PATH:/home/stud/scripts&lt;br /&gt;
&lt;br /&gt;
Dupa aceasta scripturi si comenzi din /home/stud/scripts pot fi rulate in orice director ne am afla doar prin numele lor. Altfel trebuie folosita calea absoluta sau aflandu-ne in&lt;br /&gt;
director se executa: ./nume_comanda&lt;br /&gt;
 HOSTNAME -&amp;gt; contine hostname-ul calculatorului&lt;br /&gt;
 SHELL -&amp;gt; contine shell-ul default&lt;br /&gt;
 HISTSIZE - contine nr. de comenzi care vor fi memorate in history&lt;br /&gt;
 USER -&amp;gt; contine EUID&lt;br /&gt;
 PWD -&amp;gt; contine directorul curent&lt;br /&gt;
 OLDPWD -&amp;gt; contine directorul precedent si se foloseste de comanda: cd –&lt;br /&gt;
 HOME -&amp;gt; contine home directory al EUID&lt;br /&gt;
 RANDOM -&amp;gt; variabila al carei continut este pseudoaleator&lt;br /&gt;
 TMOUT -&amp;gt; nr in secunde dupa care se face logout automat daca nu se executa nicio comanda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7&#039;&#039;&#039;. Diferenta dintre ghilimele simple(apostrof) si ghilimele duble este aceea ca ghilimele simple nu interpreteaza $ ca si caracter special. In interiorul ghilimelelor simple fiecare caracter special cu exceptia &#039; (ghilimea simpla) este interpretat literal.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 varsta=20 echo &amp;quot;$varsta&amp;quot; ##se afiseaza 20 echo &#039;$varsta&#039; ##se afiseaza $varsta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8&#039;&#039;&#039;. O variabila poate fi declarata read-only sau de tip array. O variabila read-only se mai numeste si constanta.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 &#039;&#039;&#039;1.&#039;&#039;&#039; var1 este readonly. Aceasta nu poate fi modificata sau stearsa folosind unset.&lt;br /&gt;
 declare -r var1=7&lt;br /&gt;
 &#039;&#039;&#039;2.&#039;&#039;&#039; Pentru a declara un array/vector:&lt;br /&gt;
 ARRAY=(unu doi trei) echo ${ARRAY[*]} echo ${ARRAY[1]} i=2 echo&lt;br /&gt;
 ${ARRAY[]} unset ARRAY[1] unset ARRAY&lt;br /&gt;
 ARRAY nu este cuvant cheie. In loc de ARRAY poate fi orice cuvant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;9&#039;&#039;&#039;. Pentru a citi o variabila de la tastatura se foloseste cuvantul cheie read&lt;br /&gt;
Exemplu:&lt;br /&gt;
 #!/bin/bash echo &amp;quot;Introdu nume fisier:&amp;quot; read FILE echo &amp;quot;Fisierul introdus este $FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10&#039;&#039;&#039;. In bash exista caractere speciale care sunt interpretate in mod deosebit.&lt;br /&gt;
 Exemple: $ (dollar), &amp;quot;(ghilimea dubla) sau \ (backslash). Pentru a anula efectul special al&lt;br /&gt;
caracterului, acesta se precede cu \ (backslash).&lt;br /&gt;
&lt;br /&gt;
 Exemplu: echo \$var -&amp;gt; Afiseaza $var. $ nu mai este caracter special.&lt;br /&gt;
&lt;br /&gt;
==1.3 Parametri pozitionali==&lt;br /&gt;
Bash-ul foloseste parametri speciali la care ne putem referi in interiorul unui script&lt;br /&gt;
pentru a avea acces la anumite valori. Acesti parametri speciali se pot folosi ca si&lt;br /&gt;
variabilele, doar ca exista default si nu trebuie creati. Continutul acestora este de asemenea standard.&lt;br /&gt;
&lt;br /&gt;
Acestia sunt:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; $0 - contine numele scriptului&lt;br /&gt;
Scriptul poate actiona diferit in functie de numele cu care a fost rulat ( Exemplu:&lt;br /&gt;
daca se ruleaza folosind un simlink al scriptului. Vezi comanda /bin/egrep care este un simlink catre /bin/grep dar are totusi functionalitate diferita).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; $1 - reprezinta primul argument al scriptului, $2 al doilea argument al scriptului etc. Incepand cu argumentul 10 acesta trebuie incadrat intre acolade ${10}, ${11} etc.&lt;br /&gt;
Se folosesc pentru a evita erori in momentul in care scriptul este rulat fara argumente sau cu un alt nr. de argumente (iar acesta asteapta sa primeasca argumente).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; $? - reprezinta statusul ultimei comenzi executate.&lt;br /&gt;
In Bash Zero este statusul pentru non-error iar diferit de zero este statusul pentru eroare. Orice comanda/program are un status de exit, zero sau non-zero. Se foloseste pentru a continua executia scriptului (sau a modifica comportamentul acestuia) in functie de statusul comenzilor anterioare.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; $# - reprezinta nr. de argumente ale scriptului Se poate lua o decizie in functie de nr. de argumente cu care a fost rulat scriptul.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.&#039;&#039;&#039; $* - reprezinta toate argumentele date scriptului.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.&#039;&#039;&#039; $$ - reprezinta PID shell.&lt;br /&gt;
Astel in functie de cum rulam scriptul $$ are alta valoare:source f1 - $$ reprezinta PID bash (shell curent) ./f1 - $$ reprezinta PID noului sub-shell creat in care se executa comenzile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.&#039;&#039;&#039; $! - reprezinta PID ultimului proces executat in background.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Script care sterge fisierul sau directorul pe care-l primeste ca argument&lt;br /&gt;
 #!/bin/bash rm -rf $1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Afisarea numelui scriptului&lt;br /&gt;
 #!/bin/bash Echo &amp;quot;Numele scriptului executat este: $0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==1.4 Alte facilitati Bash==&lt;br /&gt;
===Alias===&lt;br /&gt;
Un alias reprezinta un mod prin care o comanda sau o serie de comenzi se executa folosind un alt nume.&lt;br /&gt;
Pentru a crea un alias se foloseste comanda: alias comanda_noua=&#039;comanda_substituita&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. alias copy=&#039;cp&#039;&lt;br /&gt;
2. alias search=&#039;grep&#039;&lt;br /&gt;
3. alias ls=&#039;ls -F&#039;&lt;br /&gt;
4. alias rm=&#039;rm -i&#039;&lt;br /&gt;
5. alias ll=&#039;ls -l&#039;&lt;br /&gt;
6. alias stop=&#039;kill -9&#039;&lt;br /&gt;
&lt;br /&gt;
Daca aliasul este compus din mai multe cuvinte acestea trebuie incadrate intre&lt;br /&gt;
ghilimele simple (apostrof).Pentru a vizualiza toate aliasurile din sistem se foloseste comanda alias fara nici un argument.Pentru a executa comanda originala in locul aliasului se foloseste \ (backslash) urmat de comanda.&lt;br /&gt;
&lt;br /&gt;
Example: \ls&lt;br /&gt;
Pentru a sterge un alias se foloseste comanda unalias&lt;br /&gt;
Exemplu: unalias ls&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Un alias exista doar in shell-ul curent (nu exista nici macar in subshell-urile shell-ului curent).&lt;br /&gt;
&lt;br /&gt;
===Customizare Environment===&lt;br /&gt;
Prompting variables (prompt strings)&lt;br /&gt;
&lt;br /&gt;
Bash foloseste 4 variabile speciale numite &amp;quot;prompt strings&amp;quot;: PS1, PS2, PS3 si PS4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; PS1 este numit &amp;quot;primary prompt string&amp;quot; si reprezinta prompterul curent.&lt;br /&gt;
De cele mai multe ori acesta se modifica pentru a arata informatii cat mai utile despre sesiunea curenta.&lt;br /&gt;
&lt;br /&gt;
 PS1 foloseste niste macro-uri care se expandeaza cu un anumit continut astfel:&lt;br /&gt;
 \A - current time in HH:MM hours format&lt;br /&gt;
 \d - current date&lt;br /&gt;
 \@ - the current time in 12 hours format&lt;br /&gt;
 \H - the hostname&lt;br /&gt;
 \h - the hostname up to the first dot (.)&lt;br /&gt;
 \s - the name of the shell&lt;br /&gt;
 \u - username of the EUID&lt;br /&gt;
 \w - the current working directory&lt;br /&gt;
 \W - the current working directory (basename) - relativ&lt;br /&gt;
 \$ - if EUID==0 print # else print $&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Un exemplu excelent de modificare PS1 este: export PS1=&#039;[\u@\h \w]$&#039;&lt;br /&gt;
Avand acest prompter adminul are intotdeauna informatii despre userul cu care s-a conectat, host-ul pe care este conectat precum si calea absoluta a directorului curent. Linia de mai sus se adauga in fisierul de customizare ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; PS2 este numit &amp;quot;secondary prompt string&amp;quot; si are valoarea default &amp;gt; (mai mare).&lt;br /&gt;
Se foloseste atunci cand se scrie o comanda incompleta si se apasa ENTER.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; PS3 se numeste &amp;quot;prompt string for the select command&amp;quot; si se foloseste in scripting impreuna cu comanda select&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; PS4 se numeste &amp;quot;prompt string for the xtrace option&amp;quot; si reprezinta un prompt string folosit in debugging si flow control.&lt;br /&gt;
&lt;br /&gt;
===Environment===&lt;br /&gt;
Fiecare utilizator are propriul mediu de lucru numit si Environment. Customizarea&lt;br /&gt;
Environmentului presupune modificarea unor variabile si parametri astfel incat mediul de lucru sa fie cat mai prietenos si sa ne ofere cat mai multe informatii.&lt;br /&gt;
Din mediul de lucru al unui utilizator fac parte: aliasurile sale, umask, modul de&lt;br /&gt;
afisare al prompterului, variabila PATH in care shellul cauta comenzile, ulimit etc&lt;br /&gt;
&lt;br /&gt;
Exista fisiere de initializare pentru fiecare user care sunt citite de shell la fiecare&lt;br /&gt;
pornire a acestuia:&lt;br /&gt;
&lt;br /&gt;
~/.bashrc - este primul fisier citit de shell la login. In acest fisier trebuie declarate variabile,&lt;br /&gt;
alias-uri etc pentru fiecare user.&lt;br /&gt;
~/.bash_profile - este citit dupa ~/.bashrc&lt;br /&gt;
~/.bash_logout - este citit de shell inainte de logout. In acest fisier se pot reseta variabile, sterge fisiere temporare sau alte functii care vrem sa aiba loc inainte de logout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fisierul /etc/profile este un alt fisier de customizare &amp;quot;system-wide&amp;quot;. Acesta nu&lt;br /&gt;
apartine unui anumit user, iar in el se configureaza mediul pentru toti userii. Il folosim de exemplu daca dorim setarea unui alias pentru toti userii din sistem.&lt;br /&gt;
Aceste fisiere nu sunt recitite automat de shell dupa modificare. Toate configurarile au efect dupa o noua logare in cazul ~/.bashrc sau ~/.bash_profile sau dupa o restartare a sistemului in cazul /etc/profile.Pentru a forta recitirea lor se foloseste comanda source sau . (dot) urmata de nume fisier. source sau . executa comenzile din interiorul fisierului in shellul curent.&lt;br /&gt;
&lt;br /&gt;
Exemplu: source ~/.bashrc sau . ~/.bashrc&lt;br /&gt;
Daca ~/.bash_profile nu exista shell-ul cauta ~/.bash_login. Daca nici aceasta nu exista cauta ~/.profile.&lt;br /&gt;
In aceste fisiere speciale de initializare se seteaza: PS1, TMOUT, PATH, alias, umask etc pentru fiecare utilizator&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Fisierele de initializare pentru fiecare utilizator se gasesc in home directory al acestuia (~) si sunt ascunse fiindca incep cu .(punct). Pentru vizualizarea lor se foloseste comanda ls cu optiunea -a Exemplu: ls -la ~&lt;br /&gt;
&lt;br /&gt;
In functie de distributia de Linux numele si ordinea de citire a fisierelor de customizare a mediului de lucru pentru fiecare user poate sa difere. Totusi, pe marea majoritate a distributiilor de Linux (RedHat, Fedora, CentOS, Suse, Ubuntu, Kubuntu, Debian) exista ~/.bashrc. In acest caz se recomanda folosirea doar a acestuia&lt;br /&gt;
&lt;br /&gt;
Exemplu ~/.bashrc:&lt;br /&gt;
&lt;br /&gt;
 # User specific aliases and functions &lt;br /&gt;
 alias rm=&#039;rm -i&#039; &lt;br /&gt;
 alias cp=&#039;cp -i&#039; &lt;br /&gt;
 alias mv=&#039;mv -i&#039; &lt;br /&gt;
 alias cauta=find &lt;br /&gt;
 alias muta=mv &lt;br /&gt;
 alias S=&#039;ssh -l root -p 7890 ssh.crystalmind.ro&#039; &lt;br /&gt;
 # Source global definitions &lt;br /&gt;
 if [ -f /etc/bashrc ]; then &lt;br /&gt;
   . /etc/bashrc &lt;br /&gt;
 fi &lt;br /&gt;
 export PS1=&#039;[\u@\h \w]$&#039; &lt;br /&gt;
 export PATH=:/home/gabriel/scripts &lt;br /&gt;
 umask=0022&lt;br /&gt;
&lt;br /&gt;
==1.5 Flow Control==&lt;br /&gt;
===Conditii de testare===&lt;br /&gt;
Nota&lt;br /&gt;
Informatiile din acesta pagina au scopul de referinta pentru testele folosite de structurile de control ce urmeaza a fi prezentate. Ele nu trebuie invatate la acest moment in afara conextului de flow control ci doar impreuna cu structurile if..then..else, while, case etc&lt;br /&gt;
&lt;br /&gt;
Structurile de control (if..then..else, while etc) presupun conditii de testare.&lt;br /&gt;
&lt;br /&gt;
Acestea sunt:&lt;br /&gt;
 1. Pentru fisiere&lt;br /&gt;
 -e = fisierul exista&lt;br /&gt;
 -f = fisierul exista si este de tipul regular file&lt;br /&gt;
 Exemplu: -f $FILE&lt;br /&gt;
 -s = fisierul nu are dimensiunea zero&lt;br /&gt;
 -d = fisierul exista si este de tip director&lt;br /&gt;
 -c = fisierul exista si este de tip char device&lt;br /&gt;
 -b = fisierul exista si este de tip block device&lt;br /&gt;
 -r = fisierul exista si are permisiunea read&lt;br /&gt;
 -w = fisierul exista si are permisiunea write&lt;br /&gt;
 -x = fisierul exista si are permisiunea execute&lt;br /&gt;
 -g = fisierul are GUID setat&lt;br /&gt;
 -u = fisierul are SUID setat&lt;br /&gt;
 -k = fisierul are sticky bit setat&lt;br /&gt;
 -nt = fisierul este mai nou decat un alt fisier&lt;br /&gt;
 Exemplu: file1 -nt file = file1 is newer than file2&lt;br /&gt;
 ! -&amp;gt; inverseaza sensul (neaga)&lt;br /&gt;
&lt;br /&gt;
2. Pentru comparatie&lt;br /&gt;
 -eq = equal to&lt;br /&gt;
 -ne = not equal to&lt;br /&gt;
 -gt = greater than&lt;br /&gt;
 Exemplu: $i -gt -$j&lt;br /&gt;
 -ge = greater than or equal&lt;br /&gt;
 -lt = less than&lt;br /&gt;
 -le = less than or egal&lt;br /&gt;
&lt;br /&gt;
3. Pentru stringuri (siruri de caractere)&lt;br /&gt;
 -z = lungimea sirului este zero&lt;br /&gt;
 -n = lungimea sirului este non-zero&lt;br /&gt;
 = egal (comparativ cu alte limbaje de programare operatorul de comparatie este un singur egal) != diferit&lt;br /&gt;
 Exemplu: $str1 != $str2&lt;br /&gt;
 -a = SI LOGIC (AND)&lt;br /&gt;
 -o = SAU LOGIC (OR)&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Testul este adevarat daca ambele conditii sunt adevarate simultan (valoarea variabilei USER este root si valoarea variabilei SHELL este bash)&lt;br /&gt;
 $USER = &amp;quot;root&amp;quot; -a $SHELL = &amp;quot;bash&amp;quot;&lt;br /&gt;
In cazul comparatiei a doua stringuri din punct de vedere al sintaxei bash este obligatoriu un spatiu inainte de = (egal) si un spatiu dupa = (egal).&lt;br /&gt;
 Exemplu: $USER=&amp;quot;root&amp;quot; este gresit, $USER = &amp;quot;root&amp;quot; este corect.&lt;br /&gt;
&lt;br /&gt;
2. Testul este adevarat daca una dintre conditii este adevarata(i mai mic ca 10 SAU i mai mare ca 100) $i -lt 10 -o $i gt 100&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Contiditiile de testare prezentate mai sus sunt doar cele mai folosite. Pentru lista completa executati: man test test EXPR sau [ EXPR ] au acelasi rezultat.&lt;br /&gt;
&lt;br /&gt;
===If..then..else===&lt;br /&gt;
Cea mai simpla constructie de flow control este cea conditionala reprezentata de if.&lt;br /&gt;
In functie de o valoarea de adevar a unei conditii se stabilesc instructiunile ce trebuie executate. Conditiile de test se refera la proprietati ale fisierelor, comparatii numerice sau sunt referitoare la stringuri.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if este:&lt;br /&gt;
 if [ conditie_de_test ] then lista_de_instructiuni fi&lt;br /&gt;
Daca conditia de test este adevarata se executa lista de instructiuni, altfel aceasta nu se executa.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Daca primul argument al scriptului este fisier se executa: cat fisier&lt;br /&gt;
 if [ -f $1 ] then cat $1 fi&lt;br /&gt;
&lt;br /&gt;
2. Daca valoarea variabilei i este 10 se afiseaza mesajul &amp;quot;Variabila i are valoarea 10&amp;quot; if [ $i -eq 10 ] then echo &amp;quot;Variabila i are valoarea 10&amp;quot; fi&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if..else este:&lt;br /&gt;
 if [ conditie_de_test ] then lista_de_instructiuni else lista_de_instructiuni_default fi&lt;br /&gt;
&lt;br /&gt;
Data conditia de test este adevarata se executa lista_de_instructiuni, altfel se executa lista_de_instructiuni_default&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Daca valoarea variabilei VARSTA citita de la tastatura este mai mica decat 18 se afiseaza mesajul &amp;quot;Esti minor!&amp;quot;, altfel se afiseaza mesajul &amp;quot;Esti major!&amp;quot;&lt;br /&gt;
 #!/bin/bash echo &amp;quot;Introdu varsta:&amp;quot; read VARSTA if [ $VARSTA -lt 18 ] then echo &amp;quot;Esti minor!&amp;quot; else echo &amp;quot;Esti major!&amp;quot; fi&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if..elif..else este:&lt;br /&gt;
 if [ conditie_de_test1 ] then lista_de_instructiuni1 elif [ conditie_de_test2 ] then&lt;br /&gt;
 lista_de_instructiuni2 elif [ conditie_de_test3 ] then lista_de_instructiuni3 else&lt;br /&gt;
 lista_de_instructiuni_default fi&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Daca variabila ORA citita de la tastatura este mai mica decat 12 se afiseaza mesajul &amp;quot;Buna dimineata&amp;quot; daca este intre 12 si 18 se afiseaza mesajul &amp;quot;Buna ziua&amp;quot;, daca este intre 18 si 24 se afiseaza &amp;quot;Noapte Buna!&amp;quot;. Pentru orice alta situatie se afiseaza mesajul &amp;quot;Eroare!&amp;quot;.&lt;br /&gt;
 #!/bin/bash read i if [ $i -lt 12 ] then echo &amp;quot;Buna dimineata!&amp;quot; elif [ $i -ge 12 -a $i -lt 18 ] then echo &amp;quot;Buna ziua!&amp;quot; elif [ $i -ge 18 -a $i -le 24 ] then echo &amp;quot;Noapte buna !&amp;quot; else echo &amp;quot;Eroare!&amp;quot; fi -a reprezinta SI LOGIC (AND). Testul este adevarat daca ambele conditii sunt adevarate simultan.&lt;br /&gt;
&lt;br /&gt;
-o reprezinta SAU LOGIC (OR). Testul este adevarat daca una dintre contitii este adevarata.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Testul este adevarat daca ambele conditii sunt adevarate (primul parametru este fisier si exista SI are permisiunea de read). Ambele conditii sunt adevarate simultan.&lt;br /&gt;
 if [ -e $1 -a -r ]&lt;br /&gt;
2. Testul este adevarat daca primul parametru primit de script este fisier SAU acesta este director. Una dintre conditii este adevarata.&lt;br /&gt;
 if [ -f $1 -o -d $1 ]&lt;br /&gt;
&lt;br /&gt;
===For===&lt;br /&gt;
For se foloseste pentru a executa o sectiune de cod de un numar repetat de ori&lt;br /&gt;
(ciclu). Varianta clasica de for din Bash este diferita de cea din alte limbaje de programare.&lt;br /&gt;
Sintaxa pentru for este:&lt;br /&gt;
for VAR in lista_de_valori do instructiuni done&lt;br /&gt;
Se executa instructiunile specificate de atatea ori cate valori avem in lista. Pentru fiecare iteratie variabila VAR ia o valoare din lista_de_valori. Separatorul pentru valorile din lista este default spatiu sau valoarea variabilei globale IFS.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Script care exemplifica ciclul de tip for prin trimiterea unui pachet ping la fiecare din cele 3 IP-uri.&lt;br /&gt;
&lt;br /&gt;
Instructiunile dintre do si done se executa de atatea ori cate valori avem in lista (3 valori).&lt;br /&gt;
&lt;br /&gt;
Pentru fiecare ciclu valoarea variabilei IP este o valoare din lista. Valorile din lista sunt separate prin spatiu.&lt;br /&gt;
 #!/bin/bash for IP in 192.168.0.1 192.168.0.2 192.168.0.3 do ping -c 1 $IP done&lt;br /&gt;
&lt;br /&gt;
2. Exemplu for modificand valoara variabilei IFS care este separatorul valorilor.&lt;br /&gt;
 #!/bin/bash #Acest script afiseaza fiecare director din $PATH pe cate un rand IFS=: for DIR in $PATH do echo $DIR done&lt;br /&gt;
&lt;br /&gt;
In Bash exista si structura de tip for ca in C/C++. Aceasta este insa mai putin folosita.&lt;br /&gt;
&lt;br /&gt;
 Exemplu&lt;br /&gt;
 for ca in C/C++:&lt;br /&gt;
 LIMIT=10 for((a=0;a&amp;lt;=$LIMIT;a++)) do echo $a done&lt;br /&gt;
&lt;br /&gt;
===While===&lt;br /&gt;
Structura de tip while se foloseste pentru a executa o serie de instructiuni (cele&lt;br /&gt;
dintre do si done) atata timp cat conditia de test este adevarata.&lt;br /&gt;
&lt;br /&gt;
while [ conditie_de_test ] do lista_de_instructiuni done&lt;br /&gt;
&lt;br /&gt;
Exemplu while:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 #script care afiseaza numerele intre 0 zi 100&lt;br /&gt;
 LIMIT=100&lt;br /&gt;
 i=0&lt;br /&gt;
 while [ $i –le $LIMIT ]&lt;br /&gt;
 do&lt;br /&gt;
 echo &amp;quot;i=$i&amp;quot;&lt;br /&gt;
 let i=i+1&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Case===&lt;br /&gt;
Structura de tip case se foloseste pentru a executa o serie de instructiuni in functie de diferite conditii de testare.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru case este:&lt;br /&gt;
&lt;br /&gt;
 case VARIABILA in&lt;br /&gt;
 valoare1)&lt;br /&gt;
 instructiuni1&lt;br /&gt;
 ;;&lt;br /&gt;
 valoare2)&lt;br /&gt;
 instructiuni&lt;br /&gt;
 ;;&lt;br /&gt;
 *)&lt;br /&gt;
 instructiuni_default&lt;br /&gt;
 ;;&lt;br /&gt;
 esac&lt;br /&gt;
 * -&amp;gt; reprezinta instructiunile ce se vor executa default daca variabila nu are niciuna dintre valorile de mai sus.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 #!/bin/bash echo &amp;quot;Introdu nr:&amp;quot; read nr case $nr in 1) echo &amp;quot;nr este 1&amp;quot; ;; 2) echo &amp;quot;nr este2&amp;quot; ;; *) echo &amp;quot;nr are alta valoare&amp;quot; ;; esac&lt;br /&gt;
Structura de tip case poate fi oricand inlocuita cu o structura de tip if..elif..else&lt;br /&gt;
&lt;br /&gt;
Exemplul de mai sus folosind if..elif..else este:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 echo &amp;quot;Introdu nr:&amp;quot;&lt;br /&gt;
 read nr&lt;br /&gt;
 if [ $nr -eq 1 ]&lt;br /&gt;
 then echo &amp;quot;nr este 1&amp;quot;&lt;br /&gt;
 elif [ $nr -eq 2 ]&lt;br /&gt;
 then&lt;br /&gt;
 echo &amp;quot;nr este 2&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
 echo &amp;quot;nr este altceva&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Important&lt;br /&gt;
&lt;br /&gt;
Structura de tip case este foarte importanta si trebuie inteleasa bine. Toate&lt;br /&gt;
scripturile de initializare a serviciilor (cele din /etc/init.d ) folosesc o structura de tip case.&lt;br /&gt;
&lt;br /&gt;
Structura unui script de initializare din /etc/init.d este:&lt;br /&gt;
 case $1 in&lt;br /&gt;
 start) instructiuni de pornire serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 stop) instuctiuni de oprire serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 restart) instructiuni de restartare serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 *) afisare help script &lt;br /&gt;
 esac&lt;br /&gt;
&lt;br /&gt;
$1 reprezinta primul parametru al scriptului si poate fi start, stop sau restart.&lt;br /&gt;
&lt;br /&gt;
Exemplu: Pentru restartarea retelei se foloseste: /etc/init.d/network restart, unde network este scriptul de initializare iar restart primul parametru pe care-l primeste.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Presupunem ca am compilat si instalat serverul Apache in directorul /opt/apache.&lt;br /&gt;
Daemonul http se porneste ruland comanda: /opt/apache/bin/apachectl start, se opreste cu /opt/apache/bin/apachectl stop si se restarteaza cu /opt/apache/bin/apachectl restart. Se doreste pornirea serverului la butarea sistemului, mai exact la intrarea in runlevel 3.&lt;br /&gt;
&lt;br /&gt;
Etape:&lt;br /&gt;
1. Se creaza un script in /etc/init.d. Numele poate fi ales aleator, in exemplul nostru acesta se numeste init_apache&lt;br /&gt;
2. Se creaza un symlink catre /etc/init.d/init_apache in /etc/init.d/rc3.d numit S99Apache. Numele symlinkului este important sa inceapa cu litera S urmata de un umar intre 0 si 99.&lt;br /&gt;
&lt;br /&gt;
La intrarea in runlevel 3 se va rula automat acest script cu parametrul start.&lt;br /&gt;
Structura scriptului /etc/init.d/init_apache este:&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 case $1 in&lt;br /&gt;
 start)&lt;br /&gt;
 echo &amp;quot;Starting Apache...&amp;quot; /opt/apache/bin/apachectl start echo &amp;quot;OK&amp;quot;&lt;br /&gt;
 ;;&lt;br /&gt;
 stop) echo &amp;quot;Shutting down Apache...&amp;quot; /opt/apache/bin/apachectl stop echo &amp;quot;OK&amp;quot;&lt;br /&gt;
 ;;&lt;br /&gt;
 restart) $0 stop $0 start&lt;br /&gt;
 ;;&lt;br /&gt;
 *) echo &amp;quot;init_apache &amp;lt;start|stop|restart&amp;gt;&amp;quot;&lt;br /&gt;
 esac&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Pentru detalii complete despre modul de pornire a serviciilor la butare cititi capitolul &amp;quot;Managementul Serviciilor&amp;quot; din cursul &amp;quot;Linux Basic Administration&amp;quot; disponibil de asemenea online.&lt;br /&gt;
&lt;br /&gt;
===Select===&lt;br /&gt;
Structura de tip select este specifica doar Bash-ului si se foloseste pentru crearea de meniuri.&lt;br /&gt;
&lt;br /&gt;
Sintaxa acesteia este:&lt;br /&gt;
 select MENUITEM in menu_list&lt;br /&gt;
 do&lt;br /&gt;
 lista_de_comenzi&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
Detalii:&lt;br /&gt;
- menu_list este lista de meniuri. Valorile din lista sunt separate prin spatiu;&lt;br /&gt;
- intre do si done sunt instruciunile ce se executa in functie de meniul ales;&lt;br /&gt;
- intre do si done avem acces la urmatoarele 2 variabile: MENUITEM care contine meniul&lt;br /&gt;
&lt;br /&gt;
selectat si REPLY care se creaza automat si contine inputul userului (ce a scris acesta la consola);&lt;br /&gt;
&lt;br /&gt;
- PS3 contine prompterul de selectare a meniurilor;&lt;br /&gt;
- userul alege un meniu din lista folosind un nr. de ordine: alege 1 pentru primul meniu, 2 pentru al doilea etc;&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 PS3=&amp;quot;Alege:&amp;quot;&lt;br /&gt;
 select ITEM in &amp;quot;Afiseaza continut /etc&amp;quot; &amp;quot;Afiseaza spatiu liber&amp;quot; &amp;quot;Exit&amp;quot;&lt;br /&gt;
 do&lt;br /&gt;
 case $REPLY in&lt;br /&gt;
 1) ls -l /etc&lt;br /&gt;
 ;;&lt;br /&gt;
 2) df -h&lt;br /&gt;
 ;;&lt;br /&gt;
 3) exit 0&lt;br /&gt;
 ;;&lt;br /&gt;
 *) echo &amp;quot;Optiune incorecta&amp;quot;&lt;br /&gt;
 esac&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
==1.6 Substituirea comenzilor==&lt;br /&gt;
Unei variabile i se poate asigna o valoare in 2 moduri:&lt;br /&gt;
1. Folosind NUME_VAR=valoare&lt;br /&gt;
&lt;br /&gt;
Exemplu: EDITOR=&amp;quot;VIM&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Substituind o comanda cu outputul ei&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 VAR=`ls /etc` -&amp;gt; in acest exemplu comanda ls /etc se substituie sau inlocuieste cu outputul ei care se asigneaza variabilei VAR. Variabila VAR va contine outputul comenzii ls -l.&lt;br /&gt;
Nota&lt;br /&gt;
Substituirea unei comenzi cu outputul ei reprezinta unul dintre caracteristicile cele mai puternice ale Bashului, iar majoritatea scripturilor folosesc acest mod de lucru.&lt;br /&gt;
&lt;br /&gt;
Pentru a substitui o comanda cu outputul ei exista 2 variante:&lt;br /&gt;
&lt;br /&gt;
1. Comanda sa incadreza in backquotes ( ``). Atentie, backquotes nu sunt apostroafe sau&lt;br /&gt;
ghilimele simple.&lt;br /&gt;
 Exemplu: ME= `whoiam ` -&amp;gt; variabila ME va contine outputul comenzii whoami&lt;br /&gt;
&lt;br /&gt;
2. Comanda se incadreza intre $( si )&lt;br /&gt;
 Exemplu: ETH0= $(ifconfig eth0) -&amp;gt; variabila numita ETH0 va contine outputul comenzii&lt;br /&gt;
 ifconfig eth0&lt;br /&gt;
 Exemplu script ce nu poate fi rulat de catre root&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 if [ &amp;quot;$(whoami)&amp;quot; = &amp;quot;root&amp;quot; ]&lt;br /&gt;
 then&lt;br /&gt;
 echo &amp;quot;Esti root, sorry !&amp;quot;&lt;br /&gt;
 exit 1;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
#incep instructiunile ce nu pot fi rulate de catre root&amp;quot;&lt;br /&gt;
 ls -la ~&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
&lt;br /&gt;
In momentul in care o variabila de tip string este testat folosind un test pentru stringuri este bine ca aceasta sa fie incadrata intre ghilimele duble pentru a forta tipul ei catre string.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
VAR=&amp;quot;`ifconfig eth0`&amp;quot; if [ -z &amp;quot;$VAR&amp;quot; ] then echo &amp;quot;Interfata eth0 nu exista!&amp;quot; fi&lt;br /&gt;
&lt;br /&gt;
Subshells&lt;br /&gt;
&lt;br /&gt;
Utilizarea subshell-urilor în Bash poate fi avantajoasă din mai multe motive, inclusiv:&lt;br /&gt;
&lt;br /&gt;
 1. Izolarea comenzilor: comenzile executate într -un subshell sunt izolate de cochilie părinte. Aceasta înseamnă că orice modificări aduse la variabile, directoare sau alte setări de mediu din subshell nu vor afecta shell-ul părinte.&lt;br /&gt;
&lt;br /&gt;
 2. Scoping: Variabilele definite într -un subshell au un domeniu local și nu vor afecta variabile cu același nume în shell-ul părinte.&lt;br /&gt;
&lt;br /&gt;
 3. Manevrarea erorilor: subshell -urile pot fi utilizate pentru o mai bună gestionare a erorilor. De exemplu, puteți executa o serie de comenzi într-un subshell și puteți verifica starea de returnare a acesteia fără a afecta fluxul principal al scriptului dvs.&lt;br /&gt;
&lt;br /&gt;
Iată câteva exemple de utilizare a subshell-urilor în Bash:&lt;br /&gt;
&lt;br /&gt;
Schimbarea directorului temporar:&lt;br /&gt;
&lt;br /&gt;
Aceasta schimbă temporar directorul în/calea/în/director, execută comanda LS, apoi se întoarce în directorul original. Schimbarea directorului afectează doar subshell-ul.&lt;br /&gt;
&lt;br /&gt;
-Execuție paralelă:&lt;br /&gt;
&lt;br /&gt;
Aceasta execută mai multe comenzi concomitent în subshell-uri, permițându-le să funcționeze în paralel.&lt;br /&gt;
&lt;br /&gt;
-Manevrarea erorilor:&lt;br /&gt;
&lt;br /&gt;
Aceasta execută comanda1 și comanda2 într -un subshell. Dacă Command1 sau Command2 eșuează (returnează un statut de ieșire non-zero), atunci este ecou „eroare”.&lt;br /&gt;
&lt;br /&gt;
-Setări temporare ale mediului:&lt;br /&gt;
&lt;br /&gt;
Aceasta stabilește o variabilă de mediu temporară la valoare pentru durata comenzii. Odată ce comanda se termină, variabila revine la valoarea sa anterioară (sau este nesetată dacă nu exista înainte).&lt;br /&gt;
&lt;br /&gt;
Subshell-urile sunt versatile și pot fi utilizate creativ pentru a atinge diverse obiective de script, menținând controlul asupra mediului și fluxului de execuție al comenzilor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;In inchiderea cursului Linux Essentials:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La ce pot fi folosite parantezele ( ) in bash?&lt;br /&gt;
&lt;br /&gt;
Utilizari comune&lt;br /&gt;
    1. Substitutia comenzii:&lt;br /&gt;
        ◦ $(command) or `command`: Executa comanda si ii substituie iesirea.&lt;br /&gt;
        ◦ Example: echo $(date) or echo \date``&lt;br /&gt;
    2. Expansie aritmetica:&lt;br /&gt;
        ◦ (( expression )): Performa operatuni aritmetice si le evalueaza expresia.&lt;br /&gt;
        ◦ Example: (( x = 5 + 3 ))&lt;br /&gt;
    3. Crearea unui subshell:&lt;br /&gt;
        ◦ ( commands ): Execute comenzi intr-un subshell, izolandu-i mediul de cea principala.&lt;br /&gt;
        ◦ Example: (cd /path/to/directory &amp;amp;&amp;amp; ls)&lt;br /&gt;
    4. Declararea unei functii:&lt;br /&gt;
        ◦ function_name () { commands; }: Declara o functie.&lt;br /&gt;
    5. Gruparea comenzilor:&lt;br /&gt;
        ◦ { commands; }: Grupeaza mai multe comenzi impreuna, permitandu-le sa ruleze ca si o singura comanda.&lt;br /&gt;
        ◦ Example: { echo &amp;quot;Hello&amp;quot;; echo &amp;quot;World&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Essentials_Pagina_7|Pagina anterioară]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Essentials_Pagina_8&amp;diff=542</id>
		<title>Essentials Pagina 8</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Essentials_Pagina_8&amp;diff=542"/>
		<updated>2025-04-11T08:00:43Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* 1.1 Introducere in Bash */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Laborator 8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=Shell Scripts=&lt;br /&gt;
&lt;br /&gt;
==1.1 Introducere in Bash==&lt;br /&gt;
Shellul este interpretorul de comenzi. Acesta parseaza comenzile introduse de&lt;br /&gt;
utilizator, le verifica din punct de vedere al sintaxei si le trimite kernel-ului spre executie.&lt;br /&gt;
&lt;br /&gt;
Exista mai multe shelluri (Bourne, C Shell, recent aparute Zsh si Fish, etc), dar default pe Linux este shellul numit Bash (Bourne Again Shell). Acesta este reprezentat de fisierul &#039;&#039;/bin/bash&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Pe langa interpretarea si executia comenzilor, Bash-ul ofera si alte facilitati printre&lt;br /&gt;
care: editarea liniei de comanda, history, alias-uri, dar si un limbaj de programare structurat propriu.&lt;br /&gt;
&lt;br /&gt;
Un script de shell este un fisier text (ASCII) care contine comenzi de shell organizate intr-un mod logic. Pe langa comenzi, script-ul mai contine si variabile (locale sau globale), parametri pozitionali precum si structuri de programare specifice (if..then..else, while, do, until, for, case, selsect etc). Un script este folosit pentru a imbina comenzi si diverse structuri de control pentru a oferi o noua functionalitate sau a automatiza task-uri.&lt;br /&gt;
&lt;br /&gt;
Etapele crearii unui script sunt:&lt;br /&gt;
&lt;br /&gt;
a) crearea unui fisier text folosind editorul preferat (Exemplu: vim)&lt;br /&gt;
b) editarea fisierului pentru a contine functionalitatea dorita&lt;br /&gt;
c) testarea scriptului adica executia/rularea acestuia&lt;br /&gt;
&lt;br /&gt;
Modul de executie a unui script numit script1:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Din directorul care contine scriptul se ruleaza : ./script1&lt;br /&gt;
Fisierul script1 trebuie sa aiba dreptul de executie. Fiindca directorul curent (.) nu&lt;br /&gt;
se afla in $PATH (altfel grave probleme de securitate), scriptul trebuie sa fie executat cu calea absoluta sau cu ./nume_script In acest caz se porneste un shell nou ca sub proces al shellului curent in care se executa comenzile din script.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Din directorul care contine fisierul script1 se ruleaza: . script1 sau source script1.&lt;br /&gt;
Se executa comenzile din script1 in shell-ul curent. Fisierul script1 nu trebuie sa&lt;br /&gt;
aiba dreptul de executie. Una dintre diferentele dintre prima si a doua varianta este ca variabilele exportate sau globale sunt vizibile in shell-ul curent in varianta a doua, dar nu si in prima varianta.&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Varianta cea mai folosita de executie a unui script este prima: ./script&lt;br /&gt;
Un script trebuie sa contina pe prima linie o referire la programul cu care se executa (Bash, Perl, PHP, Python etc). Astfel prima linie a unui script Bash este invariabil: #!/bin/bash. In interiorul scriptului #(diez) reprezinta un comentariu. Exceptie face prima linie.&lt;br /&gt;
&lt;br /&gt;
echo se foloseste pentru afisa un string (sir de caractere) sau o variabila la consola.&lt;br /&gt;
Exemplu: echo &amp;quot;Linux&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Script care afiseaza mesajul: Acesta este primul exemplu !&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 echo &amp;quot;Acesta este primul exemplu !&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Script care creaza un fiser numit continut_etc.txt in directorul curent ce contine fisierele si directoarele din directorul /etc, iar apoi afiseaza spatiul total, ocupat si liber de pe fiecare partitie de pe Hard Disk.&lt;br /&gt;
 #!/bin/bash &lt;br /&gt;
 ls -l /etc &amp;gt; continut_etc.txt&lt;br /&gt;
 echo &amp;quot;Fisierul continut_etc.txt a fost creat in directorul curent!&amp;quot;&lt;br /&gt;
 echo &amp;quot;Informatii partitii:&amp;quot;&lt;br /&gt;
 df -h Important&lt;br /&gt;
&lt;br /&gt;
O cunoastere acceptabila a modului de creare de scripturi este esentiala pentru orice Administrator de sistem. In cazul persoanelor incepatoare care nu au experienta in programare (orice limbaj) procesul de scripting pare la prima vedere extrem de complicat.&lt;br /&gt;
&lt;br /&gt;
Este nevoie de multe exercitii si exemple pentru o intelegere aprofundata. Intotdeauna se incepe cu exercitii simple si anume scripturi formate din cateva randuri.&lt;br /&gt;
&lt;br /&gt;
==1.2 Variabile, constante si functii==&lt;br /&gt;
&lt;br /&gt;
Prezentare generala:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; O variabila reprezinta un nume pentru o locatie de memorie unde se gaseste o valoare. Se obisnuieste (nu este obligatoriu) ca variabilele sa se scrie cu litera mare.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Comparativ cu alte limbaje de programare (C/C++, JAVA) variabilele in Bash nu au tip. Ele sunt string-uri, dar in functie de context pot fi evaluate ca integer etc.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; O variabila se declara: NUME_VAR=valoare&lt;br /&gt;
&lt;br /&gt;
Important&lt;br /&gt;
Nu se foloseste spatiu intre NUME_VAR si valoare. i = 1 reprezinta eroare. Sintaxa bash - ului este extrem de stricta. Un spatiu in plus sau in minus reprezinta o eroare fatala.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 NUME=&amp;quot;dan&amp;quot;&lt;br /&gt;
 varsta=20&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4&#039;&#039;&#039;. Pentru a ne referi la continutul unei varibile se foloseste semnul $ (dollar) in fata numelui variabilei.&lt;br /&gt;
Exemplu: echo $varsta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5&#039;&#039;&#039;. Variabilele pot fi locale sau globale. Cele locale sunt vizibile doar in shell-ul curent, iar cele globale sunt vizibile in shell-ul curent si in toate subprocesele shell-ului curent. Astfel in interiorul unui script daca se foloseste o variabila globala aceasta va fi accesibila oricarei comenzi/program lansata din acel script. Variabilele globale nu sunt accesibile parintelui unui proces, adica shell-ului de unde s-a executat scriptul. Exceptie face varianta 2 de executie a unui script adica folosind source nume_script&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6&#039;&#039;&#039;. Pentru a declara o variabila globala aceasta trebuie exportata. Se foloseste cuvantul cheie export&lt;br /&gt;
&lt;br /&gt;
 Exemplu: export VARSTA=20&lt;br /&gt;
 variabilele globale se numesc de environment;&lt;br /&gt;
 pentru a vizualiza variabilele locale se foloseste comanda set;&lt;br /&gt;
 pentru a vizualiza variabilele globale se foloseste comanda env;&lt;br /&gt;
 pentru sterge o variabila se foloseste comanda unset NUME_VAR;&lt;br /&gt;
&lt;br /&gt;
Exemplu de varibile globale predefinite:&lt;br /&gt;
 PATH -&amp;gt; contine o lista de directoare in care shell-ul cauta comanda care se executa.&lt;br /&gt;
&lt;br /&gt;
Pentru a concatena un string la variabila PATH se foloseste caracterul : (doua puncte).&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&lt;br /&gt;
Daca dorim sa adaugam directorul /home/dan/scripts in PATH: export&lt;br /&gt;
 PATH=PATH:/home/stud/scripts&lt;br /&gt;
&lt;br /&gt;
Dupa aceasta scripturi si comenzi din /home/stud/scripts pot fi rulate in orice director ne am afla doar prin numele lor. Altfel trebuie folosita calea absoluta sau aflandu-ne in&lt;br /&gt;
director se executa: ./nume_comanda&lt;br /&gt;
 HOSTNAME -&amp;gt; contine hostname-ul calculatorului&lt;br /&gt;
 SHELL -&amp;gt; contine shell-ul default&lt;br /&gt;
 HISTSIZE - contine nr. de comenzi care vor fi memorate in history&lt;br /&gt;
 USER -&amp;gt; contine EUID&lt;br /&gt;
 PWD -&amp;gt; contine directorul curent&lt;br /&gt;
 OLDPWD -&amp;gt; contine directorul precedent si se foloseste de comanda: cd –&lt;br /&gt;
 HOME -&amp;gt; contine home directory al EUID&lt;br /&gt;
 RANDOM -&amp;gt; variabila al carei continut este pseudoaleator&lt;br /&gt;
 TMOUT -&amp;gt; nr in secunde dupa care se face logout automat daca nu se executa nicio comanda&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7&#039;&#039;&#039;. Diferenta dintre ghilimele simple(apostrof) si ghilimele duble este aceea ca ghilimele simple nu interpreteaza $ ca si caracter special. In interiorul ghilimelelor simple fiecare caracter special cu exceptia &#039; (ghilimea simpla) este interpretat literal.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 varsta=20 echo &amp;quot;$varsta&amp;quot; ##se afiseaza 20 echo &#039;$varsta&#039; ##se afiseaza $varsta&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8&#039;&#039;&#039;. O variabila poate fi declarata read-only sau de tip array. O variabila read-only se mai numeste si constanta.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 &#039;&#039;&#039;1.&#039;&#039;&#039; var1 este readonly. Aceasta nu poate fi modificata sau stearsa folosind unset.&lt;br /&gt;
 declare -r var1=7&lt;br /&gt;
 &#039;&#039;&#039;2.&#039;&#039;&#039; Pentru a declara un array/vector:&lt;br /&gt;
 ARRAY=(unu doi trei) echo ${ARRAY[*]} echo ${ARRAY[1]} i=2 echo&lt;br /&gt;
 ${ARRAY[]} unset ARRAY[1] unset ARRAY&lt;br /&gt;
 ARRAY nu este cuvant cheie. In loc de ARRAY poate fi orice cuvant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;9&#039;&#039;&#039;. Pentru a citi o variabila de la tastatura se foloseste cuvantul cheie read&lt;br /&gt;
Exemplu:&lt;br /&gt;
 #!/bin/bash echo &amp;quot;Introdu nume fisier:&amp;quot; read FILE echo &amp;quot;Fisierul introdus este $FILE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10&#039;&#039;&#039;. In bash exista caractere speciale care sunt interpretate in mod deosebit.&lt;br /&gt;
 Exemple: $ (dollar), &amp;quot;(ghilimea dubla) sau \ (backslash). Pentru a anula efectul special al&lt;br /&gt;
caracterului, acesta se precede cu \ (backslash).&lt;br /&gt;
&lt;br /&gt;
 Exemplu: echo \$var -&amp;gt; Afiseaza $var. $ nu mai este caracter special.&lt;br /&gt;
&lt;br /&gt;
==1.3 Parametri pozitionali==&lt;br /&gt;
Bash-ul foloseste parametri speciali la care ne putem referi in interiorul unui script&lt;br /&gt;
pentru a avea acces la anumite valori. Acesti parametri speciali se pot folosi ca si&lt;br /&gt;
variabilele, doar ca exista default si nu trebuie creati. Continutul acestora este de asemenea standard.&lt;br /&gt;
&lt;br /&gt;
Acestia sunt:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; $0 - contine numele scriptului&lt;br /&gt;
Scriptul poate actiona diferit in functie de numele cu care a fost rulat ( Exemplu:&lt;br /&gt;
daca se ruleaza folosind un simlink al scriptului. Vezi comanda /bin/egrep care este un simlink catre /bin/grep dar are totusi functionalitate diferita).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; $1 - reprezinta primul argument al scriptului, $2 al doilea argument al scriptului etc. Incepand cu argumentul 10 acesta trebuie incadrat intre acolade ${10}, ${11} etc.&lt;br /&gt;
Se folosesc pentru a evita erori in momentul in care scriptul este rulat fara argumente sau cu un alt nr. de argumente (iar acesta asteapta sa primeasca argumente).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; $? - reprezinta statusul ultimei comenzi executate.&lt;br /&gt;
In Bash Zero este statusul pentru non-error iar diferit de zero este statusul pentru eroare. Orice comanda/program are un status de exit, zero sau non-zero. Se foloseste pentru a continua executia scriptului (sau a modifica comportamentul acestuia) in functie de statusul comenzilor anterioare.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; $# - reprezinta nr. de argumente ale scriptului Se poate lua o decizie in functie de nr. de argumente cu care a fost rulat scriptul.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.&#039;&#039;&#039; $* - reprezinta toate argumentele date scriptului.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.&#039;&#039;&#039; $$ - reprezinta PID shell.&lt;br /&gt;
Astel in functie de cum rulam scriptul $$ are alta valoare:source f1 - $$ reprezinta PID bash (shell curent) ./f1 - $$ reprezinta PID noului sub-shell creat in care se executa comenzile&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.&#039;&#039;&#039; $! - reprezinta PID ultimului proces executat in background.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Script care sterge fisierul sau directorul pe care-l primeste ca argument&lt;br /&gt;
 #!/bin/bash rm -rf $1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Afisarea numelui scriptului&lt;br /&gt;
 #!/bin/bash Echo &amp;quot;Numele scriptului executat este: $0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==1.4 Alte facilitati Bash==&lt;br /&gt;
===Alias===&lt;br /&gt;
Un alias reprezinta un mod prin care o comanda sau o serie de comenzi se executa folosind un alt nume.&lt;br /&gt;
Pentru a crea un alias se foloseste comanda: alias comanda_noua=&#039;comanda_substituita&#039;&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. alias copy=&#039;cp&#039;&lt;br /&gt;
2. alias search=&#039;grep&#039;&lt;br /&gt;
3. alias ls=&#039;ls -F&#039;&lt;br /&gt;
4. alias rm=&#039;rm -i&#039;&lt;br /&gt;
5. alias ll=&#039;ls -l&#039;&lt;br /&gt;
6. alias stop=&#039;kill -9&#039;&lt;br /&gt;
&lt;br /&gt;
Daca aliasul este compus din mai multe cuvinte acestea trebuie incadrate intre&lt;br /&gt;
ghilimele simple (apostrof).Pentru a vizualiza toate aliasurile din sistem se foloseste comanda alias fara nici un argument.Pentru a executa comanda originala in locul aliasului se foloseste \ (backslash) urmat de comanda.&lt;br /&gt;
&lt;br /&gt;
Example: \ls&lt;br /&gt;
Pentru a sterge un alias se foloseste comanda unalias&lt;br /&gt;
Exemplu: unalias ls&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Un alias exista doar in shell-ul curent (nu exista nici macar in subshell-urile shell-ului curent).&lt;br /&gt;
&lt;br /&gt;
===Customizare Environment===&lt;br /&gt;
Prompting variables (prompt strings)&lt;br /&gt;
&lt;br /&gt;
Bash foloseste 4 variabile speciale numite &amp;quot;prompt strings&amp;quot;: PS1, PS2, PS3 si PS4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; PS1 este numit &amp;quot;primary prompt string&amp;quot; si reprezinta prompterul curent.&lt;br /&gt;
De cele mai multe ori acesta se modifica pentru a arata informatii cat mai utile despre sesiunea curenta.&lt;br /&gt;
&lt;br /&gt;
 PS1 foloseste niste macro-uri care se expandeaza cu un anumit continut astfel:&lt;br /&gt;
 \A - current time in HH:MM hours format&lt;br /&gt;
 \d - current date&lt;br /&gt;
 \@ - the current time in 12 hours format&lt;br /&gt;
 \H - the hostname&lt;br /&gt;
 \h - the hostname up to the first dot (.)&lt;br /&gt;
 \s - the name of the shell&lt;br /&gt;
 \u - username of the EUID&lt;br /&gt;
 \w - the current working directory&lt;br /&gt;
 \W - the current working directory (basename) - relativ&lt;br /&gt;
 \$ - if EUID==0 print # else print $&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Un exemplu excelent de modificare PS1 este: export PS1=&#039;[\u@\h \w]$&#039;&lt;br /&gt;
Avand acest prompter adminul are intotdeauna informatii despre userul cu care s-a conectat, host-ul pe care este conectat precum si calea absoluta a directorului curent. Linia de mai sus se adauga in fisierul de customizare ~/.bashrc&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; PS2 este numit &amp;quot;secondary prompt string&amp;quot; si are valoarea default &amp;gt; (mai mare).&lt;br /&gt;
Se foloseste atunci cand se scrie o comanda incompleta si se apasa ENTER.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; PS3 se numeste &amp;quot;prompt string for the select command&amp;quot; si se foloseste in scripting impreuna cu comanda select&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; PS4 se numeste &amp;quot;prompt string for the xtrace option&amp;quot; si reprezinta un prompt string folosit in debugging si flow control.&lt;br /&gt;
&lt;br /&gt;
===Environment===&lt;br /&gt;
Fiecare utilizator are propriul mediu de lucru numit si Environment. Customizarea&lt;br /&gt;
Environmentului presupune modificarea unor variabile si parametri astfel incat mediul de lucru sa fie cat mai prietenos si sa ne ofere cat mai multe informatii.&lt;br /&gt;
Din mediul de lucru al unui utilizator fac parte: aliasurile sale, umask, modul de&lt;br /&gt;
afisare al prompterului, variabila PATH in care shellul cauta comenzile, ulimit etc&lt;br /&gt;
&lt;br /&gt;
Exista fisiere de initializare pentru fiecare user care sunt citite de shell la fiecare&lt;br /&gt;
pornire a acestuia:&lt;br /&gt;
&lt;br /&gt;
~/.bashrc - este primul fisier citit de shell la login. In acest fisier trebuie declarate variabile,&lt;br /&gt;
alias-uri etc pentru fiecare user.&lt;br /&gt;
~/.bash_profile - este citit dupa ~/.bashrc&lt;br /&gt;
~/.bash_logout - este citit de shell inainte de logout. In acest fisier se pot reseta variabile, sterge fisiere temporare sau alte functii care vrem sa aiba loc inainte de logout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Fisierul /etc/profile este un alt fisier de customizare &amp;quot;system-wide&amp;quot;. Acesta nu&lt;br /&gt;
apartine unui anumit user, iar in el se configureaza mediul pentru toti userii. Il folosim de exemplu daca dorim setarea unui alias pentru toti userii din sistem.&lt;br /&gt;
Aceste fisiere nu sunt recitite automat de shell dupa modificare. Toate configurarile au efect dupa o noua logare in cazul ~/.bashrc sau ~/.bash_profile sau dupa o restartare a sistemului in cazul /etc/profile.Pentru a forta recitirea lor se foloseste comanda source sau . (dot) urmata de nume fisier. source sau . executa comenzile din interiorul fisierului in shellul curent.&lt;br /&gt;
&lt;br /&gt;
Exemplu: source ~/.bashrc sau . ~/.bashrc&lt;br /&gt;
Daca ~/.bash_profile nu exista shell-ul cauta ~/.bash_login. Daca nici aceasta nu exista cauta ~/.profile.&lt;br /&gt;
In aceste fisiere speciale de initializare se seteaza: PS1, TMOUT, PATH, alias, umask etc pentru fiecare utilizator&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Fisierele de initializare pentru fiecare utilizator se gasesc in home directory al acestuia (~) si sunt ascunse fiindca incep cu .(punct). Pentru vizualizarea lor se foloseste comanda ls cu optiunea -a Exemplu: ls -la ~&lt;br /&gt;
&lt;br /&gt;
In functie de distributia de Linux numele si ordinea de citire a fisierelor de customizare a mediului de lucru pentru fiecare user poate sa difere. Totusi, pe marea majoritate a distributiilor de Linux (RedHat, Fedora, CentOS, Suse, Ubuntu, Kubuntu, Debian) exista ~/.bashrc. In acest caz se recomanda folosirea doar a acestuia&lt;br /&gt;
&lt;br /&gt;
Exemplu ~/.bashrc:&lt;br /&gt;
 # User specific aliases and functions alias rm=&#039;rm -i&#039; alias cp=&#039;cp -i&#039; alias mv=&#039;mv -i&#039; alias cauta=find alias muta=mv alias S=&#039;ssh -l root -p 7890 ssh.crystalmind.ro&#039; # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi export PS1=&#039;[\u@\h \w]$&#039; export&lt;br /&gt;
 PATH=:/home/dan/scripts umask=0022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==1.5 Flow Control==&lt;br /&gt;
===Conditii de testare===&lt;br /&gt;
Nota&lt;br /&gt;
Informatiile din acesta pagina au scopul de referinta pentru testele folosite de structurile de control ce urmeaza a fi prezentate. Ele nu trebuie invatate la acest moment in afara conextului de flow control ci doar impreuna cu structurile if..then..else, while, case etc&lt;br /&gt;
&lt;br /&gt;
Structurile de control (if..then..else, while etc) presupun conditii de testare.&lt;br /&gt;
&lt;br /&gt;
Acestea sunt:&lt;br /&gt;
 1. Pentru fisiere&lt;br /&gt;
 -e = fisierul exista&lt;br /&gt;
 -f = fisierul exista si este de tipul regular file&lt;br /&gt;
 Exemplu: -f $FILE&lt;br /&gt;
 -s = fisierul nu are dimensiunea zero&lt;br /&gt;
 -d = fisierul exista si este de tip director&lt;br /&gt;
 -c = fisierul exista si este de tip char device&lt;br /&gt;
 -b = fisierul exista si este de tip block device&lt;br /&gt;
 -r = fisierul exista si are permisiunea read&lt;br /&gt;
 -w = fisierul exista si are permisiunea write&lt;br /&gt;
 -x = fisierul exista si are permisiunea execute&lt;br /&gt;
 -g = fisierul are GUID setat&lt;br /&gt;
 -u = fisierul are SUID setat&lt;br /&gt;
 -k = fisierul are sticky bit setat&lt;br /&gt;
 -nt = fisierul este mai nou decat un alt fisier&lt;br /&gt;
 Exemplu: file1 -nt file = file1 is newer than file2&lt;br /&gt;
 ! -&amp;gt; inverseaza sensul (neaga)&lt;br /&gt;
&lt;br /&gt;
2. Pentru comparatie&lt;br /&gt;
 -eq = equal to&lt;br /&gt;
 -ne = not equal to&lt;br /&gt;
 -gt = greater than&lt;br /&gt;
 Exemplu: $i -gt -$j&lt;br /&gt;
 -ge = greater than or equal&lt;br /&gt;
 -lt = less than&lt;br /&gt;
 -le = less than or egal&lt;br /&gt;
&lt;br /&gt;
3. Pentru stringuri (siruri de caractere)&lt;br /&gt;
 -z = lungimea sirului este zero&lt;br /&gt;
 -n = lungimea sirului este non-zero&lt;br /&gt;
 = egal (comparativ cu alte limbaje de programare operatorul de comparatie este un singur egal) != diferit&lt;br /&gt;
 Exemplu: $str1 != $str2&lt;br /&gt;
 -a = SI LOGIC (AND)&lt;br /&gt;
 -o = SAU LOGIC (OR)&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Testul este adevarat daca ambele conditii sunt adevarate simultan (valoarea variabilei USER este root si valoarea variabilei SHELL este bash)&lt;br /&gt;
 $USER = &amp;quot;root&amp;quot; -a $SHELL = &amp;quot;bash&amp;quot;&lt;br /&gt;
In cazul comparatiei a doua stringuri din punct de vedere al sintaxei bash este obligatoriu un spatiu inainte de = (egal) si un spatiu dupa = (egal).&lt;br /&gt;
 Exemplu: $USER=&amp;quot;root&amp;quot; este gresit, $USER = &amp;quot;root&amp;quot; este corect.&lt;br /&gt;
&lt;br /&gt;
2. Testul este adevarat daca una dintre conditii este adevarata(i mai mic ca 10 SAU i mai mare ca 100) $i -lt 10 -o $i gt 100&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Contiditiile de testare prezentate mai sus sunt doar cele mai folosite. Pentru lista completa executati: man test test EXPR sau [ EXPR ] au acelasi rezultat.&lt;br /&gt;
&lt;br /&gt;
===If..then..else===&lt;br /&gt;
Cea mai simpla constructie de flow control este cea conditionala reprezentata de if.&lt;br /&gt;
In functie de o valoarea de adevar a unei conditii se stabilesc instructiunile ce trebuie executate. Conditiile de test se refera la proprietati ale fisierelor, comparatii numerice sau sunt referitoare la stringuri.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if este:&lt;br /&gt;
 if [ conditie_de_test ] then lista_de_instructiuni fi&lt;br /&gt;
Daca conditia de test este adevarata se executa lista de instructiuni, altfel aceasta nu se executa.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Daca primul argument al scriptului este fisier se executa: cat fisier&lt;br /&gt;
 if [ -f $1 ] then cat $1 fi&lt;br /&gt;
&lt;br /&gt;
2. Daca valoarea variabilei i este 10 se afiseaza mesajul &amp;quot;Variabila i are valoarea 10&amp;quot; if [ $i -eq 10 ] then echo &amp;quot;Variabila i are valoarea 10&amp;quot; fi&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if..else este:&lt;br /&gt;
 if [ conditie_de_test ] then lista_de_instructiuni else lista_de_instructiuni_default fi&lt;br /&gt;
&lt;br /&gt;
Data conditia de test este adevarata se executa lista_de_instructiuni, altfel se executa lista_de_instructiuni_default&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Daca valoarea variabilei VARSTA citita de la tastatura este mai mica decat 18 se afiseaza mesajul &amp;quot;Esti minor!&amp;quot;, altfel se afiseaza mesajul &amp;quot;Esti major!&amp;quot;&lt;br /&gt;
 #!/bin/bash echo &amp;quot;Introdu varsta:&amp;quot; read VARSTA if [ $VARSTA -lt 18 ] then echo &amp;quot;Esti minor!&amp;quot; else echo &amp;quot;Esti major!&amp;quot; fi&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru if..elif..else este:&lt;br /&gt;
 if [ conditie_de_test1 ] then lista_de_instructiuni1 elif [ conditie_de_test2 ] then&lt;br /&gt;
 lista_de_instructiuni2 elif [ conditie_de_test3 ] then lista_de_instructiuni3 else&lt;br /&gt;
 lista_de_instructiuni_default fi&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Daca variabila ORA citita de la tastatura este mai mica decat 12 se afiseaza mesajul &amp;quot;Buna dimineata&amp;quot; daca este intre 12 si 18 se afiseaza mesajul &amp;quot;Buna ziua&amp;quot;, daca este intre 18 si 24 se afiseaza &amp;quot;Noapte Buna!&amp;quot;. Pentru orice alta situatie se afiseaza mesajul &amp;quot;Eroare!&amp;quot;.&lt;br /&gt;
 #!/bin/bash read i if [ $i -lt 12 ] then echo &amp;quot;Buna dimineata!&amp;quot; elif [ $i -ge 12 -a $i -lt 18 ] then echo &amp;quot;Buna ziua!&amp;quot; elif [ $i -ge 18 -a $i -le 24 ] then echo &amp;quot;Noapte buna !&amp;quot; else echo &amp;quot;Eroare!&amp;quot; fi -a reprezinta SI LOGIC (AND). Testul este adevarat daca ambele conditii sunt adevarate simultan.&lt;br /&gt;
&lt;br /&gt;
-o reprezinta SAU LOGIC (OR). Testul este adevarat daca una dintre contitii este adevarata.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Testul este adevarat daca ambele conditii sunt adevarate (primul parametru este fisier si exista SI are permisiunea de read). Ambele conditii sunt adevarate simultan.&lt;br /&gt;
 if [ -e $1 -a -r ]&lt;br /&gt;
2. Testul este adevarat daca primul parametru primit de script este fisier SAU acesta este director. Una dintre conditii este adevarata.&lt;br /&gt;
 if [ -f $1 -o -d $1 ]&lt;br /&gt;
&lt;br /&gt;
===For===&lt;br /&gt;
For se foloseste pentru a executa o sectiune de cod de un numar repetat de ori&lt;br /&gt;
(ciclu). Varianta clasica de for din Bash este diferita de cea din alte limbaje de programare.&lt;br /&gt;
Sintaxa pentru for este:&lt;br /&gt;
for VAR in lista_de_valori do instructiuni done&lt;br /&gt;
Se executa instructiunile specificate de atatea ori cate valori avem in lista. Pentru fiecare iteratie variabila VAR ia o valoare din lista_de_valori. Separatorul pentru valorile din lista este default spatiu sau valoarea variabilei globale IFS.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
1. Script care exemplifica ciclul de tip for prin trimiterea unui pachet ping la fiecare din cele 3 IP-uri.&lt;br /&gt;
&lt;br /&gt;
Instructiunile dintre do si done se executa de atatea ori cate valori avem in lista (3 valori).&lt;br /&gt;
&lt;br /&gt;
Pentru fiecare ciclu valoarea variabilei IP este o valoare din lista. Valorile din lista sunt separate prin spatiu.&lt;br /&gt;
 #!/bin/bash for IP in 192.168.0.1 192.168.0.2 192.168.0.3 do ping -c 1 $IP done&lt;br /&gt;
&lt;br /&gt;
2. Exemplu for modificand valoara variabilei IFS care este separatorul valorilor.&lt;br /&gt;
 #!/bin/bash #Acest script afiseaza fiecare director din $PATH pe cate un rand IFS=: for DIR in $PATH do echo $DIR done&lt;br /&gt;
&lt;br /&gt;
In Bash exista si structura de tip for ca in C/C++. Aceasta este insa mai putin folosita.&lt;br /&gt;
&lt;br /&gt;
 Exemplu&lt;br /&gt;
 for ca in C/C++:&lt;br /&gt;
 LIMIT=10 for((a=0;a&amp;lt;=$LIMIT;a++)) do echo $a done&lt;br /&gt;
&lt;br /&gt;
===While===&lt;br /&gt;
Structura de tip while se foloseste pentru a executa o serie de instructiuni (cele&lt;br /&gt;
dintre do si done) atata timp cat conditia de test este adevarata.&lt;br /&gt;
&lt;br /&gt;
while [ conditie_de_test ] do lista_de_instructiuni done&lt;br /&gt;
&lt;br /&gt;
Exemplu while:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 #script care afiseaza numerele intre 0 zi 100&lt;br /&gt;
 LIMIT=100&lt;br /&gt;
 i=0&lt;br /&gt;
 while [ $i –le $LIMIT ]&lt;br /&gt;
 do&lt;br /&gt;
 echo &amp;quot;i=$i&amp;quot;&lt;br /&gt;
 let i=i+1&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Case===&lt;br /&gt;
Structura de tip case se foloseste pentru a executa o serie de instructiuni in functie de diferite conditii de testare.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru case este:&lt;br /&gt;
&lt;br /&gt;
 case VARIABILA in&lt;br /&gt;
 valoare1)&lt;br /&gt;
 instructiuni1&lt;br /&gt;
 ;;&lt;br /&gt;
 valoare2)&lt;br /&gt;
 instructiuni&lt;br /&gt;
 ;;&lt;br /&gt;
 *)&lt;br /&gt;
 instructiuni_default&lt;br /&gt;
 ;;&lt;br /&gt;
 esac&lt;br /&gt;
 * -&amp;gt; reprezinta instructiunile ce se vor executa default daca variabila nu are niciuna dintre valorile de mai sus.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
 #!/bin/bash echo &amp;quot;Introdu nr:&amp;quot; read nr case $nr in 1) echo &amp;quot;nr este 1&amp;quot; ;; 2) echo &amp;quot;nr este2&amp;quot; ;; *) echo &amp;quot;nr are alta valoare&amp;quot; ;; esac&lt;br /&gt;
Structura de tip case poate fi oricand inlocuita cu o structura de tip if..elif..else&lt;br /&gt;
&lt;br /&gt;
Exemplul de mai sus folosind if..elif..else este:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 echo &amp;quot;Introdu nr:&amp;quot;&lt;br /&gt;
 read nr&lt;br /&gt;
 if [ $nr -eq 1 ]&lt;br /&gt;
 then echo &amp;quot;nr este 1&amp;quot;&lt;br /&gt;
 elif [ $nr -eq 2 ]&lt;br /&gt;
 then&lt;br /&gt;
 echo &amp;quot;nr este 2&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
 echo &amp;quot;nr este altceva&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Important&lt;br /&gt;
&lt;br /&gt;
Structura de tip case este foarte importanta si trebuie inteleasa bine. Toate&lt;br /&gt;
scripturile de initializare a serviciilor (cele din /etc/init.d ) folosesc o structura de tip case.&lt;br /&gt;
&lt;br /&gt;
Structura unui script de initializare din /etc/init.d este:&lt;br /&gt;
 case $1 in&lt;br /&gt;
 start) instructiuni de pornire serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 stop) instuctiuni de oprire serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 restart) instructiuni de restartare serviciu&lt;br /&gt;
 ;;&lt;br /&gt;
 *) afisare help script &lt;br /&gt;
 esac&lt;br /&gt;
&lt;br /&gt;
$1 reprezinta primul parametru al scriptului si poate fi start, stop sau restart.&lt;br /&gt;
&lt;br /&gt;
Exemplu: Pentru restartarea retelei se foloseste: /etc/init.d/network restart, unde network este scriptul de initializare iar restart primul parametru pe care-l primeste.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Presupunem ca am compilat si instalat serverul Apache in directorul /opt/apache.&lt;br /&gt;
Daemonul http se porneste ruland comanda: /opt/apache/bin/apachectl start, se opreste cu /opt/apache/bin/apachectl stop si se restarteaza cu /opt/apache/bin/apachectl restart. Se doreste pornirea serverului la butarea sistemului, mai exact la intrarea in runlevel 3.&lt;br /&gt;
&lt;br /&gt;
Etape:&lt;br /&gt;
1. Se creaza un script in /etc/init.d. Numele poate fi ales aleator, in exemplul nostru acesta se numeste init_apache&lt;br /&gt;
2. Se creaza un symlink catre /etc/init.d/init_apache in /etc/init.d/rc3.d numit S99Apache. Numele symlinkului este important sa inceapa cu litera S urmata de un umar intre 0 si 99.&lt;br /&gt;
&lt;br /&gt;
La intrarea in runlevel 3 se va rula automat acest script cu parametrul start.&lt;br /&gt;
Structura scriptului /etc/init.d/init_apache este:&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 case $1 in&lt;br /&gt;
 start)&lt;br /&gt;
 echo &amp;quot;Starting Apache...&amp;quot; /opt/apache/bin/apachectl start echo &amp;quot;OK&amp;quot;&lt;br /&gt;
 ;;&lt;br /&gt;
 stop) echo &amp;quot;Shutting down Apache...&amp;quot; /opt/apache/bin/apachectl stop echo &amp;quot;OK&amp;quot;&lt;br /&gt;
 ;;&lt;br /&gt;
 restart) $0 stop $0 start&lt;br /&gt;
 ;;&lt;br /&gt;
 *) echo &amp;quot;init_apache &amp;lt;start|stop|restart&amp;gt;&amp;quot;&lt;br /&gt;
 esac&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
Pentru detalii complete despre modul de pornire a serviciilor la butare cititi capitolul &amp;quot;Managementul Serviciilor&amp;quot; din cursul &amp;quot;Linux Basic Administration&amp;quot; disponibil de asemenea online.&lt;br /&gt;
&lt;br /&gt;
===Select===&lt;br /&gt;
Structura de tip select este specifica doar Bash-ului si se foloseste pentru crearea de meniuri.&lt;br /&gt;
&lt;br /&gt;
Sintaxa acesteia este:&lt;br /&gt;
 select MENUITEM in menu_list&lt;br /&gt;
 do&lt;br /&gt;
 lista_de_comenzi&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
Detalii:&lt;br /&gt;
- menu_list este lista de meniuri. Valorile din lista sunt separate prin spatiu;&lt;br /&gt;
- intre do si done sunt instruciunile ce se executa in functie de meniul ales;&lt;br /&gt;
- intre do si done avem acces la urmatoarele 2 variabile: MENUITEM care contine meniul&lt;br /&gt;
&lt;br /&gt;
selectat si REPLY care se creaza automat si contine inputul userului (ce a scris acesta la consola);&lt;br /&gt;
&lt;br /&gt;
- PS3 contine prompterul de selectare a meniurilor;&lt;br /&gt;
- userul alege un meniu din lista folosind un nr. de ordine: alege 1 pentru primul meniu, 2 pentru al doilea etc;&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 PS3=&amp;quot;Alege:&amp;quot;&lt;br /&gt;
 select ITEM in &amp;quot;Afiseaza continut /etc&amp;quot; &amp;quot;Afiseaza spatiu liber&amp;quot; &amp;quot;Exit&amp;quot;&lt;br /&gt;
 do&lt;br /&gt;
 case $REPLY in&lt;br /&gt;
 1) ls -l /etc&lt;br /&gt;
 ;;&lt;br /&gt;
 2) df -h&lt;br /&gt;
 ;;&lt;br /&gt;
 3) exit 0&lt;br /&gt;
 ;;&lt;br /&gt;
 *) echo &amp;quot;Optiune incorecta&amp;quot;&lt;br /&gt;
 esac&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
==1.6 Substituirea comenzilor==&lt;br /&gt;
Unei variabile i se poate asigna o valoare in 2 moduri:&lt;br /&gt;
1. Folosind NUME_VAR=valoare&lt;br /&gt;
&lt;br /&gt;
Exemplu: EDITOR=&amp;quot;VIM&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. Substituind o comanda cu outputul ei&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
 VAR=`ls /etc` -&amp;gt; in acest exemplu comanda ls /etc se substituie sau inlocuieste cu outputul ei care se asigneaza variabilei VAR. Variabila VAR va contine outputul comenzii ls -l.&lt;br /&gt;
Nota&lt;br /&gt;
Substituirea unei comenzi cu outputul ei reprezinta unul dintre caracteristicile cele mai puternice ale Bashului, iar majoritatea scripturilor folosesc acest mod de lucru.&lt;br /&gt;
&lt;br /&gt;
Pentru a substitui o comanda cu outputul ei exista 2 variante:&lt;br /&gt;
&lt;br /&gt;
1. Comanda sa incadreza in backquotes ( ``). Atentie, backquotes nu sunt apostroafe sau&lt;br /&gt;
ghilimele simple.&lt;br /&gt;
 Exemplu: ME= `whoiam ` -&amp;gt; variabila ME va contine outputul comenzii whoami&lt;br /&gt;
&lt;br /&gt;
2. Comanda se incadreza intre $( si )&lt;br /&gt;
 Exemplu: ETH0= $(ifconfig eth0) -&amp;gt; variabila numita ETH0 va contine outputul comenzii&lt;br /&gt;
 ifconfig eth0&lt;br /&gt;
 Exemplu script ce nu poate fi rulat de catre root&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 if [ &amp;quot;$(whoami)&amp;quot; = &amp;quot;root&amp;quot; ]&lt;br /&gt;
 then&lt;br /&gt;
 echo &amp;quot;Esti root, sorry !&amp;quot;&lt;br /&gt;
 exit 1;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
#incep instructiunile ce nu pot fi rulate de catre root&amp;quot;&lt;br /&gt;
 ls -la ~&lt;br /&gt;
&lt;br /&gt;
Nota&lt;br /&gt;
&lt;br /&gt;
In momentul in care o variabila de tip string este testat folosind un test pentru stringuri este bine ca aceasta sa fie incadrata intre ghilimele duble pentru a forta tipul ei catre string.&lt;br /&gt;
&lt;br /&gt;
Exemplu:&lt;br /&gt;
VAR=&amp;quot;`ifconfig eth0`&amp;quot; if [ -z &amp;quot;$VAR&amp;quot; ] then echo &amp;quot;Interfata eth0 nu exista!&amp;quot; fi&lt;br /&gt;
&lt;br /&gt;
Subshells&lt;br /&gt;
&lt;br /&gt;
Utilizarea subshell-urilor în Bash poate fi avantajoasă din mai multe motive, inclusiv:&lt;br /&gt;
&lt;br /&gt;
 1. Izolarea comenzilor: comenzile executate într -un subshell sunt izolate de cochilie părinte. Aceasta înseamnă că orice modificări aduse la variabile, directoare sau alte setări de mediu din subshell nu vor afecta shell-ul părinte.&lt;br /&gt;
&lt;br /&gt;
 2. Scoping: Variabilele definite într -un subshell au un domeniu local și nu vor afecta variabile cu același nume în shell-ul părinte.&lt;br /&gt;
&lt;br /&gt;
 3. Manevrarea erorilor: subshell -urile pot fi utilizate pentru o mai bună gestionare a erorilor. De exemplu, puteți executa o serie de comenzi într-un subshell și puteți verifica starea de returnare a acesteia fără a afecta fluxul principal al scriptului dvs.&lt;br /&gt;
&lt;br /&gt;
Iată câteva exemple de utilizare a subshell-urilor în Bash:&lt;br /&gt;
&lt;br /&gt;
Schimbarea directorului temporar:&lt;br /&gt;
&lt;br /&gt;
Aceasta schimbă temporar directorul în/calea/în/director, execută comanda LS, apoi se întoarce în directorul original. Schimbarea directorului afectează doar subshell-ul.&lt;br /&gt;
&lt;br /&gt;
-Execuție paralelă:&lt;br /&gt;
&lt;br /&gt;
Aceasta execută mai multe comenzi concomitent în subshell-uri, permițându-le să funcționeze în paralel.&lt;br /&gt;
&lt;br /&gt;
-Manevrarea erorilor:&lt;br /&gt;
&lt;br /&gt;
Aceasta execută comanda1 și comanda2 într -un subshell. Dacă Command1 sau Command2 eșuează (returnează un statut de ieșire non-zero), atunci este ecou „eroare”.&lt;br /&gt;
&lt;br /&gt;
-Setări temporare ale mediului:&lt;br /&gt;
&lt;br /&gt;
Aceasta stabilește o variabilă de mediu temporară la valoare pentru durata comenzii. Odată ce comanda se termină, variabila revine la valoarea sa anterioară (sau este nesetată dacă nu exista înainte).&lt;br /&gt;
&lt;br /&gt;
Subshell-urile sunt versatile și pot fi utilizate creativ pentru a atinge diverse obiective de script, menținând controlul asupra mediului și fluxului de execuție al comenzilor.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;In inchiderea cursului Linux Essentials:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La ce pot fi folosite parantezele ( ) in bash?&lt;br /&gt;
&lt;br /&gt;
Utilizari comune&lt;br /&gt;
    1. Substitutia comenzii:&lt;br /&gt;
        ◦ $(command) or `command`: Executa comanda si ii substituie iesirea.&lt;br /&gt;
        ◦ Example: echo $(date) or echo \date``&lt;br /&gt;
    2. Expansie aritmetica:&lt;br /&gt;
        ◦ (( expression )): Performa operatuni aritmetice si le evalueaza expresia.&lt;br /&gt;
        ◦ Example: (( x = 5 + 3 ))&lt;br /&gt;
    3. Crearea unui subshell:&lt;br /&gt;
        ◦ ( commands ): Execute comenzi intr-un subshell, izolandu-i mediul de cea principala.&lt;br /&gt;
        ◦ Example: (cd /path/to/directory &amp;amp;&amp;amp; ls)&lt;br /&gt;
    4. Declararea unei functii:&lt;br /&gt;
        ◦ function_name () { commands; }: Declara o functie.&lt;br /&gt;
    5. Gruparea comenzilor:&lt;br /&gt;
        ◦ { commands; }: Grupeaza mai multe comenzi impreuna, permitandu-le sa ruleze ca si o singura comanda.&lt;br /&gt;
        ◦ Example: { echo &amp;quot;Hello&amp;quot;; echo &amp;quot;World&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Essentials_Pagina_7|Pagina anterioară]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=541</id>
		<title>Instructor</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=541"/>
		<updated>2025-01-20T11:18:43Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Poziția Actuală și Colaborări */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Profil Profesional: Cristea Daniel Cătălin ==&lt;br /&gt;
&lt;br /&gt;
*Cu o diplomă de Formator autorizat și o experiență vastă în domeniul tehnologiei informației, &amp;lt;b&amp;gt;Cristea Daniel Cătălin&amp;lt;/b&amp;gt; și-a început cariera în IT în 1997 ca inginer automatist. Drumul său profesional l-a purtat treptat spre software și sisteme de operare, lucrând ca:&lt;br /&gt;
&lt;br /&gt;
* Inginer de sistem informatic&lt;br /&gt;
* Inginer de testare, atât manuală, cât și automată&lt;br /&gt;
* Devops AWS, OCI, VPS&lt;br /&gt;
&lt;br /&gt;
Începând din 2020, Cristea a colaborat cu &amp;lt;b&amp;gt;Oracle&amp;lt;/b&amp;gt; ca inginer de testare pentru distribuția &amp;lt;i&amp;gt;Oracle Linux&amp;lt;/i&amp;gt; și a contribuit la proiecte de tehnologie auto în &amp;lt;i&amp;gt;AWS Cloud&amp;lt;/i&amp;gt; ca inginer DevOps sub umbrela &amp;lt;b&amp;gt;Ericsson&amp;lt;/b&amp;gt;. Totodată, a desfășurat activități DevOps pentru o companie israeliană, gestionând infrastructuri IT complexe în cloud-ul Amazon.&lt;br /&gt;
&lt;br /&gt;
== Experiență în Predare ==&lt;br /&gt;
În cadrul Academiei Credis, parte a grupului &amp;lt;b&amp;gt;Bitnet&amp;lt;/b&amp;gt;, Cristea a avut o contribuție remarcabilă ca instructor, formând peste 100 de cursanți în Linux, atât la nivel de bază, cât și avansat.&lt;br /&gt;
&lt;br /&gt;
== Poziția Actuală și Colaborări ==&lt;br /&gt;
&lt;br /&gt;
În prezent, are functie de Linux Level 2 Support in cadrul companiei &amp;lt;b&amp;gt;GTS Telecom&amp;lt;/b&amp;gt;, administrează compania &amp;lt;b&amp;gt;WINSYS COMPUTERS SRL&amp;lt;/b&amp;gt; și colaborează cu &amp;lt;b&amp;gt;Nobleprog&amp;lt;/b&amp;gt; pentru a preda cursuri de Linux adaptate diferitelor nivele de pregătire și cerințe ale clienților.&lt;br /&gt;
&lt;br /&gt;
Pentru detalii suplimentare, profilul LinkedIn poate fi accesat aici [https://www.linkedin.com/in/dcc723/].&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=540</id>
		<title>Instructor</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=540"/>
		<updated>2025-01-20T11:18:08Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Poziția Actuală și Colaborări */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Profil Profesional: Cristea Daniel Cătălin ==&lt;br /&gt;
&lt;br /&gt;
*Cu o diplomă de Formator autorizat și o experiență vastă în domeniul tehnologiei informației, &amp;lt;b&amp;gt;Cristea Daniel Cătălin&amp;lt;/b&amp;gt; și-a început cariera în IT în 1997 ca inginer automatist. Drumul său profesional l-a purtat treptat spre software și sisteme de operare, lucrând ca:&lt;br /&gt;
&lt;br /&gt;
* Inginer de sistem informatic&lt;br /&gt;
* Inginer de testare, atât manuală, cât și automată&lt;br /&gt;
* Devops AWS, OCI, VPS&lt;br /&gt;
&lt;br /&gt;
Începând din 2020, Cristea a colaborat cu &amp;lt;b&amp;gt;Oracle&amp;lt;/b&amp;gt; ca inginer de testare pentru distribuția &amp;lt;i&amp;gt;Oracle Linux&amp;lt;/i&amp;gt; și a contribuit la proiecte de tehnologie auto în &amp;lt;i&amp;gt;AWS Cloud&amp;lt;/i&amp;gt; ca inginer DevOps sub umbrela &amp;lt;b&amp;gt;Ericsson&amp;lt;/b&amp;gt;. Totodată, a desfășurat activități DevOps pentru o companie israeliană, gestionând infrastructuri IT complexe în cloud-ul Amazon.&lt;br /&gt;
&lt;br /&gt;
== Experiență în Predare ==&lt;br /&gt;
În cadrul Academiei Credis, parte a grupului &amp;lt;b&amp;gt;Bitnet&amp;lt;/b&amp;gt;, Cristea a avut o contribuție remarcabilă ca instructor, formând peste 100 de cursanți în Linux, atât la nivel de bază, cât și avansat.&lt;br /&gt;
&lt;br /&gt;
== Poziția Actuală și Colaborări ==&lt;br /&gt;
&lt;br /&gt;
În prezent, are functie de Linux Level 2 Support in cadrul compniei GTS Telecom, administrează compania &amp;lt;b&amp;gt;WINSYS COMPUTERS SRL&amp;lt;/b&amp;gt; și colaborează cu &amp;lt;b&amp;gt;Nobleprog&amp;lt;/b&amp;gt; pentru a preda cursuri de Linux adaptate diferitelor nivele de pregătire și cerințe ale clienților.&lt;br /&gt;
&lt;br /&gt;
Pentru detalii suplimentare, profilul LinkedIn poate fi accesat aici [https://www.linkedin.com/in/dcc723/].&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=539</id>
		<title>Instructor</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Instructor&amp;diff=539"/>
		<updated>2024-11-21T08:18:57Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Poziția Actuală și Colaborări */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Profil Profesional: Cristea Daniel Cătălin ==&lt;br /&gt;
&lt;br /&gt;
*Cu o diplomă de Formator autorizat și o experiență vastă în domeniul tehnologiei informației, &amp;lt;b&amp;gt;Cristea Daniel Cătălin&amp;lt;/b&amp;gt; și-a început cariera în IT în 1997 ca inginer automatist. Drumul său profesional l-a purtat treptat spre software și sisteme de operare, lucrând ca:&lt;br /&gt;
&lt;br /&gt;
* Inginer de sistem informatic&lt;br /&gt;
* Inginer de testare, atât manuală, cât și automată&lt;br /&gt;
* Devops AWS, OCI, VPS&lt;br /&gt;
&lt;br /&gt;
Începând din 2020, Cristea a colaborat cu &amp;lt;b&amp;gt;Oracle&amp;lt;/b&amp;gt; ca inginer de testare pentru distribuția &amp;lt;i&amp;gt;Oracle Linux&amp;lt;/i&amp;gt; și a contribuit la proiecte de tehnologie auto în &amp;lt;i&amp;gt;AWS Cloud&amp;lt;/i&amp;gt; ca inginer DevOps sub umbrela &amp;lt;b&amp;gt;Ericsson&amp;lt;/b&amp;gt;. Totodată, a desfășurat activități DevOps pentru o companie israeliană, gestionând infrastructuri IT complexe în cloud-ul Amazon.&lt;br /&gt;
&lt;br /&gt;
== Experiență în Predare ==&lt;br /&gt;
În cadrul Academiei Credis, parte a grupului &amp;lt;b&amp;gt;Bitnet&amp;lt;/b&amp;gt;, Cristea a avut o contribuție remarcabilă ca instructor, formând peste 100 de cursanți în Linux, atât la nivel de bază, cât și avansat.&lt;br /&gt;
&lt;br /&gt;
== Poziția Actuală și Colaborări ==&lt;br /&gt;
&lt;br /&gt;
În prezent, administrează compania &amp;lt;b&amp;gt;WINSYS COMPUTERS SRL&amp;lt;/b&amp;gt; și colaborează cu &amp;lt;b&amp;gt;Nobleprog&amp;lt;/b&amp;gt; pentru a preda cursuri de Linux adaptate diferitelor nivele de pregătire și cerințe ale clienților.&lt;br /&gt;
&lt;br /&gt;
Pentru detalii suplimentare, profilul LinkedIn poate fi accesat aici [https://www.linkedin.com/in/dcc723/].&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_3&amp;diff=538</id>
		<title>Advanced Pagina 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_3&amp;diff=538"/>
		<updated>2024-11-21T08:14:13Z</updated>

		<summary type="html">&lt;p&gt;Admin: /* Servere Web (Apache, Nginx), cache server (SQUID) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Servere Web (Apache, Nginx), cache server (SQUID)==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Squid: Configurare Avansată pentru Scenarii Enterprise și Load Balancing==&lt;br /&gt;
Squid este un proxy puternic utilizat pentru cache și filtrarea traficului web, care poate fi configurat pentru scenarii complexe precum echilibrarea sarcinii (load balancing), utilizarea cache-ului distribuit, autentificarea utilizatorilor și controlul accesului în medii enterprise. Această pagină oferă exemple și explicații pentru configurări avansate ale Squid.&lt;br /&gt;
&lt;br /&gt;
1. Proxy cu Echilibrare de Sarcină (Load Balancing)&lt;br /&gt;
Echilibrarea traficului între mai multe servere backend poate optimiza performanța și crește fiabilitatea infrastructurii.&lt;br /&gt;
&lt;br /&gt;
Configurație de Bază:&lt;br /&gt;
 # Definește ACL pentru rețelele interne&lt;br /&gt;
 acl localnet src 192.168.1.0/24&lt;br /&gt;
 # Permite traficul doar din rețelele interne&lt;br /&gt;
 http_access allow localnet&lt;br /&gt;
 http_access deny all&lt;br /&gt;
 # Configurează backend-urile pentru distribuirea traficului&lt;br /&gt;
 cache_peer backend1.example.com parent 3128 0 no-query round-robin&lt;br /&gt;
 cache_peer backend2.example.com parent 3128 0 no-query round-robin&lt;br /&gt;
 cache_peer backend3.example.com parent 3128 0 no-query round-robin&lt;br /&gt;
 # Activează distribuirea round-robin&lt;br /&gt;
 balance_on_multiple_ips on&lt;br /&gt;
 # Port de ascultare&lt;br /&gt;
 http_port 3128&lt;br /&gt;
 # Setări adiționale&lt;br /&gt;
 cache_mem 256 MB&lt;br /&gt;
 maximum_object_size_in_memory 512 KB&lt;br /&gt;
&lt;br /&gt;
Explicație:&lt;br /&gt;
&lt;br /&gt;
cache_peer definește serverele backend utilizate pentru distribuirea traficului.&lt;br /&gt;
Metoda round-robin distribuie cererile în mod egal între servere.&lt;br /&gt;
&lt;br /&gt;
2. Cache Distribuit pentru Performanță&lt;br /&gt;
Cache-ul distribuit permite partajarea datelor stocate între mai multe servere Squid, crescând eficiența și reducând latența.&lt;br /&gt;
&lt;br /&gt;
Configurație de Bază:&lt;br /&gt;
 # Configurare servere cache distribuite&lt;br /&gt;
 cache_peer squid1.example.com sibling 3128 3130 proxy-only&lt;br /&gt;
 cache_peer squid2.example.com sibling 3128 3130 proxy-only&lt;br /&gt;
 # Activează protocolul ICP pentru sincronizare&lt;br /&gt;
 icp_port 3130&lt;br /&gt;
 # ACL pentru rețele interne&lt;br /&gt;
 acl localnet src 192.168.1.0/24&lt;br /&gt;
 http_access allow localnet&lt;br /&gt;
 http_access deny all&lt;br /&gt;
 # Configurare cache&lt;br /&gt;
 cache_dir ufs /var/spool/squid 1000 16 256&lt;br /&gt;
 cache_mem 512 MB&lt;br /&gt;
 maximum_object_size 10 MB&lt;br /&gt;
&lt;br /&gt;
Explicație:&lt;br /&gt;
&lt;br /&gt;
sibling indică faptul că serverele Squid vor partaja cache-ul fără a crea bucle de cereri.&lt;br /&gt;
Protocolul ICP coordonează schimbul de date între servere.&lt;br /&gt;
&lt;br /&gt;
3. Autentificare LDAP pentru Utilizatori&lt;br /&gt;
&lt;br /&gt;
În mediile enterprise, autentificarea bazată pe LDAP este esențială pentru a controla accesul la resurse.&lt;br /&gt;
&lt;br /&gt;
Configurație de Bază:&lt;br /&gt;
 # Configurare LDAP&lt;br /&gt;
 auth_param basic program /usr/lib/squid/basic_ldap_auth -b &amp;quot;dc=example,dc=com&amp;quot; -f &amp;quot;uid=%s&amp;quot; -h ldap.example.com&lt;br /&gt;
 auth_param basic children 5&lt;br /&gt;
 auth_param basic realm Company Proxy&lt;br /&gt;
 auth_param basic credentialsttl 2 hours&lt;br /&gt;
 # ACL pentru utilizatori autentificați&lt;br /&gt;
 acl authenticated proxy_auth REQUIRED&lt;br /&gt;
 http_access allow authenticated&lt;br /&gt;
 http_access deny all&lt;br /&gt;
 # Port de ascultare&lt;br /&gt;
 http_port 3128&lt;br /&gt;
&lt;br /&gt;
Explicație:&lt;br /&gt;
&lt;br /&gt;
basic_ldap_auth permite conectarea la un server LDAP pentru autentificare.&lt;br /&gt;
Numărul de copii ale procesului (children) ajută la procesarea mai multor cereri simultan.&lt;br /&gt;
&lt;br /&gt;
4. Controlul Lățimii de Bandă&lt;br /&gt;
&lt;br /&gt;
Controlul traficului în funcție de tipul de conținut sau de utilizatori este util pentru gestionarea resurselor.&lt;br /&gt;
&lt;br /&gt;
Configurație de Bază:&lt;br /&gt;
 # Definire ACL pentru site-uri video și ore de lucru&lt;br /&gt;
 acl video_sites dstdomain .youtube.com .vimeo.com&lt;br /&gt;
 acl office_hours time 08:00-18:00&lt;br /&gt;
 # Configurare pool pentru lățimea de bandă&lt;br /&gt;
 delay_pools 1&lt;br /&gt;
 delay_class 1 2&lt;br /&gt;
 delay_access 1 allow video_sites office_hours&lt;br /&gt;
 delay_access 1 deny all&lt;br /&gt;
 delay_parameters 1 64000/64000 16000/16000&lt;br /&gt;
 # Permite accesul general&lt;br /&gt;
 http_access allow all&lt;br /&gt;
&lt;br /&gt;
Explicație:&lt;br /&gt;
&lt;br /&gt;
delay_pools limitează viteza de descărcare pentru anumite site-uri în intervale de timp specificate.&lt;br /&gt;
Viteza maximă și minimă sunt definite în kilobiți pe secundă.&lt;br /&gt;
&lt;br /&gt;
5. Filtrare și Logare pentru Conformitate&lt;br /&gt;
&lt;br /&gt;
Squid poate filtra traficul și genera loguri detaliate pentru audit și respectarea politicilor de securitate.&lt;br /&gt;
&lt;br /&gt;
Configurație de Bază:&lt;br /&gt;
 # ACL pentru site-uri blocate&lt;br /&gt;
 acl blocked_sites dstdomain .facebook.com .twitter.com&lt;br /&gt;
 http_access deny blocked_sites&lt;br /&gt;
 # Salvarea logurilor&lt;br /&gt;
 access_log /var/log/squid/access.log squid&lt;br /&gt;
 # Configurare cache&lt;br /&gt;
 cache_replacement_policy heap LFUDA&lt;br /&gt;
 maximum_object_size 4 MB&lt;br /&gt;
 cache_dir ufs /var/spool/squid 2000 16 256&lt;br /&gt;
&lt;br /&gt;
Explicație:&lt;br /&gt;
&lt;br /&gt;
dstdomain permite blocarea domeniilor specifice.&lt;br /&gt;
&lt;br /&gt;
Logurile sunt salvate pentru a monitoriza activitatea utilizatorilor și traficul.&lt;br /&gt;
&lt;br /&gt;
Recomandări Generale&lt;br /&gt;
&lt;br /&gt;
Monitorizare: Integrați Squid cu instrumente precum Zabbix sau Grafana pentru monitorizarea performanței.&lt;br /&gt;
Optimizare: Ajustați parametrii de cache și politica de înlocuire a obiectelor pentru performanță maximă.&lt;br /&gt;
Securitate: Configurați interceptarea SSL doar dacă este legal și necesar în mediul dvs.&lt;br /&gt;
&lt;br /&gt;
Pentru scenarii specifice sau întrebări, consultați documentația oficială Squid.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Advanced_Pagina_2|Pagina anterioară]] | [[Advanced_Pagina_4|Următoarea pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_7&amp;diff=537</id>
		<title>Advanced Pagina 7</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_7&amp;diff=537"/>
		<updated>2024-11-13T09:24:03Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Firewall avansat==&lt;br /&gt;
&lt;br /&gt;
===nftables===&lt;br /&gt;
&lt;br /&gt;
Tabele: ip (implicit), arp, ip6, bridge, inet, netdev.&lt;br /&gt;
&lt;br /&gt;
Lanturi:&lt;br /&gt;
&lt;br /&gt;
  filter: Supported by arp, bridge, ip, ip6 and inet table families.&lt;br /&gt;
  route: Mark packets (like mangle for the output hook, for other hooks use the type filter instead), supported by ip and ip6.&lt;br /&gt;
  nat: In order to perform Network Address Translation, supported by ip and ip6.&lt;br /&gt;
&lt;br /&gt;
Hook: Se refera la stadiul acelui pachet in timp ce este procesat de kernel in Netfilter.&lt;br /&gt;
&lt;br /&gt;
  The hooks for ip, ip6 and inet families are: prerouting, input, forward, output, postrouting.&lt;br /&gt;
  The hooks for arp family are: input, output.&lt;br /&gt;
  The bridge family handles ethernet packets traversing bridge devices.&lt;br /&gt;
  The hooks for netdev are: ingress, egress.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 % nft (add | create) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; [ \{ type &amp;lt;type&amp;gt; hook &amp;lt;hook&amp;gt; [device &amp;lt;device&amp;gt;] priority &amp;lt;priority&amp;gt; \; [policy (accept | drop) \;] \} ]&lt;br /&gt;
 % nft (delete | list | flush) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt;&lt;br /&gt;
 % nft rename chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; &amp;lt;newname&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reguli: nft (add | insert | replace | displace) rule&lt;br /&gt;
&lt;br /&gt;
====Exemplu 1, imitare iptables====&lt;br /&gt;
&lt;br /&gt;
Exemplu de reguli nftables, de importat cu comanda nft -f. O parte din chain-uri imita iptables. Nota: unele distributii acum implementeaza propriile reguli, de recomandat folosita comanda &amp;quot;flush ruleset&amp;quot; inainte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
table inet filter {&lt;br /&gt;
        chain input {&lt;br /&gt;
                type filter hook input priority filter;&lt;br /&gt;
&lt;br /&gt;
                # Allow loopback (local connections)&lt;br /&gt;
                iifname lo accept&lt;br /&gt;
&lt;br /&gt;
                # Allow established/related&lt;br /&gt;
                ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
                # Allow incoming pings&lt;br /&gt;
                ip protocol icmp limit rate 1/second accept&lt;br /&gt;
&lt;br /&gt;
                # Allow SSH and HTTP&lt;br /&gt;
                tcp dport {ssh,http} accept&lt;br /&gt;
&lt;br /&gt;
                # Drop everything else&lt;br /&gt;
                drop&lt;br /&gt;
        }&lt;br /&gt;
        chain forward {&lt;br /&gt;
                type filter hook forward priority filter;&lt;br /&gt;
&lt;br /&gt;
                # Disallow forwarding&lt;br /&gt;
                drop&lt;br /&gt;
        }&lt;br /&gt;
        chain output {&lt;br /&gt;
                type filter hook output priority filter;&lt;br /&gt;
&lt;br /&gt;
                # Allow all outgoing traffic&lt;br /&gt;
                accept&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Exemplu 2, prioritati====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
table ip filter {&lt;br /&gt;
        # This chain is evaluated first due to priority&lt;br /&gt;
        chain services {&lt;br /&gt;
                type filter hook input priority 0; policy accept;&lt;br /&gt;
&lt;br /&gt;
                # If matched, this rule will prevent any further evaluation&lt;br /&gt;
                tcp dport http drop&lt;br /&gt;
&lt;br /&gt;
                # If matched, and despite the accept verdict, the packet proceeds to enter the chain below&lt;br /&gt;
                tcp dport ssh accept&lt;br /&gt;
&lt;br /&gt;
                # Likewise for any packets that get this far and hit the default policy&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # This chain is evaluated last due to priority&lt;br /&gt;
        chain input {&lt;br /&gt;
                type filter hook input priority 1; policy drop;&lt;br /&gt;
                # All ingress packets end up being dropped here!&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Exemplu 3, log====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
table inet firewall {&lt;br /&gt;
    chain inbound {                                                              &lt;br /&gt;
&lt;br /&gt;
        # By default, drop all traffic unless it meets a filter&lt;br /&gt;
        # criteria specified by the rules that follow below.&lt;br /&gt;
        type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
        # Allow traffic from established and related packets, drop invalid&lt;br /&gt;
        ct state vmap { established : accept, related : accept, invalid : drop } &lt;br /&gt;
&lt;br /&gt;
        # Allow loopback traffic.&lt;br /&gt;
        iifname lo accept&lt;br /&gt;
&lt;br /&gt;
        tcp dport { 22, 80, 443, 55291, 5900 } accept&lt;br /&gt;
                                                                                                                                                                                                                                                                                          &lt;br /&gt;
        # Uncomment to enable logging of denied inbound traffic                                                                                                                                                                                                                           &lt;br /&gt;
        log prefix &amp;quot;[nftables] Inbound Denied: &amp;quot; counter drop                                                                                                                                                                                                                             &lt;br /&gt;
    }                                                                                                                                                                                                                                                                                     &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operatii la nivel de ruleset====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Listarea&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Listing the complete ruleset:&lt;br /&gt;
&lt;br /&gt;
 % nft list ruleset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Listing the ruleset per family:&lt;br /&gt;
&lt;br /&gt;
 % nft list ruleset arp&lt;br /&gt;
 % nft list ruleset ip&lt;br /&gt;
 % nft list ruleset ip6&lt;br /&gt;
 % nft list ruleset bridge&lt;br /&gt;
 % nft list ruleset inet&lt;br /&gt;
&lt;br /&gt;
These commands will print all tables/chains/sets/rules of the given family.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Curatarea&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
In addition, you can also flush (erase, delete, wipe) the complete ruleset:&lt;br /&gt;
&lt;br /&gt;
 % nft flush ruleset&lt;br /&gt;
&lt;br /&gt;
Also per family:&lt;br /&gt;
&lt;br /&gt;
 % nft flush ruleset arp&lt;br /&gt;
 % nft flush ruleset ip&lt;br /&gt;
 % nft flush ruleset ip6&lt;br /&gt;
 % nft flush ruleset bridge&lt;br /&gt;
 % nft flush ruleset inet&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Backup/restaurare&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You can combine these two commands above to backup your ruleset, then load it atomically:&lt;br /&gt;
&lt;br /&gt;
 % echo &amp;quot;flush ruleset&amp;quot; &amp;gt; backup.nft&lt;br /&gt;
 % nft list ruleset &amp;gt;&amp;gt; backup.nft&lt;br /&gt;
 % nft -f backup.nft&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Listarea in format JSON&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
You can also export your ruleset in JSON format, just pass the&lt;br /&gt;
&#039;--json&#039; option:&lt;br /&gt;
&lt;br /&gt;
 % nft --json list ruleset &amp;gt; ruleset.json&lt;br /&gt;
&lt;br /&gt;
====Creare regula blocare ip-uri (nativa)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;&lt;br /&gt;
add table inet filter&lt;br /&gt;
add chain inet filter INPUT { type filter hook input priority 1 ; }&lt;br /&gt;
add set inet filter ipmaster { flags interval; type ipv4_addr; auto-merge; }&lt;br /&gt;
add set inet filter ipmaster6 { flags interval; type ipv6_addr; auto-merge; }&lt;br /&gt;
insert rule inet filter INPUT ip saddr @ipmaster counter drop&lt;br /&gt;
insert rule inet filter INPUT ip6 saddr @ipmaster6 counter drop&lt;br /&gt;
&#039; | nft -f -&lt;br /&gt;
ipv4_validate &amp;lt;lista_ip | awk &#039;{print &amp;quot;add element inet filter ipmaster { &amp;quot;$1&amp;quot; }&amp;quot;}&#039; | nft -f - # import ipv4&lt;br /&gt;
ipv6_validate &amp;lt;lista_ip | awk &#039;{print &amp;quot;add element inet filter ipmaster6 { &amp;quot;$1&amp;quot; }&amp;quot;}&#039; | nft -f - # import ipv6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
-&#039;&#039;functia ipv(4|6)_validate este un grep pe clase de ip-uri, nu este necesar pentru o lista simpla.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
-&#039;&#039;Numarul de reguli verificabil cu &amp;quot; nft list table inet filter | grep -oc &#039;,&#039; &amp;quot; &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
-&#039;&#039;Verificarea numarului de &amp;quot;hits&amp;quot; catre adresele blocate se poate face cu &amp;quot; ip(6)tables -vL &amp;quot; sau insumat cu:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 perl -E &#039;/packets (\d+)/ and $s += $1 for `nft list ruleset | grep ipmaster`; say $s&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Creare regula conectare vpn wireguard (nativa)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[ -n $wg_file ]] &amp;amp;&amp;amp; file=$wg_file || file=$opt_file; ! [[ -s $file ]] &amp;amp;&amp;amp; return 1; iname=$(basename -s .conf $file) address=$(grep &#039;^Address&#039; $file | ipv4_validate) address6=$(grep &#039;^Address&#039; $file | ipv6_validate)&lt;br /&gt;
ip link add $iname type wireguard || return 1; wg setconf $iname &amp;lt;(grep -E &#039;^\[Interface|^\[Peer|^PrivateKey|^PublicKey|^Endpoint|^AllowedIPs|^$&#039; $file) || return 1&lt;br /&gt;
ip -4 address add $address dev $iname; ip -6 address add $address6 dev $iname&lt;br /&gt;
grep &#039;^DNS&#039; $file | sed &#039;s/DNS =/nameserver/&#039; | resolvconf -a tun.&amp;quot;$iname&amp;quot; -m 0 -x&lt;br /&gt;
wg set $iname fwmark 51820&lt;br /&gt;
ip link set mtu 1420 up dev $iname&lt;br /&gt;
sysctl -q net.ipv4.conf.all.src_valid_mark=1&lt;br /&gt;
ip -4 route add 0.0.0.0/0 dev $iname table 51820; ip -6 route add ::/0 dev $iname table 51820&lt;br /&gt;
for cmd in &#039;ip -4&#039; &#039;ip -6&#039;; do $cmd rule add not fwmark 51820 table 51820; $cmd rule add table main suppress_prefixlength 0; done&lt;br /&gt;
echo &#039;&lt;br /&gt;
add table inet fw&lt;br /&gt;
add chain inet fw INPUT { type filter hook input priority 0 ; }&lt;br /&gt;
add chain inet fw preraw { type filter hook prerouting priority -300; }&lt;br /&gt;
add rule inet fw preraw iifname != &#039;$iname&#039; ip daddr &#039;$(cut -d/ -f1 &amp;lt;&amp;lt;&amp;lt;$address)&#039; fib saddr type != local drop&lt;br /&gt;
add rule inet fw preraw iifname != &#039;$iname&#039; ip6 daddr &#039;$(cut -d/ -f1 &amp;lt;&amp;lt;&amp;lt;$address6)&#039; fib saddr type != local drop&lt;br /&gt;
add chain inet fw premangle { type filter hook prerouting priority -150; }&lt;br /&gt;
add rule inet fw premangle meta l4proto udp meta mark set ct mark&lt;br /&gt;
add chain inet fw postmangle { type filter hook postrouting priority -150; }&lt;br /&gt;
add rule inet fw postmangle meta l4proto udp mark 51820 ct mark set mark&lt;br /&gt;
&#039; | nft -f - &amp;amp;&amp;amp; echo $iname connected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===iptables===&lt;br /&gt;
&lt;br /&gt;
Regulile se pot incarca cu comanda iptables-restore sau se pot salva in /etc/sysconfig/iptables&lt;br /&gt;
&lt;br /&gt;
====Exemplu 1====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# iptables-save &amp;gt; /dev/stdout&lt;br /&gt;
# Warning: iptables-legacy tables present, use iptables-legacy-save to see them&lt;br /&gt;
# iptables-legacy-save &amp;gt; /dev/stdout&lt;br /&gt;
# Generated by iptables-save v1.8.9 on Mon Nov 11 14:43:17 2024&lt;br /&gt;
*mangle&lt;br /&gt;
:PREROUTING ACCEPT [192:15752]&lt;br /&gt;
:INPUT ACCEPT [192:15752]&lt;br /&gt;
:FORWARD ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [192:15752]&lt;br /&gt;
:POSTROUTING ACCEPT [192:15752]&lt;br /&gt;
COMMIT&lt;br /&gt;
# Completed on Mon Nov 11 14:43:17 2024&lt;br /&gt;
# Generated by iptables-save v1.8.9 on Mon Nov 11 14:43:17 2024&lt;br /&gt;
*nat&lt;br /&gt;
:PREROUTING ACCEPT [0:0]&lt;br /&gt;
:INPUT ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [50:3402]&lt;br /&gt;
:POSTROUTING ACCEPT [50:3402]&lt;br /&gt;
COMMIT&lt;br /&gt;
# Completed on Mon Nov 11 14:43:17 2024&lt;br /&gt;
# Generated by iptables-save v1.8.9 on Mon Nov 11 14:43:17 2024&lt;br /&gt;
*filter&lt;br /&gt;
:INPUT DROP [0:0]&lt;br /&gt;
:FORWARD DROP [0:0]&lt;br /&gt;
:OUTPUT DROP [0:0]&lt;br /&gt;
:bad_packets - [0:0]&lt;br /&gt;
:bad_tcp_packets - [0:0]&lt;br /&gt;
:icmp_packets - [0:0]&lt;br /&gt;
:tcp_inbound - [0:0]&lt;br /&gt;
:tcp_outbound - [0:0]&lt;br /&gt;
:udp_inbound - [0:0]&lt;br /&gt;
:udp_outbound - [0:0]&lt;br /&gt;
-A INPUT -i lo -j ACCEPT&lt;br /&gt;
-A INPUT -j bad_packets&lt;br /&gt;
-A INPUT -d 224.0.0.1/32 -j DROP&lt;br /&gt;
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
-A INPUT -p tcp -j tcp_inbound&lt;br /&gt;
-A INPUT -p udp -j udp_inbound&lt;br /&gt;
-A INPUT -p icmp -j icmp_packets&lt;br /&gt;
-A INPUT -m pkttype --pkt-type broadcast -j DROP&lt;br /&gt;
-A INPUT -m limit --limit 3/min --limit-burst 3 -j LOG --log-prefix &amp;quot;INPUT packet died: &amp;quot;&lt;br /&gt;
-A OUTPUT -p icmp -m conntrack --ctstate INVALID -j DROP&lt;br /&gt;
-A OUTPUT -s 127.0.0.1/32 -j ACCEPT&lt;br /&gt;
-A OUTPUT -o lo -j ACCEPT&lt;br /&gt;
-A OUTPUT -j ACCEPT&lt;br /&gt;
-A OUTPUT -m limit --limit 3/min --limit-burst 3 -j LOG --log-prefix &amp;quot;OUTPUT packet died: &amp;quot;&lt;br /&gt;
-A bad_packets -m conntrack --ctstate INVALID -j LOG --log-prefix &amp;quot;Invalid packet: &amp;quot;&lt;br /&gt;
-A bad_packets -m conntrack --ctstate INVALID -j DROP&lt;br /&gt;
-A bad_packets -p tcp -j bad_tcp_packets&lt;br /&gt;
-A bad_packets -j RETURN&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j LOG --log-prefix &amp;quot;New not syn: &amp;quot;&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j DROP&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j LOG --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j LOG --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j LOG --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j LOG --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j DROP&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j LOG --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j LOG --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP&lt;br /&gt;
-A bad_tcp_packets -p tcp -j RETURN&lt;br /&gt;
-A icmp_packets -p icmp -f -j LOG --log-prefix &amp;quot;ICMP Fragment: &amp;quot;&lt;br /&gt;
-A icmp_packets -p icmp -f -j DROP&lt;br /&gt;
-A icmp_packets -p icmp -m icmp --icmp-type 8 -j DROP&lt;br /&gt;
-A icmp_packets -p icmp -m icmp --icmp-type 11 -j ACCEPT&lt;br /&gt;
-A icmp_packets -p icmp -j RETURN&lt;br /&gt;
-A tcp_inbound -p tcp -m tcp --dport 21 -j ACCEPT&lt;br /&gt;
-A tcp_inbound -p tcp -m tcp --sport 20 -j ACCEPT&lt;br /&gt;
-A tcp_inbound -p tcp -m tcp --dport 22 -j ACCEPT&lt;br /&gt;
-A tcp_inbound -p tcp -m tcp --dport 631 -j ACCEPT&lt;br /&gt;
-A tcp_inbound -p tcp -j RETURN&lt;br /&gt;
-A tcp_outbound -p tcp -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --sport 67 --dport 68 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --dport 631 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --sport 68 --dport 67 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --sport 67 --dport 68 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --dport 111 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --dport 9400 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --dport 2049 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --dport 9401 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --dport 9402 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --dport 9403 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -j RETURN&lt;br /&gt;
-A udp_outbound -p udp -j ACCEPT&lt;br /&gt;
COMMIT&lt;br /&gt;
# Completed on Mon Nov 11 14:43:17 2024&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ceea ce se traduce in:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
iptables -L&lt;br /&gt;
Chain INPUT (policy DROP)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
ACCEPT     all  --  anywhere             anywhere            &lt;br /&gt;
bad_packets  all  --  anywhere             anywhere            &lt;br /&gt;
DROP       all  --  anywhere             224.0.0.1           &lt;br /&gt;
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED&lt;br /&gt;
tcp_inbound  tcp  --  anywhere             anywhere            &lt;br /&gt;
udp_inbound  udp  --  anywhere             anywhere            &lt;br /&gt;
icmp_packets  icmp --  anywhere             anywhere            &lt;br /&gt;
DROP       all  --  anywhere             anywhere             PKTTYPE = broadcast&lt;br /&gt;
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 3 LOG level warn prefix &amp;quot;INPUT packet died: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
Chain FORWARD (policy DROP)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy DROP)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
DROP       icmp --  anywhere             anywhere             ctstate INVALID&lt;br /&gt;
ACCEPT     all  --  localhost            anywhere            &lt;br /&gt;
ACCEPT     all  --  anywhere             anywhere            &lt;br /&gt;
ACCEPT     all  --  anywhere             anywhere            &lt;br /&gt;
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 3 LOG level warn prefix &amp;quot;OUTPUT packet died: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
Chain bad_packets (1 references)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
LOG        all  --  anywhere             anywhere             ctstate INVALID LOG level warn prefix &amp;quot;Invalid packet: &amp;quot;&lt;br /&gt;
DROP       all  --  anywhere             anywhere             ctstate INVALID&lt;br /&gt;
bad_tcp_packets  tcp  --  anywhere             anywhere            &lt;br /&gt;
RETURN     all  --  anywhere             anywhere            &lt;br /&gt;
&lt;br /&gt;
Chain bad_tcp_packets (1 references)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
LOG        tcp  --  anywhere             anywhere             tcp flags:!FIN,SYN,RST,ACK/SYN ctstate NEW LOG level warn prefix &amp;quot;New not syn: &amp;quot;&lt;br /&gt;
DROP       tcp  --  anywhere             anywhere             tcp flags:!FIN,SYN,RST,ACK/SYN ctstate NEW&lt;br /&gt;
LOG        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/NONE LOG level warn prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
DROP       tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/NONE&lt;br /&gt;
LOG        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG LOG level warn prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
DROP       tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG&lt;br /&gt;
LOG        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,PSH,URG LOG level warn prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
DROP       tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,PSH,URG&lt;br /&gt;
LOG        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,ACK,URG LOG level warn prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
DROP       tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,ACK,URG&lt;br /&gt;
LOG        tcp  --  anywhere             anywhere             tcp flags:SYN,RST/SYN,RST LOG level warn prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
DROP       tcp  --  anywhere             anywhere             tcp flags:SYN,RST/SYN,RST&lt;br /&gt;
LOG        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN/FIN,SYN LOG level warn prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
DROP       tcp  --  anywhere             anywhere             tcp flags:FIN,SYN/FIN,SYN&lt;br /&gt;
RETURN     tcp  --  anywhere             anywhere            &lt;br /&gt;
&lt;br /&gt;
Chain icmp_packets (1 references)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
LOG        icmp -f  anywhere             anywhere             LOG level warn prefix &amp;quot;ICMP Fragment: &amp;quot;&lt;br /&gt;
DROP       icmp -f  anywhere             anywhere            &lt;br /&gt;
DROP       icmp --  anywhere             anywhere             icmp echo-request&lt;br /&gt;
ACCEPT     icmp --  anywhere             anywhere             icmp time-exceeded&lt;br /&gt;
RETURN     icmp --  anywhere             anywhere            &lt;br /&gt;
&lt;br /&gt;
Chain tcp_inbound (1 references)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ftp&lt;br /&gt;
ACCEPT     tcp  --  anywhere             anywhere             tcp spt:ftp-data&lt;br /&gt;
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh&lt;br /&gt;
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ipp&lt;br /&gt;
RETURN     tcp  --  anywhere             anywhere            &lt;br /&gt;
&lt;br /&gt;
Chain tcp_outbound (0 references)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
ACCEPT     tcp  --  anywhere             anywhere            &lt;br /&gt;
&lt;br /&gt;
Chain udp_inbound (1 references)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp spt:bootps dpt:bootpc&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp dpt:ipp&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp spt:bootpc dpt:bootps&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp spt:bootps dpt:bootpc&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp dpt:sunrpc&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp dpt:9400&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp dpt:nfs&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp dpt:9401&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp dpt:9402&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp dpt:9403&lt;br /&gt;
RETURN     udp  --  anywhere             anywhere            &lt;br /&gt;
&lt;br /&gt;
Chain udp_outbound (0 references)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Exemplu 2====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*filter&lt;br /&gt;
# Allow all outgoing, but drop incoming and forwarding packets by default&lt;br /&gt;
:INPUT DROP [0:0]&lt;br /&gt;
:FORWARD DROP [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [0:0]&lt;br /&gt;
&lt;br /&gt;
# Custom per-protocol chains&lt;br /&gt;
:UDP - [0:0]&lt;br /&gt;
:TCP - [0:0]&lt;br /&gt;
:ICMP - [0:0]&lt;br /&gt;
&lt;br /&gt;
# Acceptable UDP traffic&lt;br /&gt;
&lt;br /&gt;
# Acceptable TCP traffic&lt;br /&gt;
-A TCP -p tcp --dport 22 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Acceptable ICMP traffic&lt;br /&gt;
&lt;br /&gt;
# Boilerplate acceptance policy&lt;br /&gt;
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT&lt;br /&gt;
-A INPUT -i lo -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Drop invalid packets&lt;br /&gt;
-A INPUT -m conntrack --ctstate INVALID -j DROP&lt;br /&gt;
&lt;br /&gt;
# Pass traffic to protocol-specific chains&lt;br /&gt;
## Only allow new connections (established and related should already be handled)&lt;br /&gt;
## For TCP, additionally only allow new SYN packets since that is the only valid&lt;br /&gt;
## method for establishing a new TCP connection&lt;br /&gt;
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP&lt;br /&gt;
-A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP&lt;br /&gt;
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP&lt;br /&gt;
&lt;br /&gt;
# Reject anything that&#039;s fallen through to this point&lt;br /&gt;
## Try to be protocol-specific w/ rejection message&lt;br /&gt;
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A INPUT -p tcp -j REJECT --reject-with tcp-reset&lt;br /&gt;
-A INPUT -j REJECT --reject-with icmp-proto-unreachable&lt;br /&gt;
&lt;br /&gt;
# Commit the changes&lt;br /&gt;
COMMIT&lt;br /&gt;
&lt;br /&gt;
*raw&lt;br /&gt;
:PREROUTING ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [0:0]&lt;br /&gt;
COMMIT&lt;br /&gt;
&lt;br /&gt;
*nat&lt;br /&gt;
:PREROUTING ACCEPT [0:0]&lt;br /&gt;
:INPUT ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [0:0]&lt;br /&gt;
:POSTROUTING ACCEPT [0:0]&lt;br /&gt;
COMMIT&lt;br /&gt;
&lt;br /&gt;
*security&lt;br /&gt;
:INPUT ACCEPT [0:0]&lt;br /&gt;
:FORWARD ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [0:0]&lt;br /&gt;
COMMIT&lt;br /&gt;
&lt;br /&gt;
*mangle&lt;br /&gt;
:PREROUTING ACCEPT [0:0]&lt;br /&gt;
:INPUT ACCEPT [0:0]&lt;br /&gt;
:FORWARD ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [0:0]&lt;br /&gt;
:POSTROUTING ACCEPT [0:0]&lt;br /&gt;
COMMIT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Creare regula blocare ip-uri (folosind ipset)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ipv4_validate &amp;lt;lista_ip | awk &#039;NR==1{print &amp;quot;create ipmaster hash:net family inet hashsize 100000 maxelem 100000&amp;quot;}&#039;&#039;{print &amp;quot;add ipmaster &amp;quot;$1}&#039; | ipset restore -!&lt;br /&gt;
iptables -I INPUT -m set --match-set ipmaster src -j DROP # import ipv4&lt;br /&gt;
ipv6_validate &amp;lt;lista_ip | awk &#039;NR==1{print &amp;quot;create ipmaster6 hash:net family inet6 hashsize 500000 maxelem 500000&amp;quot;}&#039;&#039;{print &amp;quot;add ipmaster6 &amp;quot;$1}&#039; | ipset restore -!&lt;br /&gt;
ip6tables -I INPUT -m set --match-set ipmaster6 src -j DROP # import ipv6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
-&#039;&#039;functia ipv(4|6)_validate este un grep pe clase de ip-uri, nu este necesar pentru o lista simpla.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
-&#039;&#039;Numarul de reguli verificabil cu &amp;quot; ipset list -t &amp;quot; sau insumat cu:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 perl -E &#039;/Number of entries: (\d+)/ and $s += $1 for `ipset list -t`; say $s&#039;&lt;br /&gt;
&lt;br /&gt;
-&#039;&#039;Verificarea numarului de &amp;quot;hits&amp;quot; catre adresele blocate se poate face cu &amp;quot; ip(6)tables -vL &amp;quot; sau insumat cu:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 perl -E &amp;quot;say $(iptables -vL | awk &#039;NR==3{print $1}&#039;) + $(ip6tables -vL | awk &#039;NR==3{print $1}&#039;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Advanced_Pagina_6|Pagina anterioară]] | [[Advanced_Pagina_8|Următoarea pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_8&amp;diff=536</id>
		<title>Advanced Pagina 8</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_8&amp;diff=536"/>
		<updated>2024-11-13T09:20:15Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Compilare kernel==&lt;br /&gt;
&lt;br /&gt;
S-ar putea să vă interesați să compilați singur nucleul Linux, din mai multe motive. S-ar putea să fie, dar nu limitat la, una dintre următoarele:&lt;br /&gt;
&lt;br /&gt;
-Încercarea unui nucleu mai nou decât ceea ce oferă distribuția Linux&lt;br /&gt;
&lt;br /&gt;
-Construirea unui kernel cu un set diferit de opțiuni de configurare și/sau drivere&lt;br /&gt;
&lt;br /&gt;
-Curiozitatea unui elev :)&lt;br /&gt;
&lt;br /&gt;
Acest ghid vă va arăta cum puteți compila singur nucleul Linux, cu comenzile pe care ar trebui să le rulați, de ce să rulați aceste comenzi și să explicați ce face.&lt;br /&gt;
&lt;br /&gt;
Distribuțiile precum Ubuntu au modalități mai ușoare de a instala kernel-ul. Dar acest tutorial este despre a face lucrurile manual de la codul sursă. Veți avea nevoie de timp, răbdare și experiență bună cu linia de comandă Linux pentru acest tutorial. Este vorba mai mult despre a experimenta lucrurile la prima mână. Cu toate acestea, vă sfătuiesc să încercați această aventură într-un VM sau pe sistemul dvs. de rezervă în loc să o faceți pe sistemul dvs. principal.&lt;br /&gt;
Pre-requisite-uri&lt;br /&gt;
&lt;br /&gt;
Există două condiții prealabile pentru a construi orice (în context cu software-ul).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Codul sursă&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Dependențele pentru build&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Deci, ca premise, vom descărca sursa kernel-ului Linux și vom instala câteva dependențe care ne vor permite să il compilam.&lt;br /&gt;
&lt;br /&gt;
===Variante===&lt;br /&gt;
&lt;br /&gt;
Există in principal 4 &amp;quot;variante&amp;quot; ale Linux, dupa ordinea fluxului de dezvoltare:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;linux-next:&#039;&#039;&#039; Orice cod care urmează să fie fuzionat în baza de cod Linux este mai întâi îmbinat în linux-next- Arbore. Aceasta este cea mai nouă, dar și cea mai &amp;quot;centr stabilă&amp;quot; stare de nucleu Linux. Majoritatea dezvoltatorilor și testerii de nucleu Linux folosesc acest lucru pentru a rafina calitatea codului pentru ca Linus să tragă, mai târziu.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;linux-mainline.&#039;&#039;&#039; Versiunea beta a acestei versiuni se numește o versiune RC (Release Candidate). Odată ce un RC este eliberat, Linus acceptă numai bug-fixes și patch-uri legate de regresie a performanței. Linus continuă să elibereze un kernel RC în fiecare săptămână până când este mulțumit de cod (cu feedback de la utilizatori). linux-rc, urmat de un număr, este adăugat pentru a indica versiunea de lansare RC.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Release-uri stabile:&#039;&#039;&#039; Odată ce Linus simte că ultimul RC a fost stabil, el lansează eliberarea finală, &amp;quot;publică&amp;quot;. O eliberare stabilă este menținută pentru încă câteva săptămâni. Iată ce folosesc distribuțiile Linux cu margini sângerânde, cum ar fi Arch Linux și Fedora Linux. Vă recomand să încercați mai întâi acest lucru linux-nextsau orice RC eliberează.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Release-uri LTS:&#039;&#039;&#039; Ultima lansare stabilă a unui anumit an este menținută pentru încă câțiva ani. Aceasta este, de obicei, o versiune mai veche, dar este menținută în mod activ cu remedieri de securitate. O versiune stabilă a Debian utilizează lansarea LTS a nucleului Linux.&lt;br /&gt;
&lt;br /&gt;
===Pregătirea sistemului===&lt;br /&gt;
&lt;br /&gt;
Deoarece nucleul Linux este scris în limbajul de programare C, aveți nevoie de cel puțin un compilator C pentru a compila nucleul Linux. Există și alte astfel de dependențe care ar putea fi sau nu prezente pe computer.&lt;br /&gt;
&lt;br /&gt;
Acest ghid se va concentra pe compilarea kernel-ului Linux folosind GNU C Compiler (GCC). Dar poate într-un articol viitor (scufundându-mă în sprijinul Rust), voi acoperi folosind compilatorul Clang al LLVM ca alternativă la CCG.&lt;br /&gt;
&lt;br /&gt;
Comanda pentru Debian și derivații săi (Ubuntu):&lt;br /&gt;
&lt;br /&gt;
 sudo apt install bc binutils bison dwarves flex gcc git gnupg2 gzip libelf-dev libncurses5-dev libssl-dev make openssl pahole perl-base rsync tar xz-utils&lt;br /&gt;
&lt;br /&gt;
Comanda pentru Fedora și derivatele sale:&lt;br /&gt;
&lt;br /&gt;
 sudo dnf install binutils ncurses-devel /usr/include/{libelf.h,openssl/pkcs7.h} /usr/bin/{bc,bison,flex,gcc,git,gpg2,gzip,make,openssl,pahole,perl,rsync,tar,xz,zstd}&lt;br /&gt;
&lt;br /&gt;
===Descarcare kernel Linux===&lt;br /&gt;
&lt;br /&gt;
Mergeți la kernel.org și pe pagină, găsiți prima versiune stabilă.&lt;br /&gt;
Puteți descărca marca de marcare făcând clic pe caseta galbenă mare. În timp ce vă bazați, descărcați și fișierul de semnătură PGP care se potrivește. Va fi la îndemână când vom verifica tarball într-un moment ulterior. Are extensia .tar.sign.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Verificarea autenticității tarballului&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Cum îți dai seama dacă taball-ul pe care tocmai l-ai descărcat este corupt sau nu? La nivel individual, un .tar corupt vă va irosi doar ceva timp, dar dacă acest lucru se face pentru o organizație, s-ar putea să faca lucrurile mai ușoare pentru un atacator.&lt;br /&gt;
&lt;br /&gt;
Pentru a verifica integritatea tarball-ului, prima data se va folosi unxz (alias pentru xz --decompress) pentru a decomprima .tar.xz in dosar.&lt;br /&gt;
&lt;br /&gt;
 unxz --keep linux-*.tar.xz&lt;br /&gt;
&lt;br /&gt;
Odată extrase, vom aduce cheile publice GPG pe care le folosesc Linus Torvalds și Greg KH. Aceste taste sunt folosite pentru a semna tar-ul.&lt;br /&gt;
&lt;br /&gt;
 gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org&lt;br /&gt;
&lt;br /&gt;
Ar trebui să obțineți ieșire care este similară cu ceea ce am primit pe mașina mea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org&lt;br /&gt;
gpg: /home/pratham/.gnupg/trustdb.gpg: trustdb created&lt;br /&gt;
gpg: key 38DBBDC86092693E: public key &amp;quot;Greg Kroah-Hartman &amp;lt;gregkh@kernel.org&amp;gt;&amp;quot; imported&lt;br /&gt;
gpg: Total number processed: 1&lt;br /&gt;
gpg:               imported: 1&lt;br /&gt;
gpg: key 79BE3E4300411886: public key &amp;quot;Linus Torvalds &amp;lt;torvalds@kernel.org&amp;gt;&amp;quot; imported&lt;br /&gt;
gpg: Total number processed: 1&lt;br /&gt;
gpg:               imported: 1&lt;br /&gt;
pub   rsa4096 2011-09-23 [SC]&lt;br /&gt;
      647F28654894E3BD457199BE38DBBDC86092693E&lt;br /&gt;
uid           [ unknown] Greg Kroah-Hartman &amp;lt;gregkh@kernel.org&amp;gt;&lt;br /&gt;
sub   rsa4096 2011-09-23 [E]&lt;br /&gt;
&lt;br /&gt;
pub   rsa2048 2011-09-20 [SC]&lt;br /&gt;
      ABAF11C65A2970B130ABE3C479BE3E4300411886&lt;br /&gt;
uid           [ unknown] Linus Torvalds &amp;lt;torvalds@kernel.org&amp;gt;&lt;br /&gt;
sub   rsa2048 2011-09-20 [E]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odată ce cheile lui Greg și Linus sunt importate, integritatea gudronului poate fi verificată folosind --verify; cum ar fi:&lt;br /&gt;
&lt;br /&gt;
 gpg2 --verify linux-*.tar.sign&lt;br /&gt;
&lt;br /&gt;
Dacă verificarea a avut succes, ar trebui să obțineți o producție similară cu următoarea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ gpg2 --verify linux-*.tar.sign&lt;br /&gt;
gpg: assuming signed data in &#039;linux-6.5.5.tar&#039;&lt;br /&gt;
gpg: Signature made Saturday 23 September 2023 02:46:13 PM IST&lt;br /&gt;
gpg:                using RSA key 647F28654894E3BD457199BE38DBBDC86092693E&lt;br /&gt;
gpg: Good signature from &amp;quot;Greg Kroah-Hartman &amp;lt;gregkh@kernel.org&amp;gt;&amp;quot; [unknown]&lt;br /&gt;
gpg: WARNING: This key is not certified with a trusted signature!&lt;br /&gt;
gpg:          There is no indication that the signature belongs to the owner.&lt;br /&gt;
Primary key fingerprint: 647F 2865 4894 E3BD 4571  99BE 38DB BDC8 6092 693E&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nota: Vă rugăm să nu continuați decât dacă vedeți un mesaj care spune gpg: Good signature!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Puteți ignora cu siguranță avertismentul care spune: AVERTISMENT: Această cheie nu este certificată cu o semnătură de încredere! Nu există niciun indiciu că semnătura aparține proprietarului.&lt;br /&gt;
&lt;br /&gt;
Am adus cheile de la e-mailurile lui Linus şi Greg şi nu am nevoie să ne facem griji pentru acest avertisment.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Extragerea tarball-ului&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dacă sunteți aici, înseamnă că verificarea integrității dvs. a fost finalizată cu succes. Acum, atunci, este timpul să extragem sursa kernel-ului Linux din ea.&lt;br /&gt;
&lt;br /&gt;
 tar -xf linux-*.tar&lt;br /&gt;
&lt;br /&gt;
===Compilare===&lt;br /&gt;
&lt;br /&gt;
Procesul de construcție al kernel-ului Linux caută un dosar .config. După cum sugerează și numele, este un fișier de configurare care specifică fiecare opțiune de configurare posibilă pentru nucleul Linux. Este necesar să avem unul.&lt;br /&gt;
&lt;br /&gt;
Există două metode de a obține acest dosarul .config pentru nucleul Linux:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Utilizarea configurației distribuției Linux ca bază (recomandat)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Folosind o configurație implicită, generică&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Există o a treia metodă în care puteți configura fiecare opțiune, de la zero, cu 12.000+ opțiuni. Acest lucru nu este recomandat deoarece este nevoie de mult timp pentru a configura totul cu mâna și, de asemenea, suficient know-how pentru a ști ce să activeze și să dezactivați.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utilizarea configurației furnizate de distribuție&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Utilizarea configurației furnizate de distribuția Linux este un pariu sigur. Dacă urmați acest ghid doar pentru a încerca un nou nucleu decât ceea ce oferă distribuția dvs., aceasta este metoda recomandată.&lt;br /&gt;
&lt;br /&gt;
Fișierul de configurare al distribuției Linux pentru kernel va fi în oricare dintre cele două locuri:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Cele mai multe distribuții Linux, cum ar fi Debian și Fedora, și derivatele lor o vor stoca ca /boot/config-$(uname -r).&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Unele distribuții Linux, cum ar fi Arch Linux, îl au integrat în nucleul Linux în sine. Prin urmare, va fi disponibil la /proc/config.gz.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dacă aveți ambele destinații disponibile, preferați să utilizați /proc/config.gz așa cum este pe un sistem de fișiere numai citit și, prin urmare, nemodonat.&lt;br /&gt;
&lt;br /&gt;
Intră în directorul care conține tarballul extras.&lt;br /&gt;
&lt;br /&gt;
 cd linux-*/&lt;br /&gt;
&lt;br /&gt;
Apoi, copiați fișierul de configurare al distribuției Linux:&lt;br /&gt;
&lt;br /&gt;
 ## Debian and Fedora&#039;s derivatives:&lt;br /&gt;
 $ cp /boot/config-&amp;quot;$(uname -r)&amp;quot; .config&lt;br /&gt;
&lt;br /&gt;
 ## Arch Linux and its derivatives:&lt;br /&gt;
 $ zcat /proc/config.gz &amp;gt; .config&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Actualizarea configurației&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Odată ce acest lucru este făcut, este timpul să &amp;quot;actualizați&amp;quot; fișierul de configurare. Vezi tu, există o mare probabilitate ca configurația pe care o oferă distribuția dvs. să fie mai veche decât nucleul Linux pe care îl construiți.&lt;br /&gt;
&lt;br /&gt;
Acest lucru se aplică distribuțiilor Linux cu update continuu, cum ar fi Arch Linux și Fedora. Niciuna dintre ele nu a lansat o actualizare doar pentru că există o nouă versiune disponibilă. Ei fac niște QA, care este obligat să ia timp. Și, prin urmare, chiar și cel mai recent sâmbure oferit de distribuția dvs. va fi câteva lansări minore în urmă, în comparație cu ceea ce veți obține de la kernel.org.&lt;br /&gt;
&lt;br /&gt;
Pentru a actualiza un existent .config, comanda make este folosită cu ținta olddefconfig.&lt;br /&gt;
&lt;br /&gt;
Acest lucru va lua &amp;quot;fiserul vechi de configurare&amp;quot; (care este salvat în prezent ca .config ca o copie literală a configurației distribuției dvs.) și verificați pentru orice opțiuni noi de configurare care au fost adăugate la baza de cod Linux de atunci. Dacă se găsesc opțiuni noi, neconfigurate, valoarea de configurare implicită pentru opțiunea respectivă este utilizată și dosarul .config este actualizat.&lt;br /&gt;
&lt;br /&gt;
Fisierul .config este redenumit în .config.old pe măsură ce backup-ul și noile modificări sunt scrise la .config.&lt;br /&gt;
&lt;br /&gt;
 make olddefconfig&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ file .config&lt;br /&gt;
.config: Linux make config build file, ASCII text&lt;br /&gt;
&lt;br /&gt;
$ make olddefconfig&lt;br /&gt;
  HOSTCC  scripts/basic/fixdep&lt;br /&gt;
  HOSTCC  scripts/kconfig/conf.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/confdata.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/expr.o&lt;br /&gt;
  LEX     scripts/kconfig/lexer.lex.c&lt;br /&gt;
  YACC    scripts/kconfig/parser.tab.[ch]&lt;br /&gt;
  HOSTCC  scripts/kconfig/lexer.lex.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/menu.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/parser.tab.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/preprocess.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/symbol.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/util.o&lt;br /&gt;
  HOSTLD  scripts/kconfig/conf&lt;br /&gt;
.config:8593:warning: symbol value &#039;m&#039; invalid for USB_FOTG210_HCD&lt;br /&gt;
.config:8859:warning: symbol value &#039;m&#039; invalid for USB_FOTG210_UDC&lt;br /&gt;
#&lt;br /&gt;
# configuration written to .config&lt;br /&gt;
#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru utilizatorii Debian și derivații săi&lt;br /&gt;
&lt;br /&gt;
Debian și derivatele sale folosesc un certificat pentru a semna modulele de kernel. Acest certificat, implicit, este absent pe computer.&lt;br /&gt;
&lt;br /&gt;
Vă recomand dezactivarea opțiunii care permite semnarea modulului. Se poate realiza cu următoarele comenzi:&lt;br /&gt;
&lt;br /&gt;
 ./scripts/config --file .config --disable MODULE_SIG&lt;br /&gt;
&lt;br /&gt;
Eșecul de a face acest lucru va duce la un eșec de construcție mai târziu, atunci când se ruleaza build-ul.&lt;br /&gt;
&lt;br /&gt;
===Utilizarea unei configurații particularizate===&lt;br /&gt;
&lt;br /&gt;
Puteți arunca o privire la ieșirea de &amp;quot;make help&amp;quot; pentru a vedea toate opțiunile disponibile, dar ne vom concentra pe trei tinte pentru make:&lt;br /&gt;
&lt;br /&gt;
  defconfig: Configurația implicită.&lt;br /&gt;
  allmodconfig: În funcție de starea actuală a sistemului, construiți elemente ca module încărcabile (în loc de încorporat) atunci când este posibil.&lt;br /&gt;
  tinyconfig: Un mic kernel Linux.&lt;br /&gt;
&lt;br /&gt;
La tinyconfig, timpii de construcție sunt în mod natural mai rapizi.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Modificarea configurației&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ai creat un dosar .config folosind o metodă de mai sus. Fie ai folosit-o pe cea pe care a folosit-o și la distribuirea Linux-ului, fie ai creat-o folosind defconfig.&lt;br /&gt;
&lt;br /&gt;
Oricum ar fi, căutați cum să o modificați. Cel mai fiabil mod de a face acest lucru este prin intermediul menuconfig sau nconfig.&lt;br /&gt;
&lt;br /&gt;
Ambele ținte fac același lucru, dar au o interfață diferită, nconfig este un pic mai intuitiv în căutarea opțiunilor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
  HOSTCC  scripts/kconfig/mconf.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/checklist.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/inputbox.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/menubox.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/textbox.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/util.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/yesno.o&lt;br /&gt;
  HOSTLD  scripts/kconfig/mconf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eticheta kernel-ului nostru poate fi configurată utilizând următoarea comandă:&lt;br /&gt;
&lt;br /&gt;
 ./scripts/config --file .config --set-str LOCALVERSION &amp;quot;-pratham&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Setează CONFIG_LOCALVERSION în dosarul .config.&lt;br /&gt;
&lt;br /&gt;
Acum, să construim kernel-ul în sine.&lt;br /&gt;
&lt;br /&gt;
 make -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Acest lucru este suficient pentru 99% dintre utilizatori.&lt;br /&gt;
&lt;br /&gt;
În funcție de arhitectura computerului dvs., numele imaginii de kernel Linux care se construiește (care este stocată în /boot) va varia.&lt;br /&gt;
&lt;br /&gt;
Pentru x86_64, numele imaginii nucleului Linux este bzImage. Deci, dacă doriți să construiți doar nucleul Linux în scopul de a-l porni, puteți specifica bzImage ca ţintă, aşa:&lt;br /&gt;
&lt;br /&gt;
 ## For x86_64&lt;br /&gt;
  $ make bzImage&lt;br /&gt;
 ## x86_64&lt;br /&gt;
  $ make -s image_name arch/x86/boot/bzImage&lt;br /&gt;
 ## AArch64&lt;br /&gt;
  $ make -s image_name arch/arm64/boot/Image.gz&lt;br /&gt;
 ## RISC-V&lt;br /&gt;
  $ make -s image_name arch/riscv/boot/Image.gz&lt;br /&gt;
&lt;br /&gt;
Și acum, pentru a construi doar imaginea de kernel Linux, puteți face acest lucru:&lt;br /&gt;
&lt;br /&gt;
 make $(make -s image_name | awk -F &#039;/&#039; &#039;{print $4}&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota&#039;&#039;&#039;: În cazul în care doriți să curățați artefactele comenzii make, puteți utiliza oricare dintre următoarele ținte pentru a atinge ceea ce doriți:&lt;br /&gt;
&lt;br /&gt;
    clean: Îndepărtați aproape orice, cu excepția .config.&lt;br /&gt;
    mrproper: șterge si .config.&lt;br /&gt;
    distclean: șterge fișiere de patch-uri.&lt;br /&gt;
&lt;br /&gt;
===Instalare===&lt;br /&gt;
&lt;br /&gt;
Odată ce nucleul Linux a fost compilat, este timpul să instalați câteva lucruri.&lt;br /&gt;
&lt;br /&gt;
Există părți ale nucleului Linux care nu sunt necesare în timpul pornirii. Aceste piese sunt construite ca module loadabile (adică încărcate și descărcate atunci când este necesar).&lt;br /&gt;
&lt;br /&gt;
Să instalăm aceste module. Acest lucru se poate realiza cu make modules_install. Utilizarea de către sudo este necesara, deoarece modulele vor fi instalate în /lib/modules/&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;Și că directorul este deținut de root, nu şi utilizatorul tău.&lt;br /&gt;
&lt;br /&gt;
Acest lucru nu numai că va instala modulele kernel, ci și le va semna. Aşa că va dura ceva timp. Vestea bună este că puteți paraleliza acest lucru folosind cu -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
 sudo make modules_install -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Notă pentru dezvoltatori: Puteți specifica o cale diferită în cazul în care sunt stocate modulele Linux (în loc de /lib/modules/&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;) folosind INSTALL_MOD_PATHvariabilă ca și astfel:&lt;br /&gt;
&lt;br /&gt;
 sudo make modules_install INSTALL_MOD_PATH=&amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O altă notă pentru dezvoltatori: Puteți utiliza INSTALL_MOD_STRIPvariabil pentru a specifica dacă modulele ar trebui să fie deposedat de simbolurile de depanator sau nu. Simbolurile de depanarea nu sunt dezbrăcate dacă nu sunt definite. Când este setat la 1, ele sunt dezbrăcate folosind --strip-debugopţiunea, care este apoi trecută la strip(sau llvm-stripDacă Clang este utilizat) utilitate.&lt;br /&gt;
&lt;br /&gt;
[Opțional] Instalarea fișierelor de cap de nucleu Linux&lt;br /&gt;
&lt;br /&gt;
Dacă intenționați să utilizați acest kernel cu module în afara termenului, cum ar fi ZFS sau Nvidia DKMS, sau încercați să scrieți propriile module, cel mai probabil veți avea nevoie de fișierele de antet furnizate de kernel, acestea pot fi instalate cu ajutorul headers_install:&lt;br /&gt;
&lt;br /&gt;
 sudo make headers_install&lt;br /&gt;
&lt;br /&gt;
Dacă sunteți pe x86_64, puteți sări peste acest pas!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Dacă ați construit pentru ARM sau RISC-V, este foarte probabil ca alergare makeDe asemenea, a construit binarele dispozitiv-axi-tree. Puteți cauta fisiere .dtb în arch/&amp;lt;machine_architecture&amp;gt;/boot/dts.&lt;br /&gt;
&lt;br /&gt;
Am un hack pentru a verifica acest lucru:&lt;br /&gt;
&lt;br /&gt;
## For AArch32&lt;br /&gt;
$ find arch/arm/boot/dts -name &amp;quot;*.dtb&amp;quot; -type f | head -n 1 &amp;gt; /dev/null &amp;amp;&amp;amp; echo &amp;quot;DTBs for ARM32 were built&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## For AArch64&lt;br /&gt;
$ find arch/arm64/boot/dts -name &amp;quot;*.dtb&amp;quot; -type f | head -n 1 &amp;gt; /dev/null &amp;amp;&amp;amp; echo &amp;quot;DTBs for ARM64 were built&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## For RISC-V&lt;br /&gt;
$ find arch/riscv/boot/dts -name &amp;quot;*.dtb&amp;quot; -type f | head -n 1 &amp;gt; /dev/null &amp;amp;&amp;amp; echo &amp;quot;DTBs for RISC-V were built&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dacă primești un mesaj pe care scria &amp;quot;DTB-uri pentru &amp;lt;arh&amp;gt; au fost construite&amp;quot;, continuați cu instalarea DTB-urilor. Asta se face cu dtbs_install- Ţintă.&lt;br /&gt;
&lt;br /&gt;
Utilizarea de către sudoeste necesar, deoarece acest lucru va fi instalat în /boot/dtb-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;care este deținută de root. .&lt;br /&gt;
&lt;br /&gt;
sudo make dtbs_install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;În cele din urmă, instalăm kernel-ul Linux în sine!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sudo make install&lt;br /&gt;
&lt;br /&gt;
Utilizarea de către sudo este necesara aici pentru că sâmburele Linux se instalează în /boot pe care utilizatorul dvs. normal nu are permisiunea de a scrie.&lt;br /&gt;
&lt;br /&gt;
În general, obiectivul de instalare va actualiza, de asemenea, încărcătorul de boot, dar dacă nu reușește, înseamnă că probabil aveți un bootloader neacceptat. Dacă nu utilizați GRUB ca bootloader, vă rugăm să citiți manualul bootloaderului dvs.&lt;br /&gt;
&lt;br /&gt;
Notă pentru dezvoltatori: De data aceasta; variabila INSTALL_PATH este utilizată pentru a specifica unde este instalat nucleul Linux, în loc de calea implicită care se află /boot.&lt;br /&gt;
&lt;br /&gt;
Pentru utilizatorii Arch Linux&lt;br /&gt;
&lt;br /&gt;
Dacă ai încercat să alergi pe make install, s-ar putea să fi observat că ai primit o eroare. Cum ar fi următorul:&lt;br /&gt;
&lt;br /&gt;
 $ sudo make install&lt;br /&gt;
 INSTALL /boot&lt;br /&gt;
 Cannot find LILO.&lt;br /&gt;
&lt;br /&gt;
Pentru a instala de fapt nucleul Linux pe Arch Linux, trebuie să copiem manual imaginea kernel Linux.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Acest lucru se poate face cu următoarea comandă:&lt;br /&gt;
sudo install -Dm644 &amp;quot;$(make -s image_name)&amp;quot; /boot/vmlinuz-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
Din moment ce a, compilat nucleul de 6.5, voi rula următoarea comandă, o voi regla conform nevoilor dumneavoastră:&lt;br /&gt;
sudo install -Dm644 &amp;quot;$(make -s image_name)&amp;quot; /boot/vmlinuz-6.5.5-pratham&lt;br /&gt;
Nu este necesar, dar trebuie să copiați și un fișier numit System.mapȘi în timp ce sunteți la ea, copiați .configFile de asemenea ;)&lt;br /&gt;
sudo cp -vf System.map /boot/System.map-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
sudo cp -vf .config /boot/config-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
Generează ramdisk inițial&lt;br /&gt;
S-ar putea să fi întâlnit o utilitară numită mkinitcpio când ai instalat Arch Linux. O vom folosi pentru a crea ramdik-ul inițial.&lt;br /&gt;
Pentru a face acest lucru, avem nevoie de o presetată mai întâi. Faceți acest lucru prin adăugarea următorului conținut la /etc/mkinitcpio.d/linux-&amp;lt;localversion&amp;gt;.preset. Înlocuiti &amp;lt;kernel_release&amp;gt; Și &amp;lt;localversion&amp;gt; După cum este necesar.&lt;br /&gt;
&lt;br /&gt;
ALL_config=&amp;quot;/etc/mkinitcpio.conf&amp;quot;&lt;br /&gt;
ALL_kver=&amp;quot;/boot/vmlinuz-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PRESETS=(&#039;default&#039; &#039;fallback&#039;)&lt;br /&gt;
&lt;br /&gt;
default_image=&amp;quot;/boot/initramfs-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;.img&amp;quot;&lt;br /&gt;
fallback_options=&amp;quot;-S autodetect&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Odată ce faceți acest lucru, rulați următoarea comandă pentru a genera ramdisk-ul inițial:&lt;br /&gt;
sudo mkinitcpio -p linux-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Urmează ieșirea de pe computerul meu, a ta ar trebui să fie și a ta similară!&lt;br /&gt;
&lt;br /&gt;
$ sudo mkinitcpio -p linux-pratham&lt;br /&gt;
==&amp;gt; Building image from preset: /etc/mkinitcpio.d/linux-pratham.preset: &#039;default&#039;&lt;br /&gt;
==&amp;gt; Using configuration file: &#039;/etc/mkinitcpio.conf&#039;&lt;br /&gt;
  -&amp;gt; -k /boot/vmlinuz-6.5.5-pratham -c /etc/mkinitcpio.conf -g /boot/initramfs-6.5.5-pratham.img&lt;br /&gt;
==&amp;gt; Starting build: &#039;6.5.5-pratham&#039;&lt;br /&gt;
  -&amp;gt; Running build hook: [base]&lt;br /&gt;
(...)&lt;br /&gt;
&lt;br /&gt;
Actualizare GRUB&lt;br /&gt;
sudo grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
Actualizarea GRUB nu va face ca nucleul mai nou să nu intre în mod implicit. Vă rugăm să-l selectați din meniul de boot în timpul bootarii. Puteți selecta versiunea mai nouă a nucleului Linux intrând în elementul de meniu &amp;quot;Opțiuni avansate pentru Arch Linux&amp;quot; - &amp;quot;Arch Linux, cu Linux &amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Nota&#039;&#039;&#039;: In AUR sunt pachete cu automatizeaza intreg procesul.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Felicitări! Ați finalizat toți pașii pentru a obține sursa nucleului Linux, configurând-o, construind-o și instalând-o.&lt;br /&gt;
&lt;br /&gt;
Vă rugăm să selectați versiunea corectă Linux kernel de la bootloader. Odată ce a pornit, rulați uname -rcomanda pentru a verifica dacă ați pornit folosind kernel-ul Linux intenționat.&lt;br /&gt;
&lt;br /&gt;
Mai jos este ieșirea de pe computerul meu:&lt;br /&gt;
&lt;br /&gt;
 $ uname -r&lt;br /&gt;
 6.5.5-pratham&lt;br /&gt;
&lt;br /&gt;
===Dezinstalare===&lt;br /&gt;
&lt;br /&gt;
Fie distribuția Linux a expediat nucleul Linux cu versiunea pe care ați compilat-o manual, fie ați compilat un alt nucleu, mai nou și ați observat că ar trebui să dezinstalați nucleul mai vechi pentru a face spațiu pentru cel mai nou.&lt;br /&gt;
&lt;br /&gt;
Știm unde sunt instalate toate fișierele, astfel încât să fie mai ușor să le scoatem.&lt;br /&gt;
&lt;br /&gt;
 ## Remove kernel modules&lt;br /&gt;
 $ rm -rf /lib/modules/&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ## Remove device-tree binaries&lt;br /&gt;
 $ rm -rf /boot/dtb-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ## Remove the Linux kernel itself&lt;br /&gt;
 $ rm -vf /boot/{config,System,vmlinuz}-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Metoda alternativa ce creeaza pachete de instalare (Ubuntu), poate fi mai elegant.===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## source&lt;br /&gt;
&lt;br /&gt;
apt source linux-image-unsigned-$(uname -r)&lt;br /&gt;
&lt;br /&gt;
chmod a+x debian/rules&lt;br /&gt;
chmod a+x debian/scripts/*&lt;br /&gt;
chmod a+x debian/scripts/misc/*&lt;br /&gt;
&lt;br /&gt;
fakeroot debian/rules clean&lt;br /&gt;
fakeroot debian/rules editconfigs # you need to go through each (Y, Exit, Y, Exit..) or get a complaint about config later&lt;br /&gt;
&lt;br /&gt;
## build&lt;br /&gt;
&lt;br /&gt;
fakeroot debian/rules clean&lt;br /&gt;
&lt;br /&gt;
# quicker build:&lt;br /&gt;
fakeroot debian/rules binary-headers binary-generic binary-perarch&lt;br /&gt;
&lt;br /&gt;
# if you need linux-tools or lowlatency kernel, run instead:&lt;br /&gt;
fakeroot debian/rules binary&lt;br /&gt;
&lt;br /&gt;
##install&lt;br /&gt;
&lt;br /&gt;
cd ..&lt;br /&gt;
ls *.deb&lt;br /&gt;
    linux-headers-4.8.0-17_4.8.0-17.19_all.deb&lt;br /&gt;
    linux-headers-4.8.0-17-generic_4.8.0-17.19_amd64.deb&lt;br /&gt;
    linux-image-4.8.0-17-generic_4.8.0-17.19_amd64.deb&lt;br /&gt;
&lt;br /&gt;
dpkg -i *.deb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Advanced_Pagina_7|Pagina anterioară]] | [[Advanced_Pagina_9|Ultima pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_8&amp;diff=535</id>
		<title>Advanced Pagina 8</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_8&amp;diff=535"/>
		<updated>2024-11-12T15:20:15Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Compilare kernel==&lt;br /&gt;
&lt;br /&gt;
S-ar putea să vă interesați să compilați singur nucleul Linux, din mai multe motive. S-ar putea să fie, dar nu limitat la, una dintre următoarele:&lt;br /&gt;
&lt;br /&gt;
-Încercarea unui nucleu mai nou decât ceea ce oferă distribuția Linux&lt;br /&gt;
&lt;br /&gt;
-Construirea unui kernel cu un set diferit de opțiuni de configurare și/sau drivere&lt;br /&gt;
&lt;br /&gt;
-Curiozitatea unui elev :)&lt;br /&gt;
&lt;br /&gt;
Acest ghid vă va arăta cum puteți compila singur nucleul Linux, cu comenzile pe care ar trebui să le rulați, de ce să rulați aceste comenzi și să explicați ce face.&lt;br /&gt;
&lt;br /&gt;
Distribuțiile precum Ubuntu au modalități mai ușoare de a instala kernel-ul. Dar acest tutorial este despre a face lucrurile manual de la codul sursă. Veți avea nevoie de timp, răbdare și experiență bună cu linia de comandă Linux pentru acest tutorial. Este vorba mai mult despre a experimenta lucrurile la prima mână. Cu toate acestea, vă sfătuiesc să încercați această aventură într-un VM sau pe sistemul dvs. de rezervă în loc să o faceți pe sistemul dvs. principal.&lt;br /&gt;
Pre-requisite-uri&lt;br /&gt;
&lt;br /&gt;
Există două condiții prealabile pentru a construi orice (în context cu software-ul).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Codul sursă&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Dependențele pentru build&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Deci, ca premise, vom descărca sursa kernel-ului Linux și vom instala câteva dependențe care ne vor permite să il compilam.&lt;br /&gt;
&lt;br /&gt;
===Variante===&lt;br /&gt;
&lt;br /&gt;
Există in principal 4 &amp;quot;variante&amp;quot; ale Linux, dupa ordinea fluxului de dezvoltare:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;linux-next:&#039;&#039;&#039; Orice cod care urmează să fie fuzionat în baza de cod Linux este mai întâi îmbinat în linux-next- Arbore. Aceasta este cea mai nouă, dar și cea mai &amp;quot;centr stabilă&amp;quot; stare de nucleu Linux. Majoritatea dezvoltatorilor și testerii de nucleu Linux folosesc acest lucru pentru a rafina calitatea codului pentru ca Linus să tragă, mai târziu.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;linux-mainline.&#039;&#039;&#039; Versiunea beta a acestei versiuni se numește o versiune RC (Release Candidate). Odată ce un RC este eliberat, Linus acceptă numai bug-fixes și patch-uri legate de regresie a performanței. Linus continuă să elibereze un kernel RC în fiecare săptămână până când este mulțumit de cod (cu feedback de la utilizatori). linux-rc, urmat de un număr, este adăugat pentru a indica versiunea de lansare RC.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Release-uri stabile:&#039;&#039;&#039; Odată ce Linus simte că ultimul RC a fost stabil, el lansează eliberarea finală, &amp;quot;publică&amp;quot;. O eliberare stabilă este menținută pentru încă câteva săptămâni. Iată ce folosesc distribuțiile Linux cu margini sângerânde, cum ar fi Arch Linux și Fedora Linux. Vă recomand să încercați mai întâi acest lucru linux-nextsau orice RC eliberează.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Release-uri LTS:&#039;&#039;&#039; Ultima lansare stabilă a unui anumit an este menținută pentru încă câțiva ani. Aceasta este, de obicei, o versiune mai veche, dar este menținută în mod activ cu remedieri de securitate. O versiune stabilă a Debian utilizează lansarea LTS a nucleului Linux.&lt;br /&gt;
&lt;br /&gt;
===Pregătirea sistemului===&lt;br /&gt;
&lt;br /&gt;
Deoarece nucleul Linux este scris în limbajul de programare C, aveți nevoie de cel puțin un compilator C pentru a compila nucleul Linux. Există și alte astfel de dependențe care ar putea fi sau nu prezente pe computer.&lt;br /&gt;
&lt;br /&gt;
Acest ghid se va concentra pe compilarea kernel-ului Linux folosind GNU C Compiler (GCC). Dar poate într-un articol viitor (scufundându-mă în sprijinul Rust), voi acoperi folosind compilatorul Clang al LLVM ca alternativă la CCG.&lt;br /&gt;
&lt;br /&gt;
Comanda pentru Debian și derivații săi (Ubuntu):&lt;br /&gt;
&lt;br /&gt;
 sudo apt install bc binutils bison dwarves flex gcc git gnupg2 gzip libelf-dev libncurses5-dev libssl-dev make openssl pahole perl-base rsync tar xz-utils&lt;br /&gt;
&lt;br /&gt;
Comanda pentru Fedora și derivatele sale:&lt;br /&gt;
&lt;br /&gt;
 sudo dnf install binutils ncurses-devel /usr/include/{libelf.h,openssl/pkcs7.h} /usr/bin/{bc,bison,flex,gcc,git,gpg2,gzip,make,openssl,pahole,perl,rsync,tar,xz,zstd}&lt;br /&gt;
&lt;br /&gt;
===Descarcare kernel Linux===&lt;br /&gt;
&lt;br /&gt;
Mergeți la kernel.org și pe pagină, găsiți prima versiune stabilă.&lt;br /&gt;
Puteți descărca marca de marcare făcând clic pe caseta galbenă mare. În timp ce vă bazați, descărcați și fișierul de semnătură PGP care se potrivește. Va fi la îndemână când vom verifica tarball într-un moment ulterior. Are extensia .tar.sign.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Verificarea autenticității tarballului&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Cum îți dai seama dacă taball-ul pe care tocmai l-ai descărcat este corupt sau nu? La nivel individual, un .tar corupt vă va irosi doar ceva timp, dar dacă acest lucru se face pentru o organizație, s-ar putea să faca lucrurile mai ușoare pentru un atacator.&lt;br /&gt;
&lt;br /&gt;
Pentru a verifica integritatea tarball-ului, prima data se va folosi unxz (alias pentru xz --decompress) pentru a decomprima .tar.xz in dosar.&lt;br /&gt;
&lt;br /&gt;
 unxz --keep linux-*.tar.xz&lt;br /&gt;
&lt;br /&gt;
Odată extrase, vom aduce cheile publice GPG pe care le folosesc Linus Torvalds și Greg KH. Aceste taste sunt folosite pentru a semna tar-ul.&lt;br /&gt;
&lt;br /&gt;
 gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org&lt;br /&gt;
&lt;br /&gt;
Ar trebui să obțineți ieșire care este similară cu ceea ce am primit pe mașina mea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org&lt;br /&gt;
gpg: /home/pratham/.gnupg/trustdb.gpg: trustdb created&lt;br /&gt;
gpg: key 38DBBDC86092693E: public key &amp;quot;Greg Kroah-Hartman &amp;lt;gregkh@kernel.org&amp;gt;&amp;quot; imported&lt;br /&gt;
gpg: Total number processed: 1&lt;br /&gt;
gpg:               imported: 1&lt;br /&gt;
gpg: key 79BE3E4300411886: public key &amp;quot;Linus Torvalds &amp;lt;torvalds@kernel.org&amp;gt;&amp;quot; imported&lt;br /&gt;
gpg: Total number processed: 1&lt;br /&gt;
gpg:               imported: 1&lt;br /&gt;
pub   rsa4096 2011-09-23 [SC]&lt;br /&gt;
      647F28654894E3BD457199BE38DBBDC86092693E&lt;br /&gt;
uid           [ unknown] Greg Kroah-Hartman &amp;lt;gregkh@kernel.org&amp;gt;&lt;br /&gt;
sub   rsa4096 2011-09-23 [E]&lt;br /&gt;
&lt;br /&gt;
pub   rsa2048 2011-09-20 [SC]&lt;br /&gt;
      ABAF11C65A2970B130ABE3C479BE3E4300411886&lt;br /&gt;
uid           [ unknown] Linus Torvalds &amp;lt;torvalds@kernel.org&amp;gt;&lt;br /&gt;
sub   rsa2048 2011-09-20 [E]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odată ce cheile lui Greg și Linus sunt importate, integritatea gudronului poate fi verificată folosind --verify; cum ar fi:&lt;br /&gt;
&lt;br /&gt;
 gpg2 --verify linux-*.tar.sign&lt;br /&gt;
&lt;br /&gt;
Dacă verificarea a avut succes, ar trebui să obțineți o producție similară cu următoarea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ gpg2 --verify linux-*.tar.sign&lt;br /&gt;
gpg: assuming signed data in &#039;linux-6.5.5.tar&#039;&lt;br /&gt;
gpg: Signature made Saturday 23 September 2023 02:46:13 PM IST&lt;br /&gt;
gpg:                using RSA key 647F28654894E3BD457199BE38DBBDC86092693E&lt;br /&gt;
gpg: Good signature from &amp;quot;Greg Kroah-Hartman &amp;lt;gregkh@kernel.org&amp;gt;&amp;quot; [unknown]&lt;br /&gt;
gpg: WARNING: This key is not certified with a trusted signature!&lt;br /&gt;
gpg:          There is no indication that the signature belongs to the owner.&lt;br /&gt;
Primary key fingerprint: 647F 2865 4894 E3BD 4571  99BE 38DB BDC8 6092 693E&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nota: Vă rugăm să nu continuați decât dacă vedeți un mesaj care spune gpg: Good signature!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Puteți ignora cu siguranță avertismentul care spune: AVERTISMENT: Această cheie nu este certificată cu o semnătură de încredere! Nu există niciun indiciu că semnătura aparține proprietarului.&lt;br /&gt;
&lt;br /&gt;
Am adus cheile de la e-mailurile lui Linus şi Greg şi nu am nevoie să ne facem griji pentru acest avertisment.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Extragerea tarball-ului&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dacă sunteți aici, înseamnă că verificarea integrității dvs. a fost finalizată cu succes. Acum, atunci, este timpul să extragem sursa kernel-ului Linux din ea.&lt;br /&gt;
&lt;br /&gt;
 tar -xf linux-*.tar&lt;br /&gt;
&lt;br /&gt;
===Compilare===&lt;br /&gt;
&lt;br /&gt;
Procesul de construcție al kernel-ului Linux caută un dosar .config. După cum sugerează și numele, este un fișier de configurare care specifică fiecare opțiune de configurare posibilă pentru nucleul Linux. Este necesar să avem unul.&lt;br /&gt;
&lt;br /&gt;
Există două metode de a obține acest dosarul .config pentru nucleul Linux:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Utilizarea configurației distribuției Linux ca bază (recomandat)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Folosind o configurație implicită, generică&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Există o a treia metodă în care puteți configura fiecare opțiune, de la zero, cu 12.000+ opțiuni. Acest lucru nu este recomandat deoarece este nevoie de mult timp pentru a configura totul cu mâna și, de asemenea, suficient know-how pentru a ști ce să activeze și să dezactivați.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utilizarea configurației furnizate de distribuție&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Utilizarea configurației furnizate de distribuția Linux este un pariu sigur. Dacă urmați acest ghid doar pentru a încerca un nou nucleu decât ceea ce oferă distribuția dvs., aceasta este metoda recomandată.&lt;br /&gt;
&lt;br /&gt;
Fișierul de configurare al distribuției Linux pentru kernel va fi în oricare dintre cele două locuri:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Cele mai multe distribuții Linux, cum ar fi Debian și Fedora, și derivatele lor o vor stoca ca /boot/config-$(uname -r).&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Unele distribuții Linux, cum ar fi Arch Linux, îl au integrat în nucleul Linux în sine. Prin urmare, va fi disponibil la /proc/config.gz.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dacă aveți ambele destinații disponibile, preferați să utilizați /proc/config.gz așa cum este pe un sistem de fișiere numai citit și, prin urmare, nemodonat.&lt;br /&gt;
&lt;br /&gt;
Intră în directorul care conține tarballul extras.&lt;br /&gt;
&lt;br /&gt;
 cd linux-*/&lt;br /&gt;
&lt;br /&gt;
Apoi, copiați fișierul de configurare al distribuției Linux:&lt;br /&gt;
&lt;br /&gt;
 ## Debian and Fedora&#039;s derivatives:&lt;br /&gt;
 $ cp /boot/config-&amp;quot;$(uname -r)&amp;quot; .config&lt;br /&gt;
&lt;br /&gt;
 ## Arch Linux and its derivatives:&lt;br /&gt;
 $ zcat /proc/config.gz &amp;gt; .config&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Actualizarea configurației&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Odată ce acest lucru este făcut, este timpul să &amp;quot;actualizați&amp;quot; fișierul de configurare. Vezi tu, există o mare probabilitate ca configurația pe care o oferă distribuția dvs. să fie mai veche decât nucleul Linux pe care îl construiți.&lt;br /&gt;
&lt;br /&gt;
Acest lucru se aplică distribuțiilor Linux cu update continuu, cum ar fi Arch Linux și Fedora. Niciuna dintre ele nu a lansat o actualizare doar pentru că există o nouă versiune disponibilă. Ei fac niște QA, care este obligat să ia timp. Și, prin urmare, chiar și cel mai recent sâmbure oferit de distribuția dvs. va fi câteva lansări minore în urmă, în comparație cu ceea ce veți obține de la kernel.org.&lt;br /&gt;
&lt;br /&gt;
Pentru a actualiza un existent .config, comanda make este folosită cu ținta olddefconfig.&lt;br /&gt;
&lt;br /&gt;
Acest lucru va lua &amp;quot;fiserul vechi de configurare&amp;quot; (care este salvat în prezent ca .config ca o copie literală a configurației distribuției dvs.) și verificați pentru orice opțiuni noi de configurare care au fost adăugate la baza de cod Linux de atunci. Dacă se găsesc opțiuni noi, neconfigurate, valoarea de configurare implicită pentru opțiunea respectivă este utilizată și dosarul .config este actualizat.&lt;br /&gt;
&lt;br /&gt;
Fisierul .config este redenumit în .config.old pe măsură ce backup-ul și noile modificări sunt scrise la .config.&lt;br /&gt;
&lt;br /&gt;
 make olddefconfig&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ file .config&lt;br /&gt;
.config: Linux make config build file, ASCII text&lt;br /&gt;
&lt;br /&gt;
$ make olddefconfig&lt;br /&gt;
  HOSTCC  scripts/basic/fixdep&lt;br /&gt;
  HOSTCC  scripts/kconfig/conf.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/confdata.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/expr.o&lt;br /&gt;
  LEX     scripts/kconfig/lexer.lex.c&lt;br /&gt;
  YACC    scripts/kconfig/parser.tab.[ch]&lt;br /&gt;
  HOSTCC  scripts/kconfig/lexer.lex.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/menu.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/parser.tab.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/preprocess.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/symbol.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/util.o&lt;br /&gt;
  HOSTLD  scripts/kconfig/conf&lt;br /&gt;
.config:8593:warning: symbol value &#039;m&#039; invalid for USB_FOTG210_HCD&lt;br /&gt;
.config:8859:warning: symbol value &#039;m&#039; invalid for USB_FOTG210_UDC&lt;br /&gt;
#&lt;br /&gt;
# configuration written to .config&lt;br /&gt;
#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru utilizatorii Debian și derivații săi&lt;br /&gt;
&lt;br /&gt;
Debian și derivatele sale folosesc un certificat pentru a semna modulele de kernel. Acest certificat, implicit, este absent pe computer.&lt;br /&gt;
&lt;br /&gt;
Vă recomand dezactivarea opțiunii care permite semnarea modulului. Se poate realiza cu următoarele comenzi:&lt;br /&gt;
&lt;br /&gt;
 ./scripts/config --file .config --disable MODULE_SIG&lt;br /&gt;
&lt;br /&gt;
Eșecul de a face acest lucru va duce la un eșec de construcție mai târziu, atunci când se ruleaza build-ul.&lt;br /&gt;
&lt;br /&gt;
===Utilizarea unei configurații particularizate===&lt;br /&gt;
&lt;br /&gt;
Puteți arunca o privire la ieșirea de &amp;quot;make help&amp;quot; pentru a vedea toate opțiunile disponibile, dar ne vom concentra pe trei tinte pentru make:&lt;br /&gt;
&lt;br /&gt;
  defconfig: Configurația implicită.&lt;br /&gt;
  allmodconfig: În funcție de starea actuală a sistemului, construiți elemente ca module încărcabile (în loc de încorporat) atunci când este posibil.&lt;br /&gt;
  tinyconfig: Un mic kernel Linux.&lt;br /&gt;
&lt;br /&gt;
La tinyconfig, timpii de construcție sunt în mod natural mai rapizi.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Modificarea configurației&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ai creat un dosar .config folosind o metodă de mai sus. Fie ai folosit-o pe cea pe care a folosit-o și la distribuirea Linux-ului, fie ai creat-o folosind defconfig.&lt;br /&gt;
&lt;br /&gt;
Oricum ar fi, căutați cum să o modificați. Cel mai fiabil mod de a face acest lucru este prin intermediul menuconfig sau nconfig.&lt;br /&gt;
&lt;br /&gt;
Ambele ținte fac același lucru, dar au o interfață diferită, nconfig este un pic mai intuitiv în căutarea opțiunilor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
  HOSTCC  scripts/kconfig/mconf.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/checklist.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/inputbox.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/menubox.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/textbox.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/util.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/yesno.o&lt;br /&gt;
  HOSTLD  scripts/kconfig/mconf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eticheta kernel-ului nostru poate fi configurată utilizând următoarea comandă:&lt;br /&gt;
&lt;br /&gt;
 ./scripts/config --file .config --set-str LOCALVERSION &amp;quot;-pratham&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Setează CONFIG_LOCALVERSION în dosarul .config.&lt;br /&gt;
&lt;br /&gt;
Acum, să construim kernel-ul în sine.&lt;br /&gt;
&lt;br /&gt;
 make -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Acest lucru este suficient pentru 99% dintre utilizatori.&lt;br /&gt;
&lt;br /&gt;
În funcție de arhitectura computerului dvs., numele imaginii de kernel Linux care se construiește (care este stocată în /boot) va varia.&lt;br /&gt;
&lt;br /&gt;
Pentru x86_64, numele imaginii nucleului Linux este bzImage. Deci, dacă doriți să construiți doar nucleul Linux în scopul de a-l porni, puteți specifica bzImage ca ţintă, aşa:&lt;br /&gt;
&lt;br /&gt;
 ## For x86_64&lt;br /&gt;
  $ make bzImage&lt;br /&gt;
 ## x86_64&lt;br /&gt;
  $ make -s image_name arch/x86/boot/bzImage&lt;br /&gt;
 ## AArch64&lt;br /&gt;
  $ make -s image_name arch/arm64/boot/Image.gz&lt;br /&gt;
 ## RISC-V&lt;br /&gt;
  $ make -s image_name arch/riscv/boot/Image.gz&lt;br /&gt;
&lt;br /&gt;
Și acum, pentru a construi doar imaginea de kernel Linux, puteți face acest lucru:&lt;br /&gt;
&lt;br /&gt;
 make $(make -s image_name | awk -F &#039;/&#039; &#039;{print $4}&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota&#039;&#039;&#039;: În cazul în care doriți să curățați artefactele comenzii make, puteți utiliza oricare dintre următoarele ținte pentru a atinge ceea ce doriți:&lt;br /&gt;
&lt;br /&gt;
    clean: Îndepărtați aproape orice, cu excepția .config.&lt;br /&gt;
    mrproper: șterge si .config.&lt;br /&gt;
    distclean: șterge fișiere de patch-uri.&lt;br /&gt;
&lt;br /&gt;
===Instalare===&lt;br /&gt;
&lt;br /&gt;
Odată ce nucleul Linux a fost compilat, este timpul să instalați câteva lucruri.&lt;br /&gt;
&lt;br /&gt;
Există părți ale nucleului Linux care nu sunt necesare în timpul pornirii. Aceste piese sunt construite ca module loadabile (adică încărcate și descărcate atunci când este necesar).&lt;br /&gt;
&lt;br /&gt;
Să instalăm aceste module. Acest lucru se poate realiza cu make modules_install. Utilizarea de către sudo este necesara, deoarece modulele vor fi instalate în /lib/modules/&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;Și că directorul este deținut de root, nu şi utilizatorul tău.&lt;br /&gt;
&lt;br /&gt;
Acest lucru nu numai că va instala modulele kernel, ci și le va semna. Aşa că va dura ceva timp. Vestea bună este că puteți paraleliza acest lucru folosind cu -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
 sudo make modules_install -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Notă pentru dezvoltatori: Puteți specifica o cale diferită în cazul în care sunt stocate modulele Linux (în loc de /lib/modules/&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;) folosind INSTALL_MOD_PATHvariabilă ca și astfel:&lt;br /&gt;
&lt;br /&gt;
 sudo make modules_install INSTALL_MOD_PATH=&amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O altă notă pentru dezvoltatori: Puteți utiliza INSTALL_MOD_STRIPvariabil pentru a specifica dacă modulele ar trebui să fie deposedat de simbolurile de depanator sau nu. Simbolurile de depanarea nu sunt dezbrăcate dacă nu sunt definite. Când este setat la 1, ele sunt dezbrăcate folosind --strip-debugopţiunea, care este apoi trecută la strip(sau llvm-stripDacă Clang este utilizat) utilitate.&lt;br /&gt;
&lt;br /&gt;
[Opțional] Instalarea fișierelor de cap de nucleu Linux&lt;br /&gt;
&lt;br /&gt;
Dacă intenționați să utilizați acest kernel cu module în afara termenului, cum ar fi ZFS sau Nvidia DKMS, sau încercați să scrieți propriile module, cel mai probabil veți avea nevoie de fișierele de antet furnizate de kernel, acestea pot fi instalate cu ajutorul headers_install:&lt;br /&gt;
&lt;br /&gt;
 sudo make headers_install&lt;br /&gt;
&lt;br /&gt;
Notă pentru dezvoltatori: Calea pentru instalarea antetului de sâmbure Linux poate fi suprasomit prin utilizarea variabilei INSTALL_HDR_PATH.&lt;br /&gt;
&lt;br /&gt;
Dacă sunteți pe x86_64, puteți sări peste acest pas!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Dacă ați construit pentru ARM sau RISC-V, este foarte probabil ca alergare makeDe asemenea, a construit binarele dispozitiv-axi-tree. Puteți cauta fisiere .dtb în arch/&amp;lt;machine_architecture&amp;gt;/boot/dts.&lt;br /&gt;
&lt;br /&gt;
Am un hack pentru a verifica acest lucru:&lt;br /&gt;
&lt;br /&gt;
## For AArch32&lt;br /&gt;
$ find arch/arm/boot/dts -name &amp;quot;*.dtb&amp;quot; -type f | head -n 1 &amp;gt; /dev/null &amp;amp;&amp;amp; echo &amp;quot;DTBs for ARM32 were built&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## For AArch64&lt;br /&gt;
$ find arch/arm64/boot/dts -name &amp;quot;*.dtb&amp;quot; -type f | head -n 1 &amp;gt; /dev/null &amp;amp;&amp;amp; echo &amp;quot;DTBs for ARM64 were built&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## For RISC-V&lt;br /&gt;
$ find arch/riscv/boot/dts -name &amp;quot;*.dtb&amp;quot; -type f | head -n 1 &amp;gt; /dev/null &amp;amp;&amp;amp; echo &amp;quot;DTBs for RISC-V were built&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dacă primești un mesaj pe care scria &amp;quot;DTB-uri pentru &amp;lt;arh&amp;gt; au fost construite&amp;quot;, continuați cu instalarea DTB-urilor. Asta se face cu dtbs_install- Ţintă.&lt;br /&gt;
&lt;br /&gt;
Utilizarea de către sudoeste necesar, deoarece acest lucru va fi instalat în /boot/dtb-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;care este deținută de root. .&lt;br /&gt;
&lt;br /&gt;
sudo make dtbs_install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;În cele din urmă, instalăm kernel-ul Linux în sine!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sudo make install&lt;br /&gt;
&lt;br /&gt;
Utilizarea de către sudo este necesara aici pentru că sâmburele Linux se instalează în /boot pe care utilizatorul dvs. normal nu are permisiunea de a scrie.&lt;br /&gt;
&lt;br /&gt;
În general, obiectivul de instalare va actualiza, de asemenea, încărcătorul de boot, dar dacă nu reușește, înseamnă că probabil aveți un bootloader neacceptat. Dacă nu utilizați GRUB ca bootloader, vă rugăm să citiți manualul bootloaderului dvs.&lt;br /&gt;
&lt;br /&gt;
Notă pentru dezvoltatori: De data aceasta; variabila INSTALL_PATH este utilizată pentru a specifica unde este instalat nucleul Linux, în loc de calea implicită care se află /boot.&lt;br /&gt;
&lt;br /&gt;
Pentru utilizatorii Arch Linux&lt;br /&gt;
&lt;br /&gt;
Dacă ai încercat să alergi pe make install, s-ar putea să fi observat că ai primit o eroare. Cum ar fi următorul:&lt;br /&gt;
&lt;br /&gt;
$ sudo make install&lt;br /&gt;
  INSTALL /boot&lt;br /&gt;
Cannot find LILO.&lt;br /&gt;
&lt;br /&gt;
Pentru a instala de fapt nucleul Linux pe Arch Linux, trebuie să copiem manual imaginea kernel Linux.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Acest lucru se poate face cu următoarea comandă:&lt;br /&gt;
sudo install -Dm644 &amp;quot;$(make -s image_name)&amp;quot; /boot/vmlinuz-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
Din moment ce a, compilat nucleul de 6.5, voi rula următoarea comandă, o voi regla conform nevoilor dumneavoastră:&lt;br /&gt;
sudo install -Dm644 &amp;quot;$(make -s image_name)&amp;quot; /boot/vmlinuz-6.5.5-pratham&lt;br /&gt;
Nu este necesar, dar trebuie să copiați și un fișier numit System.mapȘi în timp ce sunteți la ea, copiați .configFile de asemenea ;)&lt;br /&gt;
sudo cp -vf System.map /boot/System.map-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
sudo cp -vf .config /boot/config-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
Generează ramdisk inițial&lt;br /&gt;
S-ar putea să fi întâlnit o utilitară numită mkinitcpio când ai instalat Arch Linux. O vom folosi pentru a crea ramdik-ul inițial.&lt;br /&gt;
Pentru a face acest lucru, avem nevoie de o presetată mai întâi. Faceți acest lucru prin adăugarea următorului conținut la /etc/mkinitcpio.d/linux-&amp;lt;localversion&amp;gt;.preset. Înlocuiti &amp;lt;kernel_release&amp;gt; Și &amp;lt;localversion&amp;gt; După cum este necesar.&lt;br /&gt;
&lt;br /&gt;
ALL_config=&amp;quot;/etc/mkinitcpio.conf&amp;quot;&lt;br /&gt;
ALL_kver=&amp;quot;/boot/vmlinuz-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PRESETS=(&#039;default&#039; &#039;fallback&#039;)&lt;br /&gt;
&lt;br /&gt;
default_image=&amp;quot;/boot/initramfs-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;.img&amp;quot;&lt;br /&gt;
fallback_options=&amp;quot;-S autodetect&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Odată ce faceți acest lucru, rulați următoarea comandă pentru a genera ramdisk-ul inițial:&lt;br /&gt;
sudo mkinitcpio -p linux-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Urmează ieșirea de pe computerul meu, a ta ar trebui să fie și a ta similară!&lt;br /&gt;
&lt;br /&gt;
$ sudo mkinitcpio -p linux-pratham&lt;br /&gt;
==&amp;gt; Building image from preset: /etc/mkinitcpio.d/linux-pratham.preset: &#039;default&#039;&lt;br /&gt;
==&amp;gt; Using configuration file: &#039;/etc/mkinitcpio.conf&#039;&lt;br /&gt;
  -&amp;gt; -k /boot/vmlinuz-6.5.5-pratham -c /etc/mkinitcpio.conf -g /boot/initramfs-6.5.5-pratham.img&lt;br /&gt;
==&amp;gt; Starting build: &#039;6.5.5-pratham&#039;&lt;br /&gt;
  -&amp;gt; Running build hook: [base]&lt;br /&gt;
(...)&lt;br /&gt;
&lt;br /&gt;
Actualizare GRUB&lt;br /&gt;
sudo grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
Actualizarea GRUB nu va face ca nucleul mai nou să nu intre în mod implicit. Vă rugăm să-l selectați din meniul de boot în timpul bootarii. Puteți selecta versiunea mai nouă a nucleului Linux intrând în elementul de meniu &amp;quot;Opțiuni avansate pentru Arch Linux&amp;quot; - &amp;quot;Arch Linux, cu Linux &amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Nota&#039;&#039;&#039;: In AUR sunt pachete cu automatizeaza intreg procesul.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Felicitări! Ați finalizat toți pașii pentru a obține sursa nucleului Linux, configurând-o, construind-o și instalând-o.&lt;br /&gt;
&lt;br /&gt;
Vă rugăm să selectați versiunea corectă Linux kernel de la bootloader. Odată ce a pornit, rulați uname -rcomanda pentru a verifica dacă ați pornit folosind kernel-ul Linux intenționat.&lt;br /&gt;
&lt;br /&gt;
Mai jos este ieșirea de pe computerul meu:&lt;br /&gt;
&lt;br /&gt;
 $ uname -r&lt;br /&gt;
 6.5.5-pratham&lt;br /&gt;
&lt;br /&gt;
===Dezinstalare===&lt;br /&gt;
&lt;br /&gt;
Fie distribuția Linux a expediat nucleul Linux cu versiunea pe care ați compilat-o manual, fie ați compilat un alt nucleu, mai nou și ați observat că ar trebui să dezinstalați nucleul mai vechi pentru a face spațiu pentru cel mai nou.&lt;br /&gt;
&lt;br /&gt;
Știm unde sunt instalate toate fișierele, astfel încât să fie mai ușor să le scoatem.&lt;br /&gt;
&lt;br /&gt;
 ## Remove kernel modules&lt;br /&gt;
 $ rm -rf /lib/modules/&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ## Remove device-tree binaries&lt;br /&gt;
 $ rm -rf /boot/dtb-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ## Remove the Linux kernel itself&lt;br /&gt;
 $ rm -vf /boot/{config,System,vmlinuz}-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Metoda alternativa ce creeaza pachete de instalare (Ubuntu), poate fi mai elegant.===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## source&lt;br /&gt;
&lt;br /&gt;
apt source linux-image-unsigned-$(uname -r)&lt;br /&gt;
&lt;br /&gt;
chmod a+x debian/rules&lt;br /&gt;
chmod a+x debian/scripts/*&lt;br /&gt;
chmod a+x debian/scripts/misc/*&lt;br /&gt;
&lt;br /&gt;
fakeroot debian/rules clean&lt;br /&gt;
fakeroot debian/rules editconfigs # you need to go through each (Y, Exit, Y, Exit..) or get a complaint about config later&lt;br /&gt;
&lt;br /&gt;
## build&lt;br /&gt;
&lt;br /&gt;
fakeroot debian/rules clean&lt;br /&gt;
&lt;br /&gt;
# quicker build:&lt;br /&gt;
fakeroot debian/rules binary-headers binary-generic binary-perarch&lt;br /&gt;
&lt;br /&gt;
# if you need linux-tools or lowlatency kernel, run instead:&lt;br /&gt;
fakeroot debian/rules binary&lt;br /&gt;
&lt;br /&gt;
##install&lt;br /&gt;
&lt;br /&gt;
cd ..&lt;br /&gt;
ls *.deb&lt;br /&gt;
    linux-headers-4.8.0-17_4.8.0-17.19_all.deb&lt;br /&gt;
    linux-headers-4.8.0-17-generic_4.8.0-17.19_amd64.deb&lt;br /&gt;
    linux-image-4.8.0-17-generic_4.8.0-17.19_amd64.deb&lt;br /&gt;
&lt;br /&gt;
dpkg -i *.deb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Advanced_Pagina_7|Pagina anterioară]] | [[Advanced_Pagina_9|Ultima pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_9&amp;diff=534</id>
		<title>Advanced Pagina 9</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_9&amp;diff=534"/>
		<updated>2024-11-12T15:17:05Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Montare directoare în rețea (smb, nfs), alte utilizari ale bind==&lt;br /&gt;
&lt;br /&gt;
===Montarea sistemelor de fișiere de rețea (NFS)===&lt;br /&gt;
&lt;br /&gt;
Sistemul de fișiere de rețea NFS vă permite să partajați fișiere și directoare între sistemele dintr-o rețea. NFS se bazează pe arhitectura client-server; serverul NFS partajează directoarele specifice pe care clientul le poate conecta și accesa prin montarea lor local.&lt;br /&gt;
&lt;br /&gt;
Cu NFS, directorul montat apare ca și cum ar locui pe sistemul dumneavoastră local. Comanda mount montează temporar sistemul de fișiere. Odată ce sistemul a fost repornit, va trebui să-l montați din nou pentru a-l accesa. Totuși, dacă doriți să montați sistemul de fișiere permanent, astfel încât să nu fie necesar să-l montați de fiecare dată când porniți sistemul, va trebui să adăugați o intrare în fișierul /etc/fstab.&lt;br /&gt;
&lt;br /&gt;
În acest articol, vom explica cum să montați manual și automat sistemul de fișiere NFS pe sistemul local.&lt;br /&gt;
Cerințe preliminare&lt;br /&gt;
&lt;br /&gt;
Înainte de a continua, asigurați-vă că următoarele cerințe preliminare sunt îndeplinite pe serverul de la distanță.&lt;br /&gt;
&lt;br /&gt;
-Serverul NFS este instalat pe mașina de la distanță&lt;br /&gt;
&lt;br /&gt;
-Serviciul NFS rulează&lt;br /&gt;
&lt;br /&gt;
-Directorul partajat NFS este exportat&lt;br /&gt;
&lt;br /&gt;
-Un firewall nu blochează accesul la IP-ul clientului&lt;br /&gt;
&lt;br /&gt;
Am efectuat procedura menționată în acest articol pe sistemul Ubuntu 20.04. Mai mult, am folosit aplicația Terminal de linie de comandă pentru a rula comenzile în Ubuntu. Pentru a deschide Terminalul, puteți utiliza comanda rapidă de la tastatură Ctrl+Alt+T.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Instalarea pachetelor client NFS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pentru a monta directorul partajat NFS pe sistemul dumneavoastră client local, veți avea nevoie de pachetul client NFS. Mai întâi, actualizați indexul depozitului de sistem folosind următoarea comandă din Terminal:&lt;br /&gt;
 $ sudo apt update&lt;br /&gt;
&lt;br /&gt;
Apoi instalați pachetul client NFS în mașina dvs. client utilizând următoarea comandă din Terminal:&lt;br /&gt;
 $ sudo apt install nfs-common&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Montarea manuală a unui sistem de fișiere NFS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
În următoarea metodă, vom monta manual directorul NFS folosind comanda mount.&lt;br /&gt;
&lt;br /&gt;
Pasul 1: Creați un punct de montare pentru directorul partajat al serverului NFS&lt;br /&gt;
&lt;br /&gt;
Primul nostru pas va fi să creăm un director de puncte de montare în sistemul clientului. Acesta va fi directorul în care pot fi accesate toate fișierele partajate de pe serverul NFS.&lt;br /&gt;
&lt;br /&gt;
Am creat un director de puncte de montare cu numele „client_sharedfolder” sub directorul /mnt.&lt;br /&gt;
&lt;br /&gt;
 $ sudo mkdir -p /mnt/client_sharedfolder&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pasul 2: Montați directorul partajat de server NFS pe client&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Următorul pas este să montați directorul partajat pe serverul NFS în directorul punctului de montare al clientului. Utilizați următoarea sintaxă pentru a monta directorul partajat al serverului NFS în directorul punctelor de montare din client:&lt;br /&gt;
&lt;br /&gt;
 $ sudo mount [NFS _IP]:/[NFS_export] [Local_mountpoint]&lt;br /&gt;
&lt;br /&gt;
Unde&lt;br /&gt;
&lt;br /&gt;
-NFS_IP este adresa IP a serverului NFS&lt;br /&gt;
&lt;br /&gt;
-NFS_export este directorul partajat de pe serverul NFS&lt;br /&gt;
&lt;br /&gt;
-Local_mountpoint este directorul punctelor de montare de pe sistemul clientului&lt;br /&gt;
&lt;br /&gt;
În exemplul nostru, comanda ar fi:&lt;br /&gt;
&lt;br /&gt;
 $ sudo mount 192.168.72.136:/mnt/sharedfolder /mnt/client_sharedfolder&lt;br /&gt;
&lt;br /&gt;
Unde 192.168.72.136 este IP-ul serverului nostru NFS, /mnt/sharedfolder este directorul partajat de pe serverul NFS și /mnt/sharedfolder este punctul de montare pe sistemul client.&lt;br /&gt;
&lt;br /&gt;
După ce ați montat partajarea NFS, o puteți confirma folosind următoarea comandă:&lt;br /&gt;
 $ df –h&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pasul 3: Testați partajarea NFS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
După ce ați montat directorul partajat NFS pe computerul client, testați-l accesând câteva fișiere de pe serverul NFS. Pe computerul server NFS, creați orice fișier sau director de testare și încercați să îl accesați de pe computerul client.&lt;br /&gt;
&lt;br /&gt;
Utilizați comanda cd pentru a naviga la directorul partajat al serverului NFS:&lt;br /&gt;
 $ cd /mnt/sharedfolder/&lt;br /&gt;
&lt;br /&gt;
Apoi, folosind comanda touch sau mkdir, creați un fișier sau un director de testare. Am creat câteva exemple de fișiere numite „testfile1” și „testfile2”.&lt;br /&gt;
 $ sudo touch testfile1 testfile2&lt;br /&gt;
&lt;br /&gt;
Acum, pe computerul clientului, verificați dacă există aceleași fișiere.&lt;br /&gt;
 $ ls /mnt/client_sharedfolder/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Montarea automată a unui sistem de fișiere NFS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
În următoarea metodă, vom configura sistemul de fișiere NFS să se monteze automat la momentul pornirii. Folosind acest mod, nu va trebui să montați manual sistemul de fișiere de fiecare dată când porniți sistemul.&lt;br /&gt;
&lt;br /&gt;
Editați fișierul /etc/fstab folosind următoarea comandă:&lt;br /&gt;
&lt;br /&gt;
 $ sudo nano /etc/fstab&lt;br /&gt;
&lt;br /&gt;
Apoi adăugați o intrare în fișierul /etc/fstab folosind următorul format.&lt;br /&gt;
&lt;br /&gt;
 Server NFS:punct de montare director nfs implicite 0 0&lt;br /&gt;
&lt;br /&gt;
Unde directorul serverului NFS: este IP-ul serverului NFS și directorul său partajat, punctul de montare este punctul de montare de pe computerul clientului unde este montat directorul NFS și nfs definește tipul sistemului de fișiere.&lt;br /&gt;
&lt;br /&gt;
În exemplul nostru, intrarea ar fi:&lt;br /&gt;
 192.168.72.136:/mnt/sharedfolder /mnt/client_sharedfolder nfs defaults 0 0&lt;br /&gt;
&lt;br /&gt;
Unde 192.168.72.136 este IP-ul serverului nostru NFS, /mnt/sharedfolder este directorul partajat de pe serverul NFS și /mnt/client_sharedfolder este punctul de montare pe sistemul client.&lt;br /&gt;
&lt;br /&gt;
După ce ați adăugat intrarea de mai sus în fișierul /etc/fstab, salvați și închideți fișierul. Folosiți Ctrl+O și apoi Ctrl+X pentru a face acest lucru.&lt;br /&gt;
&lt;br /&gt;
Data viitoare când porniți mașina, partajarea NFS va fi montată automat la punctul de montare specificat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Demontarea sistemelor de fișiere NFS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Puteți demonta oricând un sistem de fișiere NFS de pe sistemul local. Tastați comanda unmount urmată de numele punctului de montare unde este montat.&lt;br /&gt;
&lt;br /&gt;
Notă: Comanda este „demontare”, nu demontare.&lt;br /&gt;
 $ sudo umount [mount_point]&lt;br /&gt;
&lt;br /&gt;
În exemplul nostru, ar fi:&lt;br /&gt;
 $ umount /mnt/client_sharedfolder&lt;br /&gt;
&lt;br /&gt;
sau&lt;br /&gt;
&lt;br /&gt;
 # umount 192.168.72.136:/mnt/sharedfolder&lt;br /&gt;
&lt;br /&gt;
Totuși, rețineți că, dacă sistemul de fișiere NFS a fost montat folosind /etc/fstab, acesta va fi montat din nou data viitoare când porniți sistemul. De asemenea, rețineți că sistemul de fișiere nu va fi demontat dacă este ocupat, ca și cum ar fi niște fișiere deschise pe el sau dacă lucrați la un director.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Montarea sistemelor de fișiere de rețea (Samba)===&lt;br /&gt;
&lt;br /&gt;
Pe lângă sistemele de fișiere locale, Linux oferă posibilitatea de a monta sisteme de fișiere din rețea folosind diferite protocoale. Un protocol utilizat pe scară largă este Samba, care permite partajarea fișierelor și a imprimantelor între sistemele Linux și Windows.&lt;br /&gt;
&lt;br /&gt;
Introducere&lt;br /&gt;
&lt;br /&gt;
Samba este o suită de software open-source care implementează protocolul de rețea SMB/CIFS. Permite sistemelor Linux să interacționeze cu sistemele Windows, accesând fișierele și resursele partajate fără probleme.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Instalarea pachetelor Samba&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Înainte de a putea monta partajări Samba în Linux, trebuie să vă asigurați că pachetele Samba sunt instalate pe sistemul dumneavoastră. Utilizați managerul de pachete specific distribuției dvs. Linux pentru a instala pachetele necesare. De exemplu, pe Ubuntu, puteți utiliza următoarea comandă:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install samba&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configurarea partajărilor Samba&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pentru a monta partajări Samba, trebuie să configurați serverul Samba pe mașina Windows de la distanță sau pe mașina Linux care acționează ca server Samba. Aceasta implică configurarea directoarelor partajate și definirea permisiunilor de acces.&lt;br /&gt;
&lt;br /&gt;
Instrucțiuni detaliate despre configurarea partajărilor Samba depășesc scopul acestei postări de blog. Cu toate acestea, odată ce partajările sunt configurate corect, puteți continua cu montarea lor în Linux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Montarea temporară&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pentru a monta temporar o partajare Samba, puteți folosi comanda mount. Sintaxa de bază este următoarea −&lt;br /&gt;
&lt;br /&gt;
 sudo mount -t cifs //&amp;lt;server&amp;gt;/&amp;lt;share&amp;gt; &amp;lt;mount-point&amp;gt; -o &amp;lt;options&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Înlocuiți cu adresa IP sau numele de gazdă al serverului Samba, cu numele directorului partajat și cu directorul în care doriți să montați partajarea.&lt;br /&gt;
&lt;br /&gt;
De exemplu, pentru a monta o partajare Samba situată la 192.168.0.100/shared în directorul /mnt/samba, puteți folosi următoarea comandă -&lt;br /&gt;
&lt;br /&gt;
 sudo mount -t cifs //192.168.0.100/shared /mnt/samba -o username=&amp;lt;username&amp;gt;,password=&amp;lt;password&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Înlocuiți și cu acreditările corespunzătoare.&lt;br /&gt;
Montarea automată a acțiunilor Samba la pornire&lt;br /&gt;
&lt;br /&gt;
Pentru a monta automat partajări Samba la pornirea sistemului, puteți modifica fișierul /etc/fstab. Deschideți fișierul folosind un editor de text cu privilegii administrative, cum ar fi −&lt;br /&gt;
&lt;br /&gt;
 sudo nano /etc/fstab&lt;br /&gt;
&lt;br /&gt;
Adăugați o intrare pentru fiecare partajare Samba pe care doriți să o montați automat. Intrarea ar trebui să respecte sintaxa −&lt;br /&gt;
&lt;br /&gt;
 //&amp;lt;server&amp;gt;/&amp;lt;share&amp;gt;  &amp;lt;mount-point&amp;gt; cifs  &amp;lt;options&amp;gt; 0 0&lt;br /&gt;
&lt;br /&gt;
De exemplu, pentru a monta automat partajarea Samba //192.168.0.100/shared la /mnt/samba la pornire, adăugați următoarea intrare -&lt;br /&gt;
&lt;br /&gt;
 //192.168.0.100/shared /mnt/samba cifs username=&amp;lt;username&amp;gt;,password=&amp;lt;password&amp;gt; 0 0&lt;br /&gt;
&lt;br /&gt;
Salvați modificările și părăsiți editorul de text. Partajarea Samba specificată va fi montată automat în timpul pornirii sistemului.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Alte utilizari de monturi, Bind===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utilizarea Bind-mounts cu comanda Linux Kernel încorporată&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Nucleul Linux are o comandă bind încorporată. Din acest motiv, utilizatorii pot monta cu ușurință conținutul directoarelor în sistemul de fișiere. Iată cum să o faci.&lt;br /&gt;
&lt;br /&gt;
Gândiți-vă la un director care conține fișiere pe care ați dori să le montați într-o altă locație. Când aveți în vedere locația, gândiți-vă la locul în care doriți să o montați.&lt;br /&gt;
&lt;br /&gt;
În acest exemplu, vom lega un director muzical de pe un hard disk la altul.&lt;br /&gt;
&lt;br /&gt;
 sudo mount --bind /mnt/DataDrive/Music /home/user/Music&lt;br /&gt;
&lt;br /&gt;
Demontați suportul de legătură cu:&lt;br /&gt;
&lt;br /&gt;
 umount /home/derrik/Music&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BindFS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
BindFS adaugă funcționalități suplimentare (setări de permisiuni, oglindire mai bună etc.). Iată cum să îl obțineți pe distribuția dvs. Linux:&lt;br /&gt;
&lt;br /&gt;
Ubuntu&lt;br /&gt;
 sudo apt install bindfs&lt;br /&gt;
&lt;br /&gt;
Debian&lt;br /&gt;
 sudo apt-get install bindfs&lt;br /&gt;
&lt;br /&gt;
Fedora&lt;br /&gt;
 sudo dnf install bindfs&lt;br /&gt;
&lt;br /&gt;
Folosirea bindfs are avantajele sale. Comanda încorporată în kernel bind funcționează rapid, dar este foarte simplă și nu permite anumite caracteristici avansate, cum ar fi restricționarea accesului la legături și etc. Iată cum să folosiți bindfs.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Realizați o montură de legare numai pentru citire&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 bindfs --perms=a-w /path/to/the/original/directory/ /path/to/bind/to/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Efectuați o montură de legătură pentru citire/scriere&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 bindfs /path/to/the/original/directory /path/to/bind/to&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Demontează o montură bindfs&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sudo umount /path/to/bind/&lt;br /&gt;
&lt;br /&gt;
[[Advanced_Pagina_8|Pagina anterioară]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_8&amp;diff=533</id>
		<title>Advanced Pagina 8</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_8&amp;diff=533"/>
		<updated>2024-11-12T15:02:57Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Compilare kernel==&lt;br /&gt;
&lt;br /&gt;
S-ar putea să vă interesați să compilați singur nucleul Linux, din mai multe motive. S-ar putea să fie, dar nu limitat la, una dintre următoarele:&lt;br /&gt;
&lt;br /&gt;
-Încercarea unui nucleu mai nou decât ceea ce oferă distribuția Linux&lt;br /&gt;
&lt;br /&gt;
-Construirea unui kernel cu un set diferit de opțiuni de configurare și/sau drivere&lt;br /&gt;
&lt;br /&gt;
-Curiozitatea unui elev :)&lt;br /&gt;
&lt;br /&gt;
Acest ghid vă va arăta cum puteți compila singur nucleul Linux, cu comenzile pe care ar trebui să le rulați, de ce să rulați aceste comenzi și să explicați ce face.&lt;br /&gt;
&lt;br /&gt;
Distribuțiile precum Ubuntu au modalități mai ușoare de a instala kernel-ul. Dar acest tutorial este despre a face lucrurile manual de la codul sursă. Veți avea nevoie de timp, răbdare și experiență bună cu linia de comandă Linux pentru acest tutorial. Este vorba mai mult despre a experimenta lucrurile la prima mână. Cu toate acestea, vă sfătuiesc să încercați această aventură într-un VM sau pe sistemul dvs. de rezervă în loc să o faceți pe sistemul dvs. principal.&lt;br /&gt;
Pre-requisite-uri&lt;br /&gt;
&lt;br /&gt;
Există două condiții prealabile pentru a construi orice (în context cu software-ul).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Codul sursă&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Dependențele pentru build&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Deci, ca premise, vom descărca sursa kernel-ului Linux și vom instala câteva dependențe care ne vor permite să il compilam.&lt;br /&gt;
&lt;br /&gt;
Există in principal 4 &amp;quot;variante&amp;quot; ale Linux, dupa ordinea fluxului de dezvoltare:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;linux-next:&#039;&#039;&#039; Orice cod care urmează să fie fuzionat în baza de cod Linux este mai întâi îmbinat în linux-next- Arbore. Aceasta este cea mai nouă, dar și cea mai &amp;quot;centr stabilă&amp;quot; stare de nucleu Linux. Majoritatea dezvoltatorilor și testerii de nucleu Linux folosesc acest lucru pentru a rafina calitatea codului pentru ca Linus să tragă, mai târziu.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;linux-mainline.&#039;&#039;&#039; Versiunea beta a acestei versiuni se numește o versiune RC (Release Candidate). Odată ce un RC este eliberat, Linus acceptă numai bug-fixes și patch-uri legate de regresie a performanței. Linus continuă să elibereze un kernel RC în fiecare săptămână până când este mulțumit de cod (cu feedback de la utilizatori). linux-rc, urmat de un număr, este adăugat pentru a indica versiunea de lansare RC.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Release-uri stabile:&#039;&#039;&#039; Odată ce Linus simte că ultimul RC a fost stabil, el lansează eliberarea finală, &amp;quot;publică&amp;quot;. O eliberare stabilă este menținută pentru încă câteva săptămâni. Iată ce folosesc distribuțiile Linux cu margini sângerânde, cum ar fi Arch Linux și Fedora Linux. Vă recomand să încercați mai întâi acest lucru linux-nextsau orice RC eliberează.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Release-uri LTS:&#039;&#039;&#039; Ultima lansare stabilă a unui anumit an este menținută pentru încă câțiva ani. Aceasta este, de obicei, o versiune mai veche, dar este menținută în mod activ cu remedieri de securitate. O versiune stabilă a Debian utilizează lansarea LTS a nucleului Linux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pregătirea sistemului&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Deoarece nucleul Linux este scris în limbajul de programare C, aveți nevoie de cel puțin un compilator C pentru a compila nucleul Linux. Există și alte astfel de dependențe care ar putea fi sau nu prezente pe computer.&lt;br /&gt;
&lt;br /&gt;
Acest ghid se va concentra pe compilarea kernel-ului Linux folosind GNU C Compiler (GCC). Dar poate într-un articol viitor (scufundându-mă în sprijinul Rust), voi acoperi folosind compilatorul Clang al LLVM ca alternativă la CCG.&lt;br /&gt;
&lt;br /&gt;
Comanda pentru Debian și derivații săi (Ubuntu):&lt;br /&gt;
&lt;br /&gt;
 sudo apt install bc binutils bison dwarves flex gcc git gnupg2 gzip libelf-dev libncurses5-dev libssl-dev make openssl pahole perl-base rsync tar xz-utils&lt;br /&gt;
&lt;br /&gt;
Comanda pentru Fedora și derivatele sale:&lt;br /&gt;
&lt;br /&gt;
 sudo dnf install binutils ncurses-devel /usr/include/{libelf.h,openssl/pkcs7.h} /usr/bin/{bc,bison,flex,gcc,git,gpg2,gzip,make,openssl,pahole,perl,rsync,tar,xz,zstd}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Descarcare kernel Linux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mergeți la kernel.org și pe pagină, găsiți prima versiune stabilă.&lt;br /&gt;
Puteți descărca marca de marcare făcând clic pe caseta galbenă mare. În timp ce vă bazați, descărcați și fișierul de semnătură PGP care se potrivește. Va fi la îndemână când vom verifica tarball într-un moment ulterior. Are extensia .tar.sign.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Verificarea autenticității tarballului&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Cum îți dai seama dacă taball-ul pe care tocmai l-ai descărcat este corupt sau nu? La nivel individual, un .tar corupt vă va irosi doar ceva timp, dar dacă acest lucru se face pentru o organizație, s-ar putea să faca lucrurile mai ușoare pentru un atacator.&lt;br /&gt;
&lt;br /&gt;
Pentru a verifica integritatea tarball-ului, prima data se va folosi unxz (alias pentru xz --decompress) pentru a decomprima .tar.xz in dosar.&lt;br /&gt;
&lt;br /&gt;
 unxz --keep linux-*.tar.xz&lt;br /&gt;
&lt;br /&gt;
Odată extrase, vom aduce cheile publice GPG pe care le folosesc Linus Torvalds și Greg KH. Aceste taste sunt folosite pentru a semna tar-ul.&lt;br /&gt;
&lt;br /&gt;
 gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org&lt;br /&gt;
&lt;br /&gt;
Ar trebui să obțineți ieșire care este similară cu ceea ce am primit pe mașina mea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org&lt;br /&gt;
gpg: /home/pratham/.gnupg/trustdb.gpg: trustdb created&lt;br /&gt;
gpg: key 38DBBDC86092693E: public key &amp;quot;Greg Kroah-Hartman &amp;lt;gregkh@kernel.org&amp;gt;&amp;quot; imported&lt;br /&gt;
gpg: Total number processed: 1&lt;br /&gt;
gpg:               imported: 1&lt;br /&gt;
gpg: key 79BE3E4300411886: public key &amp;quot;Linus Torvalds &amp;lt;torvalds@kernel.org&amp;gt;&amp;quot; imported&lt;br /&gt;
gpg: Total number processed: 1&lt;br /&gt;
gpg:               imported: 1&lt;br /&gt;
pub   rsa4096 2011-09-23 [SC]&lt;br /&gt;
      647F28654894E3BD457199BE38DBBDC86092693E&lt;br /&gt;
uid           [ unknown] Greg Kroah-Hartman &amp;lt;gregkh@kernel.org&amp;gt;&lt;br /&gt;
sub   rsa4096 2011-09-23 [E]&lt;br /&gt;
&lt;br /&gt;
pub   rsa2048 2011-09-20 [SC]&lt;br /&gt;
      ABAF11C65A2970B130ABE3C479BE3E4300411886&lt;br /&gt;
uid           [ unknown] Linus Torvalds &amp;lt;torvalds@kernel.org&amp;gt;&lt;br /&gt;
sub   rsa2048 2011-09-20 [E]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odată ce cheile lui Greg și Linus sunt importate, integritatea gudronului poate fi verificată folosind --verify; cum ar fi:&lt;br /&gt;
&lt;br /&gt;
 gpg2 --verify linux-*.tar.sign&lt;br /&gt;
&lt;br /&gt;
Dacă verificarea a avut succes, ar trebui să obțineți o producție similară cu următoarea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ gpg2 --verify linux-*.tar.sign&lt;br /&gt;
gpg: assuming signed data in &#039;linux-6.5.5.tar&#039;&lt;br /&gt;
gpg: Signature made Saturday 23 September 2023 02:46:13 PM IST&lt;br /&gt;
gpg:                using RSA key 647F28654894E3BD457199BE38DBBDC86092693E&lt;br /&gt;
gpg: Good signature from &amp;quot;Greg Kroah-Hartman &amp;lt;gregkh@kernel.org&amp;gt;&amp;quot; [unknown]&lt;br /&gt;
gpg: WARNING: This key is not certified with a trusted signature!&lt;br /&gt;
gpg:          There is no indication that the signature belongs to the owner.&lt;br /&gt;
Primary key fingerprint: 647F 2865 4894 E3BD 4571  99BE 38DB BDC8 6092 693E&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nota: Vă rugăm să nu continuați decât dacă vedeți un mesaj care spune gpg: Good signature!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Puteți ignora cu siguranță avertismentul care spune: AVERTISMENT: Această cheie nu este certificată cu o semnătură de încredere! Nu există niciun indiciu că semnătura aparține proprietarului.&lt;br /&gt;
&lt;br /&gt;
Am adus cheile de la e-mailurile lui Linus şi Greg şi nu am nevoie să ne facem griji pentru acest avertisment.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Extragerea tarball-ului&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dacă sunteți aici, înseamnă că verificarea integrității dvs. a fost finalizată cu succes. Acum, atunci, este timpul să extragem sursa kernel-ului Linux din ea.&lt;br /&gt;
&lt;br /&gt;
 tar -xf linux-*.tar&lt;br /&gt;
&lt;br /&gt;
Procesul de construcție al nucleul Linux caută un dosar .config. După cum sugerează și numele, este un fișier de configurare care specifică fiecare opțiune de configurare posibilă pentru nucleul Linux. Este necesar să avem unul.&lt;br /&gt;
&lt;br /&gt;
Există două metode de a obține acest dosarul .config pentru nucleul Linux:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Utilizarea configurației distribuției Linux ca bază (recomandat)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Folosind o configurație implicită, generică&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Există o a treia metodă în care puteți configura fiecare opțiune, de la zero, cu 12.000+ opțiuni. Acest lucru nu este recomandat deoarece este nevoie de mult timp pentru a configura totul cu mâna și, de asemenea, suficient know-how pentru a ști ce să activeze și să dezactivați.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utilizarea configurației furnizate de distribuție&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Utilizarea configurației furnizate de distribuția Linux este un pariu sigur. Dacă urmați acest ghid doar pentru a încerca un nou nucleu decât ceea ce oferă distribuția dvs., aceasta este metoda recomandată.&lt;br /&gt;
&lt;br /&gt;
Fișierul de configurare al distribuției Linux pentru kernel va fi în oricare dintre cele două locuri:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Cele mai multe distribuții Linux, cum ar fi Debian și Fedora, și derivatele lor o vor stoca ca /boot/config-$(uname -r).&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Unele distribuții Linux, cum ar fi Arch Linux, îl au integrat în nucleul Linux în sine. Prin urmare, va fi disponibil la /proc/config.gz.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dacă aveți ambele destinații disponibile, preferați să utilizați /proc/config.gz așa cum este pe un sistem de fișiere numai citit și, prin urmare, nemodonat.&lt;br /&gt;
&lt;br /&gt;
Intră în directorul care conține tarballul extras.&lt;br /&gt;
&lt;br /&gt;
 cd linux-*/&lt;br /&gt;
&lt;br /&gt;
Apoi, copiați fișierul de configurare al distribuției Linux:&lt;br /&gt;
&lt;br /&gt;
 ## Debian and Fedora&#039;s derivatives:&lt;br /&gt;
 $ cp /boot/config-&amp;quot;$(uname -r)&amp;quot; .config&lt;br /&gt;
&lt;br /&gt;
 ## Arch Linux and its derivatives:&lt;br /&gt;
 $ zcat /proc/config.gz &amp;gt; .config&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Actualizarea configurației&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Odată ce acest lucru este făcut, este timpul să &amp;quot;actualizați&amp;quot; fișierul de configurare. Vezi tu, există o mare probabilitate ca configurația pe care o oferă distribuția dvs. să fie mai veche decât nucleul Linux pe care îl construiți.&lt;br /&gt;
&lt;br /&gt;
Acest lucru se aplică distribuțiilor Linux cu update continuu, cum ar fi Arch Linux și Fedora. Niciuna dintre ele nu a lansat o actualizare doar pentru că există o nouă versiune disponibilă. Ei fac niște QA, care este obligat să ia timp. Și, prin urmare, chiar și cel mai recent sâmbure oferit de distribuția dvs. va fi câteva lansări minore în urmă, în comparație cu ceea ce veți obține de la kernel.org.&lt;br /&gt;
&lt;br /&gt;
Pentru a actualiza un existent .config, comanda make este folosită cu ținta olddefconfig.&lt;br /&gt;
&lt;br /&gt;
Acest lucru va lua &amp;quot;fiserul vechi de configurare&amp;quot; (care este salvat în prezent ca .config ca o copie literală a configurației distribuției dvs.) și verificați pentru orice opțiuni noi de configurare care au fost adăugate la baza de cod Linux de atunci. Dacă se găsesc opțiuni noi, neconfigurate, valoarea de configurare implicită pentru opțiunea respectivă este utilizată și dosarul .config este actualizat.&lt;br /&gt;
&lt;br /&gt;
Fisierul .config este redenumit în .config.old pe măsură ce backup-ul și noile modificări sunt scrise la .config.&lt;br /&gt;
&lt;br /&gt;
 make olddefconfig&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ file .config&lt;br /&gt;
.config: Linux make config build file, ASCII text&lt;br /&gt;
&lt;br /&gt;
$ make olddefconfig&lt;br /&gt;
  HOSTCC  scripts/basic/fixdep&lt;br /&gt;
  HOSTCC  scripts/kconfig/conf.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/confdata.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/expr.o&lt;br /&gt;
  LEX     scripts/kconfig/lexer.lex.c&lt;br /&gt;
  YACC    scripts/kconfig/parser.tab.[ch]&lt;br /&gt;
  HOSTCC  scripts/kconfig/lexer.lex.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/menu.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/parser.tab.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/preprocess.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/symbol.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/util.o&lt;br /&gt;
  HOSTLD  scripts/kconfig/conf&lt;br /&gt;
.config:8593:warning: symbol value &#039;m&#039; invalid for USB_FOTG210_HCD&lt;br /&gt;
.config:8859:warning: symbol value &#039;m&#039; invalid for USB_FOTG210_UDC&lt;br /&gt;
#&lt;br /&gt;
# configuration written to .config&lt;br /&gt;
#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru utilizatorii Debian și derivații săi&lt;br /&gt;
&lt;br /&gt;
Debian și derivatele sale folosesc un certificat pentru a semna modulele de kernel. Acest certificat, implicit, este absent pe computer.&lt;br /&gt;
&lt;br /&gt;
Vă recomand dezactivarea opțiunii care permite semnarea modulului. Se poate realiza cu următoarele comenzi:&lt;br /&gt;
&lt;br /&gt;
 ./scripts/config --file .config --disable MODULE_SIG&lt;br /&gt;
&lt;br /&gt;
Eșecul de a face acest lucru va duce la un eșec de construcție mai târziu, atunci când se ruleaza build-ul.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utilizarea unei configurații particularizate&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Puteți arunca o privire la ieșirea de &amp;quot;make help&amp;quot; pentru a vedea toate opțiunile disponibile, dar ne vom concentra pe trei tinte pentru make:&lt;br /&gt;
&lt;br /&gt;
  defconfig: Configurația implicită.&lt;br /&gt;
  allmodconfig: În funcție de starea actuală a sistemului, construiți elemente ca module încărcabile (în loc de încorporat) atunci când este posibil.&lt;br /&gt;
  tinyconfig: Un mic kernel Linux.&lt;br /&gt;
&lt;br /&gt;
La tinyconfig, timpii de construcție sunt în mod natural mai rapizi.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Modificarea configurației&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ai creat un dosar .config folosind o metodă de mai sus. Fie ai folosit-o pe cea pe care a folosit-o și la distribuirea Linux-ului, fie ai creat-o folosind defconfig.&lt;br /&gt;
&lt;br /&gt;
Oricum ar fi, căutați cum să o modificați. Cel mai fiabil mod de a face acest lucru este prin intermediul menuconfig sau nconfig.&lt;br /&gt;
&lt;br /&gt;
Ambele ținte fac același lucru, dar au o interfață diferită, nconfig este un pic mai intuitiv în căutarea opțiunilor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
  HOSTCC  scripts/kconfig/mconf.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/checklist.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/inputbox.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/menubox.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/textbox.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/util.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/yesno.o&lt;br /&gt;
  HOSTLD  scripts/kconfig/mconf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eticheta kernel-ului nostru poate fi configurată utilizând următoarea comandă:&lt;br /&gt;
&lt;br /&gt;
 ./scripts/config --file .config --set-str LOCALVERSION &amp;quot;-pratham&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Setează CONFIG_LOCALVERSION în dosarul .config.&lt;br /&gt;
&lt;br /&gt;
Acum, să construim kernel-ul în sine.&lt;br /&gt;
&lt;br /&gt;
 make -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Acest lucru este suficient pentru 99% dintre utilizatori.&lt;br /&gt;
&lt;br /&gt;
În funcție de arhitectura computerului dvs., numele imaginii de kernel Linux care se construiește (care este stocată în /boot) va varia.&lt;br /&gt;
&lt;br /&gt;
Pentru x86_64, numele imaginii nucleului Linux este bzImage. Deci, dacă doriți să construiți doar nucleul Linux în scopul de a-l porni, puteți specifica bzImage ca ţintă, aşa:&lt;br /&gt;
&lt;br /&gt;
 ## For x86_64&lt;br /&gt;
  $ make bzImage&lt;br /&gt;
 ## x86_64&lt;br /&gt;
  $ make -s image_name arch/x86/boot/bzImage&lt;br /&gt;
 ## AArch64&lt;br /&gt;
  $ make -s image_name arch/arm64/boot/Image.gz&lt;br /&gt;
 ## RISC-V&lt;br /&gt;
  $ make -s image_name arch/riscv/boot/Image.gz&lt;br /&gt;
&lt;br /&gt;
Și acum, pentru a construi doar imaginea de kernel Linux, puteți face acest lucru:&lt;br /&gt;
&lt;br /&gt;
 make $(make -s image_name | awk -F &#039;/&#039; &#039;{print $4}&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota&#039;&#039;&#039;: În cazul în care doriți să curățați artefactele comenzii make, puteți utiliza oricare dintre următoarele ținte pentru a atinge ceea ce doriți:&lt;br /&gt;
&lt;br /&gt;
    clean: Îndepărtați aproape orice, cu excepția .config.&lt;br /&gt;
    mrproper: șterge si .config.&lt;br /&gt;
    distclean: șterge fișiere de patch-uri.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Instalare&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Odată ce nucleul Linux a fost compilat, este timpul să instalați câteva lucruri.&lt;br /&gt;
&lt;br /&gt;
Există părți ale nucleului Linux care nu sunt necesare în timpul pornirii. Aceste piese sunt construite ca module loadabile (adică încărcate și descărcate atunci când este necesar).&lt;br /&gt;
&lt;br /&gt;
Să instalăm aceste module. Acest lucru se poate realiza cu make modules_install. Utilizarea de către sudo este necesara, deoarece modulele vor fi instalate în /lib/modules/&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;Și că directorul este deținut de root, nu şi utilizatorul tău.&lt;br /&gt;
&lt;br /&gt;
Acest lucru nu numai că va instala modulele kernel, ci și le va semna. Aşa că va dura ceva timp. Vestea bună este că puteți paraleliza acest lucru folosind cu -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
 sudo make modules_install -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Notă pentru dezvoltatori: Puteți specifica o cale diferită în cazul în care sunt stocate modulele Linux (în loc de /lib/modules/&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;) folosind INSTALL_MOD_PATHvariabilă ca și astfel:&lt;br /&gt;
&lt;br /&gt;
 sudo make modules_install INSTALL_MOD_PATH=&amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O altă notă pentru dezvoltatori: Puteți utiliza INSTALL_MOD_STRIPvariabil pentru a specifica dacă modulele ar trebui să fie deposedat de simbolurile de depanator sau nu. Simbolurile de depanarea nu sunt dezbrăcate dacă nu sunt definite. Când este setat la 1, ele sunt dezbrăcate folosind --strip-debugopţiunea, care este apoi trecută la strip(sau llvm-stripDacă Clang este utilizat) utilitate.&lt;br /&gt;
&lt;br /&gt;
[Opțional] Instalarea fișierelor de cap de nucleu Linux&lt;br /&gt;
&lt;br /&gt;
Dacă intenționați să utilizați acest sâmbure cu module în afara termenului, cum ar fi ZFS sau Nvidia DKMS, sau încercați să scrieți propriile module, cel mai probabil veți avea nevoie de fișierele de antet furnizate de sâmburele Linux.&lt;br /&gt;
&lt;br /&gt;
Capselele de sâmbure Linux pot fi instalate cu ajutorul headers_install:&lt;br /&gt;
&lt;br /&gt;
 sudo make headers_install&lt;br /&gt;
&lt;br /&gt;
Notă pentru dezvoltatori: Calea pentru instalarea antetului de sâmbure Linux poate fi suprasomit prin utilizarea variabilei INSTALL_HDR_PATH.&lt;br /&gt;
&lt;br /&gt;
Dacă sunteți pe x86_64, puteți sări peste acest pas!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Dacă ați construit pentru ARM sau RISC-V, este foarte probabil ca alergare makeDe asemenea, a construit binarele dispozitiv-axi-tree. Puteți cauta fisiere .dtb în arch/&amp;lt;machine_architecture&amp;gt;/boot/dts.&lt;br /&gt;
&lt;br /&gt;
Am un hack pentru a verifica acest lucru:&lt;br /&gt;
&lt;br /&gt;
## For AArch32&lt;br /&gt;
$ find arch/arm/boot/dts -name &amp;quot;*.dtb&amp;quot; -type f | head -n 1 &amp;gt; /dev/null &amp;amp;&amp;amp; echo &amp;quot;DTBs for ARM32 were built&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## For AArch64&lt;br /&gt;
$ find arch/arm64/boot/dts -name &amp;quot;*.dtb&amp;quot; -type f | head -n 1 &amp;gt; /dev/null &amp;amp;&amp;amp; echo &amp;quot;DTBs for ARM64 were built&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## For RISC-V&lt;br /&gt;
$ find arch/riscv/boot/dts -name &amp;quot;*.dtb&amp;quot; -type f | head -n 1 &amp;gt; /dev/null &amp;amp;&amp;amp; echo &amp;quot;DTBs for RISC-V were built&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dacă primești un mesaj pe care scria &amp;quot;DTB-uri pentru &amp;lt;arh&amp;gt; au fost construite&amp;quot;, continuați cu instalarea DTB-urilor. Asta se face cu dtbs_install- Ţintă.&lt;br /&gt;
&lt;br /&gt;
Utilizarea de către sudoeste necesar, deoarece acest lucru va fi instalat în /boot/dtb-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;care este deținută de root. .&lt;br /&gt;
&lt;br /&gt;
sudo make dtbs_install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;În cele din urmă, instalăm kernel-ul Linux în sine!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sudo make install&lt;br /&gt;
&lt;br /&gt;
Utilizarea de către sudo este necesara aici pentru că sâmburele Linux se instalează în /boot pe care utilizatorul dvs. normal nu are permisiunea de a scrie.&lt;br /&gt;
&lt;br /&gt;
În general, obiectivul de instalare va actualiza, de asemenea, încărcătorul de boot, dar dacă nu reușește, înseamnă că probabil aveți un bootloader neacceptat. Dacă nu utilizați GRUB ca bootloader, vă rugăm să citiți manualul bootloaderului dvs.&lt;br /&gt;
&lt;br /&gt;
Notă pentru dezvoltatori: De data aceasta; variabila INSTALL_PATH este utilizată pentru a specifica unde este instalat nucleul Linux, în loc de calea implicită care se află /boot.&lt;br /&gt;
&lt;br /&gt;
Pentru utilizatorii Arch Linux&lt;br /&gt;
&lt;br /&gt;
Dacă ai încercat să alergi pe make install, s-ar putea să fi observat că ai primit o eroare. Cum ar fi următorul:&lt;br /&gt;
&lt;br /&gt;
$ sudo make install&lt;br /&gt;
  INSTALL /boot&lt;br /&gt;
Cannot find LILO.&lt;br /&gt;
&lt;br /&gt;
Pentru a instala de fapt nucleul Linux pe Arch Linux, trebuie să copiem manual imaginea kernel Linux.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Acest lucru se poate face cu următoarea comandă:&lt;br /&gt;
sudo install -Dm644 &amp;quot;$(make -s image_name)&amp;quot; /boot/vmlinuz-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
Din moment ce a, compilat nucleul de 6.5, voi rula următoarea comandă, o voi regla conform nevoilor dumneavoastră:&lt;br /&gt;
sudo install -Dm644 &amp;quot;$(make -s image_name)&amp;quot; /boot/vmlinuz-6.5.5-pratham&lt;br /&gt;
Nu este necesar, dar trebuie să copiați și un fișier numit System.mapȘi în timp ce sunteți la ea, copiați .configFile de asemenea ;)&lt;br /&gt;
sudo cp -vf System.map /boot/System.map-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
sudo cp -vf .config /boot/config-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
Generează ramdisk inițial&lt;br /&gt;
S-ar putea să fi întâlnit o utilitară numită mkinitcpio când ai instalat Arch Linux. O vom folosi pentru a crea ramdik-ul inițial.&lt;br /&gt;
Pentru a face acest lucru, avem nevoie de o presetată mai întâi. Faceți acest lucru prin adăugarea următorului conținut la /etc/mkinitcpio.d/linux-&amp;lt;localversion&amp;gt;.preset. Înlocuiti &amp;lt;kernel_release&amp;gt; Și &amp;lt;localversion&amp;gt; După cum este necesar.&lt;br /&gt;
&lt;br /&gt;
ALL_config=&amp;quot;/etc/mkinitcpio.conf&amp;quot;&lt;br /&gt;
ALL_kver=&amp;quot;/boot/vmlinuz-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PRESETS=(&#039;default&#039; &#039;fallback&#039;)&lt;br /&gt;
&lt;br /&gt;
default_image=&amp;quot;/boot/initramfs-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;.img&amp;quot;&lt;br /&gt;
fallback_options=&amp;quot;-S autodetect&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Odată ce faceți acest lucru, rulați următoarea comandă pentru a genera ramdisk-ul inițial:&lt;br /&gt;
sudo mkinitcpio -p linux-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Urmează ieșirea de pe computerul meu, a ta ar trebui să fie și a ta similară!&lt;br /&gt;
&lt;br /&gt;
$ sudo mkinitcpio -p linux-pratham&lt;br /&gt;
==&amp;gt; Building image from preset: /etc/mkinitcpio.d/linux-pratham.preset: &#039;default&#039;&lt;br /&gt;
==&amp;gt; Using configuration file: &#039;/etc/mkinitcpio.conf&#039;&lt;br /&gt;
  -&amp;gt; -k /boot/vmlinuz-6.5.5-pratham -c /etc/mkinitcpio.conf -g /boot/initramfs-6.5.5-pratham.img&lt;br /&gt;
==&amp;gt; Starting build: &#039;6.5.5-pratham&#039;&lt;br /&gt;
  -&amp;gt; Running build hook: [base]&lt;br /&gt;
(...)&lt;br /&gt;
&lt;br /&gt;
Actualizare GRUB&lt;br /&gt;
sudo grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
Actualizarea GRUB nu va face ca nucleul mai nou să nu intre în mod implicit. Vă rugăm să-l selectați din meniul de boot în timpul bootarii. Puteți selecta versiunea mai nouă a nucleului Linux intrând în elementul de meniu &amp;quot;Opțiuni avansate pentru Arch Linux&amp;quot; - &amp;quot;Arch Linux, cu Linux &amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Nota&#039;&#039;&#039;: In AUR sunt pachete cu automatizeaza intreg procesul.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Felicitări! Ați finalizat toți pașii pentru a obține sursa nucleului Linux, configurând-o, construind-o și instalând-o.&lt;br /&gt;
&lt;br /&gt;
Vă rugăm să selectați versiunea corectă Linux kernel de la bootloader. Odată ce a pornit, rulați uname -rcomanda pentru a verifica dacă ați pornit folosind kernel-ul Linux intenționat.&lt;br /&gt;
&lt;br /&gt;
Mai jos este ieșirea de pe computerul meu:&lt;br /&gt;
&lt;br /&gt;
 $ uname -r&lt;br /&gt;
 6.5.5-pratham&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dezinstalare&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Fie distribuția Linux a expediat nucleul Linux cu versiunea pe care ați compilat-o manual, fie ați compilat un alt nucleu, mai nou și ați observat că ar trebui să dezinstalați nucleul mai vechi pentru a face spațiu pentru cel mai nou.&lt;br /&gt;
&lt;br /&gt;
Știm unde sunt instalate toate fișierele, astfel încât să fie mai ușor să le scoatem.&lt;br /&gt;
&lt;br /&gt;
 ## Remove kernel modules&lt;br /&gt;
 $ rm -rf /lib/modules/&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ## Remove device-tree binaries&lt;br /&gt;
 $ rm -rf /boot/dtb-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ## Remove the Linux kernel itself&lt;br /&gt;
 $ rm -vf /boot/{config,System,vmlinuz}-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Metoda alternativa ce creeaza pachete de instalare (Ubuntu), poate fi mai elegant.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## source&lt;br /&gt;
&lt;br /&gt;
apt source linux-image-unsigned-$(uname -r)&lt;br /&gt;
&lt;br /&gt;
chmod a+x debian/rules&lt;br /&gt;
chmod a+x debian/scripts/*&lt;br /&gt;
chmod a+x debian/scripts/misc/*&lt;br /&gt;
&lt;br /&gt;
fakeroot debian/rules clean&lt;br /&gt;
fakeroot debian/rules editconfigs # you need to go through each (Y, Exit, Y, Exit..) or get a complaint about config later&lt;br /&gt;
&lt;br /&gt;
## build&lt;br /&gt;
&lt;br /&gt;
fakeroot debian/rules clean&lt;br /&gt;
&lt;br /&gt;
# quicker build:&lt;br /&gt;
fakeroot debian/rules binary-headers binary-generic binary-perarch&lt;br /&gt;
&lt;br /&gt;
# if you need linux-tools or lowlatency kernel, run instead:&lt;br /&gt;
fakeroot debian/rules binary&lt;br /&gt;
&lt;br /&gt;
##install&lt;br /&gt;
&lt;br /&gt;
cd ..&lt;br /&gt;
ls *.deb&lt;br /&gt;
    linux-headers-4.8.0-17_4.8.0-17.19_all.deb&lt;br /&gt;
    linux-headers-4.8.0-17-generic_4.8.0-17.19_amd64.deb&lt;br /&gt;
    linux-image-4.8.0-17-generic_4.8.0-17.19_amd64.deb&lt;br /&gt;
&lt;br /&gt;
dpkg -i *.deb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Advanced_Pagina_7|Pagina anterioară]] | [[Advanced_Pagina_9|Ultima pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_8&amp;diff=532</id>
		<title>Advanced Pagina 8</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_8&amp;diff=532"/>
		<updated>2024-11-12T15:01:07Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Compilare kernel==&lt;br /&gt;
&lt;br /&gt;
S-ar putea să vă interesați să compilați singur nucleul Linux, din mai multe motive. S-ar putea să fie, dar nu limitat la, una dintre următoarele:&lt;br /&gt;
&lt;br /&gt;
-Încercarea unui nucleu mai nou decât ceea ce oferă distribuția Linux&lt;br /&gt;
&lt;br /&gt;
-Construirea unui kernel cu un set diferit de opțiuni de configurare și/sau drivere&lt;br /&gt;
&lt;br /&gt;
-Curiozitatea unui elev :)&lt;br /&gt;
&lt;br /&gt;
Acest ghid vă va arăta cum puteți compila singur nucleul Linux, cu comenzile pe care ar trebui să le rulați, de ce să rulați aceste comenzi și să explicați ce face.&lt;br /&gt;
&lt;br /&gt;
Distribuțiile precum Ubuntu au modalități mai ușoare de a instala kernel-ul. Dar acest tutorial este despre a face lucrurile manual de la codul sursă. Veți avea nevoie de timp, răbdare și experiență bună cu linia de comandă Linux pentru acest tutorial. Este vorba mai mult despre a experimenta lucrurile la prima mână. Cu toate acestea, vă sfătuiesc să încercați această aventură într-un VM sau pe sistemul dvs. de rezervă în loc să o faceți pe sistemul dvs. principal.&lt;br /&gt;
Pre-requisite-uri&lt;br /&gt;
&lt;br /&gt;
Există două condiții prealabile pentru a construi orice (în context cu software-ul).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Codul sursă&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Dependențele pentru build&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Deci, ca premise, vom descărca sursa kernel-ului Linux și vom instala câteva dependențe care ne vor permite să il compilam.&lt;br /&gt;
&lt;br /&gt;
Există in principal 4 &amp;quot;variante&amp;quot; ale Linux, dupa ordinea fluxului de dezvoltare:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;linux-next:&#039;&#039;&#039; Orice cod care urmează să fie fuzionat în baza de cod Linux este mai întâi îmbinat în linux-next- Arbore. Aceasta este cea mai nouă, dar și cea mai &amp;quot;centr stabilă&amp;quot; stare de nucleu Linux. Majoritatea dezvoltatorilor și testerii de nucleu Linux folosesc acest lucru pentru a rafina calitatea codului pentru ca Linus să tragă, mai târziu.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;linux-mainline.&#039;&#039;&#039; Versiunea beta a acestei versiuni se numește o versiune RC (Release Candidate). Odată ce un RC este eliberat, Linus acceptă numai bug-fixes și patch-uri legate de regresie a performanței. Linus continuă să elibereze un kernel RC în fiecare săptămână până când este mulțumit de cod (cu feedback de la utilizatori). linux-rc, urmat de un număr, este adăugat pentru a indica versiunea de lansare RC.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Release-uri stabile:&#039;&#039;&#039; Odată ce Linus simte că ultimul RC a fost stabil, el lansează eliberarea finală, &amp;quot;publică&amp;quot;. O eliberare stabilă este menținută pentru încă câteva săptămâni. Iată ce folosesc distribuțiile Linux cu margini sângerânde, cum ar fi Arch Linux și Fedora Linux. Vă recomand să încercați mai întâi acest lucru linux-nextsau orice RC eliberează.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Release-uri LTS:&#039;&#039;&#039; Ultima lansare stabilă a unui anumit an este menținută pentru încă câțiva ani. Aceasta este, de obicei, o versiune mai veche, dar este menținută în mod activ cu remedieri de securitate. O versiune stabilă a Debian utilizează lansarea LTS a nucleului Linux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pregătirea sistemului&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Deoarece nucleul Linux este scris în limbajul de programare C, aveți nevoie de cel puțin un compilator C pentru a compila nucleul Linux. Există și alte astfel de dependențe care ar putea fi sau nu prezente pe computer.&lt;br /&gt;
&lt;br /&gt;
Acest ghid se va concentra pe compilarea kernel-ului Linux folosind GNU C Compiler (GCC). Dar poate într-un articol viitor (scufundându-mă în sprijinul Rust), voi acoperi folosind compilatorul Clang al LLVM ca alternativă la CCG.&lt;br /&gt;
&lt;br /&gt;
Comanda pentru Debian și derivații săi (Ubuntu):&lt;br /&gt;
&lt;br /&gt;
 sudo apt install bc binutils bison dwarves flex gcc git gnupg2 gzip libelf-dev libncurses5-dev libssl-dev make openssl pahole perl-base rsync tar xz-utils&lt;br /&gt;
&lt;br /&gt;
Comanda pentru Fedora și derivatele sale:&lt;br /&gt;
&lt;br /&gt;
 sudo dnf install binutils ncurses-devel /usr/include/{libelf.h,openssl/pkcs7.h} /usr/bin/{bc,bison,flex,gcc,git,gpg2,gzip,make,openssl,pahole,perl,rsync,tar,xz,zstd}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Descarcare kernel Linux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mergeți la kernel.org și pe pagină, găsiți prima versiune stabilă.&lt;br /&gt;
Puteți descărca marca de marcare făcând clic pe caseta galbenă mare. În timp ce vă bazați, descărcați și fișierul de semnătură PGP care se potrivește. Va fi la îndemână când vom verifica tarball într-un moment ulterior. Are extensia .tar.sign.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Verificarea autenticității tarballului&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Cum îți dai seama dacă taball-ul pe care tocmai l-ai descărcat este corupt sau nu? La nivel individual, un .tar corupt vă va irosi doar ceva timp, dar dacă acest lucru se face pentru o organizație, s-ar putea să faca lucrurile mai ușoare pentru un atacator.&lt;br /&gt;
&lt;br /&gt;
Pentru a verifica integritatea tarball-ului, prima data se va folosi unxz (alias pentru xz --decompress) pentru a decomprima .tar.xz in dosar.&lt;br /&gt;
&lt;br /&gt;
 unxz --keep linux-*.tar.xz&lt;br /&gt;
&lt;br /&gt;
Odată extrase, vom aduce cheile publice GPG pe care le folosesc Linus Torvalds și Greg KH. Aceste taste sunt folosite pentru a semna tar-ul.&lt;br /&gt;
&lt;br /&gt;
 gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org&lt;br /&gt;
&lt;br /&gt;
Ar trebui să obțineți ieșire care este similară cu ceea ce am primit pe mașina mea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org&lt;br /&gt;
gpg: /home/pratham/.gnupg/trustdb.gpg: trustdb created&lt;br /&gt;
gpg: key 38DBBDC86092693E: public key &amp;quot;Greg Kroah-Hartman &amp;lt;gregkh@kernel.org&amp;gt;&amp;quot; imported&lt;br /&gt;
gpg: Total number processed: 1&lt;br /&gt;
gpg:               imported: 1&lt;br /&gt;
gpg: key 79BE3E4300411886: public key &amp;quot;Linus Torvalds &amp;lt;torvalds@kernel.org&amp;gt;&amp;quot; imported&lt;br /&gt;
gpg: Total number processed: 1&lt;br /&gt;
gpg:               imported: 1&lt;br /&gt;
pub   rsa4096 2011-09-23 [SC]&lt;br /&gt;
      647F28654894E3BD457199BE38DBBDC86092693E&lt;br /&gt;
uid           [ unknown] Greg Kroah-Hartman &amp;lt;gregkh@kernel.org&amp;gt;&lt;br /&gt;
sub   rsa4096 2011-09-23 [E]&lt;br /&gt;
&lt;br /&gt;
pub   rsa2048 2011-09-20 [SC]&lt;br /&gt;
      ABAF11C65A2970B130ABE3C479BE3E4300411886&lt;br /&gt;
uid           [ unknown] Linus Torvalds &amp;lt;torvalds@kernel.org&amp;gt;&lt;br /&gt;
sub   rsa2048 2011-09-20 [E]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odată ce cheile lui Greg și Linus sunt importate, integritatea gudronului poate fi verificată folosind --verify; cum ar fi:&lt;br /&gt;
&lt;br /&gt;
 gpg2 --verify linux-*.tar.sign&lt;br /&gt;
&lt;br /&gt;
Dacă verificarea a avut succes, ar trebui să obțineți o producție similară cu următoarea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ gpg2 --verify linux-*.tar.sign&lt;br /&gt;
gpg: assuming signed data in &#039;linux-6.5.5.tar&#039;&lt;br /&gt;
gpg: Signature made Saturday 23 September 2023 02:46:13 PM IST&lt;br /&gt;
gpg:                using RSA key 647F28654894E3BD457199BE38DBBDC86092693E&lt;br /&gt;
gpg: Good signature from &amp;quot;Greg Kroah-Hartman &amp;lt;gregkh@kernel.org&amp;gt;&amp;quot; [unknown]&lt;br /&gt;
gpg: WARNING: This key is not certified with a trusted signature!&lt;br /&gt;
gpg:          There is no indication that the signature belongs to the owner.&lt;br /&gt;
Primary key fingerprint: 647F 2865 4894 E3BD 4571  99BE 38DB BDC8 6092 693E&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nota: Vă rugăm să nu continuați decât dacă vedeți un mesaj care spune gpg: Good signature!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Puteți ignora cu siguranță avertismentul care spune: AVERTISMENT: Această cheie nu este certificată cu o semnătură de încredere! Nu există niciun indiciu că semnătura aparține proprietarului.&lt;br /&gt;
&lt;br /&gt;
Am adus cheile de la e-mailurile lui Linus şi Greg şi nu am nevoie să ne facem griji pentru acest avertisment.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Extragerea tarball-ului&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dacă sunteți aici, înseamnă că verificarea integrității dvs. a fost finalizată cu succes. Acum, atunci, este timpul să extragem sursa kernel-ului Linux din ea.&lt;br /&gt;
&lt;br /&gt;
 tar -xf linux-*.tar&lt;br /&gt;
&lt;br /&gt;
Procesul de construcție al nucleul Linux caută un dosar .config. După cum sugerează și numele, este un fișier de configurare care specifică fiecare opțiune de configurare posibilă pentru nucleul Linux. Este necesar să avem unul.&lt;br /&gt;
&lt;br /&gt;
Există două metode de a obține acest dosarul .config pentru nucleul Linux:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Utilizarea configurației distribuției Linux ca bază (recomandat)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Folosind o configurație implicită, generică&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Există o a treia metodă în care puteți configura fiecare opțiune, de la zero, cu 12.000+ opțiuni. Acest lucru nu este recomandat deoarece este nevoie de mult timp pentru a configura totul cu mâna și, de asemenea, suficient know-how pentru a ști ce să activeze și să dezactivați.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utilizarea configurației furnizate de distribuție&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Utilizarea configurației furnizate de distribuția Linux este un pariu sigur. Dacă urmați acest ghid doar pentru a încerca un nou nucleu decât ceea ce oferă distribuția dvs., aceasta este metoda recomandată.&lt;br /&gt;
&lt;br /&gt;
Fișierul de configurare al distribuției Linux pentru kernel va fi în oricare dintre cele două locuri:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Cele mai multe distribuții Linux, cum ar fi Debian și Fedora, și derivatele lor o vor stoca ca /boot/config-$(uname -r).&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Unele distribuții Linux, cum ar fi Arch Linux, îl au integrat în nucleul Linux în sine. Prin urmare, va fi disponibil la /proc/config.gz.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dacă aveți ambele destinații disponibile, preferați să utilizați /proc/config.gz așa cum este pe un sistem de fișiere numai citit și, prin urmare, nemodonat.&lt;br /&gt;
&lt;br /&gt;
Intră în directorul care conține tarballul extras.&lt;br /&gt;
&lt;br /&gt;
 cd linux-*/&lt;br /&gt;
&lt;br /&gt;
Apoi, copiați fișierul de configurare al distribuției Linux:&lt;br /&gt;
&lt;br /&gt;
 ## Debian and Fedora&#039;s derivatives:&lt;br /&gt;
 $ cp /boot/config-&amp;quot;$(uname -r)&amp;quot; .config&lt;br /&gt;
&lt;br /&gt;
 ## Arch Linux and its derivatives:&lt;br /&gt;
 $ zcat /proc/config.gz &amp;gt; .config&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Actualizarea configurației&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Odată ce acest lucru este făcut, este timpul să &amp;quot;actualizați&amp;quot; fișierul de configurare. Vezi tu, există o mare probabilitate ca configurația pe care o oferă distribuția dvs. să fie mai veche decât nucleul Linux pe care îl construiți.&lt;br /&gt;
&lt;br /&gt;
Acest lucru se aplică distribuțiilor Linux cu update continuu, cum ar fi Arch Linux și Fedora. Niciuna dintre ele nu a lansat o actualizare doar pentru că există o nouă versiune disponibilă. Ei fac niște QA, care este obligat să ia timp. Și, prin urmare, chiar și cel mai recent sâmbure oferit de distribuția dvs. va fi câteva lansări minore în urmă, în comparație cu ceea ce veți obține de la kernel.org.&lt;br /&gt;
&lt;br /&gt;
Pentru a actualiza un existent .config, comanda make este folosită cu ținta olddefconfig.&lt;br /&gt;
&lt;br /&gt;
Acest lucru va lua &amp;quot;fiserul vechi de configurare&amp;quot; (care este salvat în prezent ca .config ca o copie literală a configurației distribuției dvs.) și verificați pentru orice opțiuni noi de configurare care au fost adăugate la baza de cod Linux de atunci. Dacă se găsesc opțiuni noi, neconfigurate, valoarea de configurare implicită pentru opțiunea respectivă este utilizată și dosarul .config este actualizat.&lt;br /&gt;
&lt;br /&gt;
Fisierul .config este redenumit în .config.old pe măsură ce backup-ul și noile modificări sunt scrise la .config.&lt;br /&gt;
&lt;br /&gt;
 make olddefconfig&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ file .config&lt;br /&gt;
.config: Linux make config build file, ASCII text&lt;br /&gt;
&lt;br /&gt;
$ make olddefconfig&lt;br /&gt;
  HOSTCC  scripts/basic/fixdep&lt;br /&gt;
  HOSTCC  scripts/kconfig/conf.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/confdata.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/expr.o&lt;br /&gt;
  LEX     scripts/kconfig/lexer.lex.c&lt;br /&gt;
  YACC    scripts/kconfig/parser.tab.[ch]&lt;br /&gt;
  HOSTCC  scripts/kconfig/lexer.lex.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/menu.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/parser.tab.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/preprocess.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/symbol.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/util.o&lt;br /&gt;
  HOSTLD  scripts/kconfig/conf&lt;br /&gt;
.config:8593:warning: symbol value &#039;m&#039; invalid for USB_FOTG210_HCD&lt;br /&gt;
.config:8859:warning: symbol value &#039;m&#039; invalid for USB_FOTG210_UDC&lt;br /&gt;
#&lt;br /&gt;
# configuration written to .config&lt;br /&gt;
#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru utilizatorii Debian și derivații săi&lt;br /&gt;
&lt;br /&gt;
Debian și derivatele sale folosesc un certificat pentru a semna modulele de kernel. Acest certificat, implicit, este absent pe computer.&lt;br /&gt;
&lt;br /&gt;
Vă recomand dezactivarea opțiunii care permite semnarea modulului. Se poate realiza cu următoarele comenzi:&lt;br /&gt;
&lt;br /&gt;
 ./scripts/config --file .config --disable MODULE_SIG&lt;br /&gt;
&lt;br /&gt;
Eșecul de a face acest lucru va duce la un eșec de construcție mai târziu, atunci când se ruleaza build-ul.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utilizarea unei configurații particularizate&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Puteți arunca o privire la ieșirea de &amp;quot;make help&amp;quot; pentru a vedea toate opțiunile disponibile, dar ne vom concentra pe trei tinte pentru make:&lt;br /&gt;
&lt;br /&gt;
  defconfig: Configurația implicită.&lt;br /&gt;
  allmodconfig: În funcție de starea actuală a sistemului, construiți elemente ca module încărcabile (în loc de încorporat) atunci când este posibil.&lt;br /&gt;
  tinyconfig: Un mic kernel Linux.&lt;br /&gt;
&lt;br /&gt;
La tinyconfig, timpii de construcție sunt în mod natural mai rapizi.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Modificarea configurației&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ai creat un dosar .config folosind o metodă de mai sus. Fie ai folosit-o pe cea pe care a folosit-o și la distribuirea Linux-ului, fie ai creat-o folosind defconfig.&lt;br /&gt;
&lt;br /&gt;
Oricum ar fi, căutați cum să o modificați. Cel mai fiabil mod de a face acest lucru este prin intermediul menuconfig sau nconfig.&lt;br /&gt;
&lt;br /&gt;
Ambele ținte fac același lucru, dar au o interfață diferită, nconfig este un pic mai intuitiv în căutarea opțiunilor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
  HOSTCC  scripts/kconfig/mconf.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/checklist.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/inputbox.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/menubox.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/textbox.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/util.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/yesno.o&lt;br /&gt;
  HOSTLD  scripts/kconfig/mconf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eticheta kernel-ului nostru poate fi configurată utilizând următoarea comandă:&lt;br /&gt;
&lt;br /&gt;
 ./scripts/config --file .config --set-str LOCALVERSION &amp;quot;-pratham&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Setează CONFIG_LOCALVERSION în dosarul .config.&lt;br /&gt;
&lt;br /&gt;
Acum, să construim kernel-ul în sine.&lt;br /&gt;
&lt;br /&gt;
 make -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Acest lucru este suficient pentru 99% dintre utilizatori.&lt;br /&gt;
&lt;br /&gt;
În funcție de arhitectura computerului dvs., numele imaginii de kernel Linux care se construiește (care este stocată în /boot) va varia.&lt;br /&gt;
&lt;br /&gt;
Pentru x86_64, numele imaginii nucleului Linux este bzImage. Deci, dacă doriți să construiți doar nucleul Linux în scopul de a-l porni, puteți specifica bzImage ca ţintă, aşa:&lt;br /&gt;
&lt;br /&gt;
 ## For x86_64&lt;br /&gt;
  $ make bzImage&lt;br /&gt;
 ## x86_64&lt;br /&gt;
  $ make -s image_name arch/x86/boot/bzImage&lt;br /&gt;
 ## AArch64&lt;br /&gt;
  $ make -s image_name arch/arm64/boot/Image.gz&lt;br /&gt;
 ## RISC-V&lt;br /&gt;
  $ make -s image_name arch/riscv/boot/Image.gz&lt;br /&gt;
&lt;br /&gt;
Și acum, pentru a construi doar imaginea de kernel Linux, puteți face acest lucru:&lt;br /&gt;
&lt;br /&gt;
 make $(make -s image_name | awk -F &#039;/&#039; &#039;{print $4}&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota&#039;&#039;&#039;: În cazul în care doriți să curățați artefactele comenzii make, puteți utiliza oricare dintre următoarele ținte pentru a atinge ceea ce doriți:&lt;br /&gt;
&lt;br /&gt;
    clean: Îndepărtați aproape orice, cu excepția .config.&lt;br /&gt;
    mrproper: șterge si .config.&lt;br /&gt;
    distclean: șterge fișiere de patch-uri.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Instalare&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Odată ce nucleul Linux a fost compilat, este timpul să instalați câteva lucruri.&lt;br /&gt;
&lt;br /&gt;
Există părți ale nucleului Linux care nu sunt necesare în timpul pornirii. Aceste piese sunt construite ca module loadabile (adică încărcate și descărcate atunci când este necesar).&lt;br /&gt;
&lt;br /&gt;
Să instalăm aceste module. Acest lucru se poate realiza cu make modules_install. Utilizarea de către sudo este necesara, deoarece modulele vor fi instalate în /lib/modules/&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;Și că directorul este deținut de root, nu şi utilizatorul tău.&lt;br /&gt;
&lt;br /&gt;
Acest lucru nu numai că va instala modulele kernel, ci și le va semna. Aşa că va dura ceva timp. Vestea bună este că puteți paraleliza acest lucru folosind cu -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
 sudo make modules_install -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Notă pentru dezvoltatori: Puteți specifica o cale diferită în cazul în care sunt stocate modulele Linux (în loc de /lib/modules/&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;) folosind INSTALL_MOD_PATHvariabilă ca și astfel:&lt;br /&gt;
&lt;br /&gt;
 sudo make modules_install INSTALL_MOD_PATH=&amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O altă notă pentru dezvoltatori: Puteți utiliza INSTALL_MOD_STRIPvariabil pentru a specifica dacă modulele ar trebui să fie deposedat de simbolurile de depanator sau nu. Simbolurile de depanarea nu sunt dezbrăcate dacă nu sunt definite. Când este setat la 1, ele sunt dezbrăcate folosind --strip-debugopţiunea, care este apoi trecută la strip(sau llvm-stripDacă Clang este utilizat) utilitate.&lt;br /&gt;
&lt;br /&gt;
[Opțional] Instalarea fișierelor de cap de nucleu Linux&lt;br /&gt;
&lt;br /&gt;
Dacă intenționați să utilizați acest sâmbure cu module în afara termenului, cum ar fi ZFS sau Nvidia DKMS, sau încercați să scrieți propriile module, cel mai probabil veți avea nevoie de fișierele de antet furnizate de sâmburele Linux.&lt;br /&gt;
&lt;br /&gt;
Capselele de sâmbure Linux pot fi instalate cu ajutorul headers_install:&lt;br /&gt;
&lt;br /&gt;
 sudo make headers_install&lt;br /&gt;
&lt;br /&gt;
Notă pentru dezvoltatori: Calea pentru instalarea antetului de sâmbure Linux poate fi suprasomit prin utilizarea variabilei INSTALL_HDR_PATH.&lt;br /&gt;
&lt;br /&gt;
Dacă sunteți pe x86_64, puteți sări peste acest pas!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Dacă ați construit pentru ARM sau RISC-V, este foarte probabil ca alergare makeDe asemenea, a construit binarele dispozitiv-axi-tree. Puteți cauta fisiere .dtb în arch/&amp;lt;machine_architecture&amp;gt;/boot/dts.&lt;br /&gt;
&lt;br /&gt;
Am un hack pentru a verifica acest lucru:&lt;br /&gt;
&lt;br /&gt;
## For AArch32&lt;br /&gt;
$ find arch/arm/boot/dts -name &amp;quot;*.dtb&amp;quot; -type f | head -n 1 &amp;gt; /dev/null &amp;amp;&amp;amp; echo &amp;quot;DTBs for ARM32 were built&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## For AArch64&lt;br /&gt;
$ find arch/arm64/boot/dts -name &amp;quot;*.dtb&amp;quot; -type f | head -n 1 &amp;gt; /dev/null &amp;amp;&amp;amp; echo &amp;quot;DTBs for ARM64 were built&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## For RISC-V&lt;br /&gt;
$ find arch/riscv/boot/dts -name &amp;quot;*.dtb&amp;quot; -type f | head -n 1 &amp;gt; /dev/null &amp;amp;&amp;amp; echo &amp;quot;DTBs for RISC-V were built&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dacă primești un mesaj pe care scria &amp;quot;DTB-uri pentru &amp;lt;arh&amp;gt; au fost construite&amp;quot;, continuați cu instalarea DTB-urilor. Asta se face cu dtbs_install- Ţintă.&lt;br /&gt;
&lt;br /&gt;
Utilizarea de către sudoeste necesar, deoarece acest lucru va fi instalat în /boot/dtb-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;care este deținută de root. .&lt;br /&gt;
&lt;br /&gt;
sudo make dtbs_install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;În cele din urmă, instalăm kernel-ul Linux în sine!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sudo make install&lt;br /&gt;
&lt;br /&gt;
Utilizarea de către sudo este necesara aici pentru că sâmburele Linux se instalează în /boot pe care utilizatorul dvs. normal nu are permisiunea de a scrie.&lt;br /&gt;
&lt;br /&gt;
În general, obiectivul de instalare va actualiza, de asemenea, încărcătorul de boot, dar dacă nu reușește, înseamnă că probabil aveți un bootloader neacceptat. Dacă nu utilizați GRUB ca bootloader, vă rugăm să citiți manualul bootloaderului dvs.&lt;br /&gt;
&lt;br /&gt;
Notă pentru dezvoltatori: De data aceasta; variabila INSTALL_PATH este utilizată pentru a specifica unde este instalat nucleul Linux, în loc de calea implicită care se află /boot.&lt;br /&gt;
&lt;br /&gt;
Pentru utilizatorii Arch Linux&lt;br /&gt;
&lt;br /&gt;
Dacă ai încercat să alergi pe make install, s-ar putea să fi observat că ai primit o eroare. Cum ar fi următorul:&lt;br /&gt;
&lt;br /&gt;
$ sudo make install&lt;br /&gt;
  INSTALL /boot&lt;br /&gt;
Cannot find LILO.&lt;br /&gt;
&lt;br /&gt;
Pentru a instala de fapt nucleul Linux pe Arch Linux, trebuie să copiem manual imaginea kernel Linux.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Acest lucru se poate face cu următoarea comandă:&lt;br /&gt;
sudo install -Dm644 &amp;quot;$(make -s image_name)&amp;quot; /boot/vmlinuz-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
Din moment ce a, compilat nucleul de 6.5, voi rula următoarea comandă, o voi regla conform nevoilor dumneavoastră:&lt;br /&gt;
sudo install -Dm644 &amp;quot;$(make -s image_name)&amp;quot; /boot/vmlinuz-6.5.5-pratham&lt;br /&gt;
Nu este necesar, dar trebuie să copiați și un fișier numit System.mapȘi în timp ce sunteți la ea, copiați .configFile de asemenea ;)&lt;br /&gt;
sudo cp -vf System.map /boot/System.map-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
sudo cp -vf .config /boot/config-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
Generează ramdisk inițial&lt;br /&gt;
S-ar putea să fi întâlnit o utilitară numită mkinitcpio când ai instalat Arch Linux. O vom folosi pentru a crea ramdik-ul inițial.&lt;br /&gt;
Pentru a face acest lucru, avem nevoie de o presetată mai întâi. Faceți acest lucru prin adăugarea următorului conținut la /etc/mkinitcpio.d/linux-&amp;lt;localversion&amp;gt;.preset. Înlocuiti &amp;lt;kernel_release&amp;gt; Și &amp;lt;localversion&amp;gt; După cum este necesar.&lt;br /&gt;
&lt;br /&gt;
ALL_config=&amp;quot;/etc/mkinitcpio.conf&amp;quot;&lt;br /&gt;
ALL_kver=&amp;quot;/boot/vmlinuz-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PRESETS=(&#039;default&#039; &#039;fallback&#039;)&lt;br /&gt;
&lt;br /&gt;
default_image=&amp;quot;/boot/initramfs-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;.img&amp;quot;&lt;br /&gt;
fallback_options=&amp;quot;-S autodetect&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Odată ce faceți acest lucru, rulați următoarea comandă pentru a genera ramdisk-ul inițial:&lt;br /&gt;
sudo mkinitcpio -p linux-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Urmează ieșirea de pe computerul meu, a ta ar trebui să fie și a ta similară!&lt;br /&gt;
&lt;br /&gt;
$ sudo mkinitcpio -p linux-pratham&lt;br /&gt;
==&amp;gt; Building image from preset: /etc/mkinitcpio.d/linux-pratham.preset: &#039;default&#039;&lt;br /&gt;
==&amp;gt; Using configuration file: &#039;/etc/mkinitcpio.conf&#039;&lt;br /&gt;
  -&amp;gt; -k /boot/vmlinuz-6.5.5-pratham -c /etc/mkinitcpio.conf -g /boot/initramfs-6.5.5-pratham.img&lt;br /&gt;
==&amp;gt; Starting build: &#039;6.5.5-pratham&#039;&lt;br /&gt;
  -&amp;gt; Running build hook: [base]&lt;br /&gt;
(...)&lt;br /&gt;
&lt;br /&gt;
Actualizare GRUB&lt;br /&gt;
sudo grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
Actualizarea GRUB nu va face ca nucleul mai nou să nu intre în mod implicit. Vă rugăm să-l selectați din meniul de boot în timpul bootarii. Puteți selecta versiunea mai nouă a nucleului Linux intrând în elementul de meniu &amp;quot;Opțiuni avansate pentru Arch Linux&amp;quot; - &amp;quot;Arch Linux, cu Linux &amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Nota&#039;&#039;&#039;: In AUR sunt pachete cu automatizeaza intreg procesul.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Felicitări! Ați finalizat toți pașii pentru a obține sursa nucleului Linux, configurând-o, construind-o și instalând-o.&lt;br /&gt;
&lt;br /&gt;
Vă rugăm să selectați versiunea corectă Linux kernel de la bootloader. Odată ce a pornit, rulați uname -rcomanda pentru a verifica dacă ați pornit folosind kernel-ul Linux intenționat.&lt;br /&gt;
&lt;br /&gt;
Mai jos este ieșirea de pe computerul meu:&lt;br /&gt;
&lt;br /&gt;
 $ uname -r&lt;br /&gt;
 6.5.5-pratham&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dezinstalare&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Fie distribuția Linux a expediat nucleul Linux cu versiunea pe care ați compilat-o manual, fie ați compilat un alt nucleu, mai nou și ați observat că ar trebui să dezinstalați nucleul mai vechi pentru a face spațiu pentru cel mai nou.&lt;br /&gt;
&lt;br /&gt;
Știm unde sunt instalate toate fișierele, astfel încât să fie mai ușor să le scoatem.&lt;br /&gt;
&lt;br /&gt;
 ## Remove kernel modules&lt;br /&gt;
 $ rm -rf /lib/modules/&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ## Remove device-tree binaries&lt;br /&gt;
 $ rm -rf /boot/dtb-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ## Remove the Linux kernel itself&lt;br /&gt;
 $ rm -vf /boot/{config,System,vmlinuz}-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Metoda alternativa ce creeaza pachete de instalare&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## source&lt;br /&gt;
apt source linux-image-unsigned-$(uname -r)&lt;br /&gt;
chmod a+x debian/rules&lt;br /&gt;
chmod a+x debian/scripts/*&lt;br /&gt;
chmod a+x debian/scripts/misc/*&lt;br /&gt;
fakeroot debian/rules clean&lt;br /&gt;
fakeroot debian/rules editconfigs # you need to go through each (Y, Exit, Y, Exit..) or get a complaint about config later&lt;br /&gt;
## build&lt;br /&gt;
&lt;br /&gt;
fakeroot debian/rules clean&lt;br /&gt;
&lt;br /&gt;
# quicker build:&lt;br /&gt;
fakeroot debian/rules binary-headers binary-generic binary-perarch&lt;br /&gt;
&lt;br /&gt;
# if you need linux-tools or lowlatency kernel, run instead:&lt;br /&gt;
fakeroot debian/rules binary&lt;br /&gt;
&lt;br /&gt;
##install&lt;br /&gt;
cd ..&lt;br /&gt;
ls *.deb&lt;br /&gt;
    linux-headers-4.8.0-17_4.8.0-17.19_all.deb&lt;br /&gt;
    linux-headers-4.8.0-17-generic_4.8.0-17.19_amd64.deb&lt;br /&gt;
    linux-image-4.8.0-17-generic_4.8.0-17.19_amd64.deb&lt;br /&gt;
&lt;br /&gt;
dpkg -i *.deb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Advanced_Pagina_7|Pagina anterioară]] | [[Advanced_Pagina_9|Ultima pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_8&amp;diff=531</id>
		<title>Advanced Pagina 8</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_8&amp;diff=531"/>
		<updated>2024-11-12T14:56:59Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Compilare kernel==&lt;br /&gt;
&lt;br /&gt;
S-ar putea să vă interesați să compilați singur nucleul Linux, din mai multe motive. S-ar putea să fie, dar nu limitat la, una dintre următoarele:&lt;br /&gt;
&lt;br /&gt;
-Încercarea unui nucleu mai nou decât ceea ce oferă distribuția Linux&lt;br /&gt;
&lt;br /&gt;
-Construirea unui kernel cu un set diferit de opțiuni de configurare și/sau drivere&lt;br /&gt;
&lt;br /&gt;
-Curiozitatea unui elev :)&lt;br /&gt;
&lt;br /&gt;
Acest ghid vă va arăta cum puteți compila singur nucleul Linux, cu comenzile pe care ar trebui să le rulați, de ce să rulați aceste comenzi și să explicați ce face.&lt;br /&gt;
&lt;br /&gt;
Distribuțiile precum Ubuntu au modalități mai ușoare de a instala kernel-ul. Dar acest tutorial este despre a face lucrurile manual de la codul sursă. Veți avea nevoie de timp, răbdare și experiență bună cu linia de comandă Linux pentru acest tutorial. Este vorba mai mult despre a experimenta lucrurile la prima mână. Cu toate acestea, vă sfătuiesc să încercați această aventură într-un VM sau pe sistemul dvs. de rezervă în loc să o faceți pe sistemul dvs. principal.&lt;br /&gt;
Pre-requisite-uri&lt;br /&gt;
&lt;br /&gt;
Există două condiții prealabile pentru a construi orice (în context cu software-ul).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Codul sursă&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Dependențele pentru build&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Deci, ca premise, vom descărca sursa kernel-ului Linux și vom instala câteva dependențe care ne vor permite să construim nucleul Linux.&lt;br /&gt;
&lt;br /&gt;
Există in principal 4 &amp;quot;versiuni&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Aceste &amp;quot;versiuni&amp;quot; ale Linux, la ordinea fluxului de dezvoltare sunt:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;linux-next:&#039;&#039;&#039; Orice cod care urmează să fie fuzionat în baza de cod Linux este mai întâi îmbinat în linux-next- Arbore. Aceasta este cea mai nouă, dar și cea mai &amp;quot;centr stabilă&amp;quot; stare de nucleu Linux. Majoritatea dezvoltatorilor și testerii de nucleu Linux folosesc acest lucru pentru a rafina calitatea codului pentru ca Linus să tragă, mai târziu.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;linux-mainline.&#039;&#039;&#039; Versiunea beta a acestei versiuni se numește o versiune RC (Release Candidate). Odată ce un RC este eliberat, Linus acceptă numai bug-fixes și patch-uri legate de regresie a performanței. Linus continuă să elibereze un kernel RC în fiecare săptămână până când este mulțumit de cod (cu feedback de la utilizatori). linux-rc, urmat de un număr, este adăugat pentru a indica versiunea de lansare RC.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Release-uri stabile:&#039;&#039;&#039; Odată ce Linus simte că ultimul RC a fost stabil, el lansează eliberarea finală, &amp;quot;publică&amp;quot;. O eliberare stabilă este menținută pentru încă câteva săptămâni. Iată ce folosesc distribuțiile Linux cu margini sângerânde, cum ar fi Arch Linux și Fedora Linux. Vă recomand să încercați mai întâi acest lucru linux-nextsau orice RC eliberează.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Release-uri LTS:&#039;&#039;&#039; Ultima lansare stabilă a unui anumit an este menținută pentru încă câțiva ani. Aceasta este, de obicei, o versiune mai veche, dar este menținută în mod activ cu remedieri de securitate. O versiune stabilă a Debian utilizează lansarea LTS a nucleului Linux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pregătirea sistemului&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Deoarece nucleul Linux este scris în limbajul de programare C, aveți nevoie de cel puțin un compilator C pentru a compila nucleul Linux. Există și alte astfel de dependențe care ar putea fi sau nu prezente pe computer.&lt;br /&gt;
&lt;br /&gt;
Acest ghid se va concentra pe compilarea kernel-ului Linux folosind GNU C Compiler (GCC). Dar poate într-un articol viitor (scufundându-mă în sprijinul Rust), voi acoperi folosind compilatorul Clang al LLVM ca alternativă la CCG.&lt;br /&gt;
&lt;br /&gt;
Comanda pentru Debian și derivații săi (Ubuntu):&lt;br /&gt;
&lt;br /&gt;
 sudo apt install bc binutils bison dwarves flex gcc git gnupg2 gzip libelf-dev libncurses5-dev libssl-dev make openssl pahole perl-base rsync tar xz-utils&lt;br /&gt;
&lt;br /&gt;
Comanda pentru Fedora și derivatele sale:&lt;br /&gt;
&lt;br /&gt;
 sudo dnf install binutils ncurses-devel /usr/include/{libelf.h,openssl/pkcs7.h} /usr/bin/{bc,bison,flex,gcc,git,gpg2,gzip,make,openssl,pahole,perl,rsync,tar,xz,zstd}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Descarcare kernel Linux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mergeți la kernel.org și pe pagină, găsiți prima versiune stabilă.&lt;br /&gt;
Puteți descărca marca de marcare făcând clic pe caseta galbenă mare. În timp ce vă bazați, descărcați și fișierul de semnătură PGP care se potrivește. Va fi la îndemână când vom verifica tarball într-un moment ulterior. Are extensia .tar.sign.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Verificarea autenticității tarballului&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Cum îți dai seama dacă taball-ul pe care tocmai l-ai descărcat este corupt sau nu? La nivel individual, un .tar corupt vă va irosi doar ceva timp, dar dacă acest lucru se face pentru o organizație, s-ar putea să faca lucrurile mai ușoare pentru un atacator.&lt;br /&gt;
&lt;br /&gt;
Pentru a verifica integritatea tarball-ului, prima data se va folosi unxz (alias pentru xz --decompress) pentru a decomprima .tar.xz in dosar.&lt;br /&gt;
&lt;br /&gt;
 unxz --keep linux-*.tar.xz&lt;br /&gt;
&lt;br /&gt;
Odată extrase, vom aduce cheile publice GPG pe care le folosesc Linus Torvalds și Greg KH. Aceste taste sunt folosite pentru a semna tar-ul.&lt;br /&gt;
&lt;br /&gt;
 gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org&lt;br /&gt;
&lt;br /&gt;
Ar trebui să obțineți ieșire care este similară cu ceea ce am primit pe mașina mea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org&lt;br /&gt;
gpg: /home/pratham/.gnupg/trustdb.gpg: trustdb created&lt;br /&gt;
gpg: key 38DBBDC86092693E: public key &amp;quot;Greg Kroah-Hartman &amp;lt;gregkh@kernel.org&amp;gt;&amp;quot; imported&lt;br /&gt;
gpg: Total number processed: 1&lt;br /&gt;
gpg:               imported: 1&lt;br /&gt;
gpg: key 79BE3E4300411886: public key &amp;quot;Linus Torvalds &amp;lt;torvalds@kernel.org&amp;gt;&amp;quot; imported&lt;br /&gt;
gpg: Total number processed: 1&lt;br /&gt;
gpg:               imported: 1&lt;br /&gt;
pub   rsa4096 2011-09-23 [SC]&lt;br /&gt;
      647F28654894E3BD457199BE38DBBDC86092693E&lt;br /&gt;
uid           [ unknown] Greg Kroah-Hartman &amp;lt;gregkh@kernel.org&amp;gt;&lt;br /&gt;
sub   rsa4096 2011-09-23 [E]&lt;br /&gt;
&lt;br /&gt;
pub   rsa2048 2011-09-20 [SC]&lt;br /&gt;
      ABAF11C65A2970B130ABE3C479BE3E4300411886&lt;br /&gt;
uid           [ unknown] Linus Torvalds &amp;lt;torvalds@kernel.org&amp;gt;&lt;br /&gt;
sub   rsa2048 2011-09-20 [E]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odată ce cheile lui Greg și Linus sunt importate, integritatea gudronului poate fi verificată folosind --verify; cum ar fi:&lt;br /&gt;
&lt;br /&gt;
 gpg2 --verify linux-*.tar.sign&lt;br /&gt;
&lt;br /&gt;
Dacă verificarea a avut succes, ar trebui să obțineți o producție similară cu următoarea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ gpg2 --verify linux-*.tar.sign&lt;br /&gt;
gpg: assuming signed data in &#039;linux-6.5.5.tar&#039;&lt;br /&gt;
gpg: Signature made Saturday 23 September 2023 02:46:13 PM IST&lt;br /&gt;
gpg:                using RSA key 647F28654894E3BD457199BE38DBBDC86092693E&lt;br /&gt;
gpg: Good signature from &amp;quot;Greg Kroah-Hartman &amp;lt;gregkh@kernel.org&amp;gt;&amp;quot; [unknown]&lt;br /&gt;
gpg: WARNING: This key is not certified with a trusted signature!&lt;br /&gt;
gpg:          There is no indication that the signature belongs to the owner.&lt;br /&gt;
Primary key fingerprint: 647F 2865 4894 E3BD 4571  99BE 38DB BDC8 6092 693E&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nota: Vă rugăm să nu continuați decât dacă vedeți un mesaj care spune gpg: Good signature!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Puteți ignora cu siguranță avertismentul care spune: AVERTISMENT: Această cheie nu este certificată cu o semnătură de încredere! Nu există niciun indiciu că semnătura aparține proprietarului.&lt;br /&gt;
&lt;br /&gt;
Am adus cheile de la e-mailurile lui Linus şi Greg şi nu am nevoie să ne facem griji pentru acest avertisment.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Extragerea tarball-ului&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dacă sunteți aici, înseamnă că verificarea integrității dvs. a fost finalizată cu succes. Acum, atunci, este timpul să extragem sursa kernel-ului Linux din ea.&lt;br /&gt;
&lt;br /&gt;
 tar -xf linux-*.tar&lt;br /&gt;
&lt;br /&gt;
Procesul de construcție al nucleul Linux caută un dosar .config. După cum sugerează și numele, este un fișier de configurare care specifică fiecare opțiune de configurare posibilă pentru nucleul Linux. Este necesar să avem unul.&lt;br /&gt;
&lt;br /&gt;
Există două metode de a obține acest dosarul .config pentru nucleul Linux:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Utilizarea configurației distribuției Linux ca bază (recomandat)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Folosind o configurație implicită, generică&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Există o a treia metodă în care puteți configura fiecare opțiune, de la zero, cu 12.000+ opțiuni. Acest lucru nu este recomandat deoarece este nevoie de mult timp pentru a configura totul cu mâna și, de asemenea, suficient know-how pentru a ști ce să activeze și să dezactivați.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utilizarea configurației furnizate de distribuție&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Utilizarea configurației furnizate de distribuția Linux este un pariu sigur. Dacă urmați acest ghid doar pentru a încerca un nou nucleu decât ceea ce oferă distribuția dvs., aceasta este metoda recomandată.&lt;br /&gt;
&lt;br /&gt;
Fișierul de configurare al distribuției Linux pentru kernel va fi în oricare dintre cele două locuri:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Cele mai multe distribuții Linux, cum ar fi Debian și Fedora, și derivatele lor o vor stoca ca /boot/config-$(uname -r).&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Unele distribuții Linux, cum ar fi Arch Linux, îl au integrat în nucleul Linux în sine. Prin urmare, va fi disponibil la /proc/config.gz.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dacă aveți ambele destinații disponibile, preferați să utilizați /proc/config.gz așa cum este pe un sistem de fișiere numai citit și, prin urmare, nemodonat.&lt;br /&gt;
&lt;br /&gt;
Intră în directorul care conține tarballul extras.&lt;br /&gt;
&lt;br /&gt;
 cd linux-*/&lt;br /&gt;
&lt;br /&gt;
Apoi, copiați fișierul de configurare al distribuției Linux:&lt;br /&gt;
&lt;br /&gt;
 ## Debian and Fedora&#039;s derivatives:&lt;br /&gt;
 $ cp /boot/config-&amp;quot;$(uname -r)&amp;quot; .config&lt;br /&gt;
&lt;br /&gt;
 ## Arch Linux and its derivatives:&lt;br /&gt;
 $ zcat /proc/config.gz &amp;gt; .config&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Actualizarea configurației&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Odată ce acest lucru este făcut, este timpul să &amp;quot;actualizați&amp;quot; fișierul de configurare. Vezi tu, există o mare probabilitate ca configurația pe care o oferă distribuția dvs. să fie mai veche decât nucleul Linux pe care îl construiți.&lt;br /&gt;
&lt;br /&gt;
Acest lucru se aplică distribuțiilor Linux cu update continuu, cum ar fi Arch Linux și Fedora. Niciuna dintre ele nu a lansat o actualizare doar pentru că există o nouă versiune disponibilă. Ei fac niște QA, care este obligat să ia timp. Și, prin urmare, chiar și cel mai recent sâmbure oferit de distribuția dvs. va fi câteva lansări minore în urmă, în comparație cu ceea ce veți obține de la kernel.org.&lt;br /&gt;
&lt;br /&gt;
Pentru a actualiza un existent .config, comanda make este folosită cu ținta olddefconfig.&lt;br /&gt;
&lt;br /&gt;
Acest lucru va lua &amp;quot;fiserul vechi de configurare&amp;quot; (care este salvat în prezent ca .config ca o copie literală a configurației distribuției dvs.) și verificați pentru orice opțiuni noi de configurare care au fost adăugate la baza de cod Linux de atunci. Dacă se găsesc opțiuni noi, neconfigurate, valoarea de configurare implicită pentru opțiunea respectivă este utilizată și dosarul .config este actualizat.&lt;br /&gt;
&lt;br /&gt;
Fisierul .config este redenumit în .config.old pe măsură ce backup-ul și noile modificări sunt scrise la .config.&lt;br /&gt;
&lt;br /&gt;
 make olddefconfig&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ file .config&lt;br /&gt;
.config: Linux make config build file, ASCII text&lt;br /&gt;
&lt;br /&gt;
$ make olddefconfig&lt;br /&gt;
  HOSTCC  scripts/basic/fixdep&lt;br /&gt;
  HOSTCC  scripts/kconfig/conf.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/confdata.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/expr.o&lt;br /&gt;
  LEX     scripts/kconfig/lexer.lex.c&lt;br /&gt;
  YACC    scripts/kconfig/parser.tab.[ch]&lt;br /&gt;
  HOSTCC  scripts/kconfig/lexer.lex.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/menu.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/parser.tab.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/preprocess.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/symbol.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/util.o&lt;br /&gt;
  HOSTLD  scripts/kconfig/conf&lt;br /&gt;
.config:8593:warning: symbol value &#039;m&#039; invalid for USB_FOTG210_HCD&lt;br /&gt;
.config:8859:warning: symbol value &#039;m&#039; invalid for USB_FOTG210_UDC&lt;br /&gt;
#&lt;br /&gt;
# configuration written to .config&lt;br /&gt;
#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru utilizatorii Debian și derivații săi&lt;br /&gt;
&lt;br /&gt;
Debian și derivatele sale folosesc un certificat pentru a semna modulele de kernel. Acest certificat, implicit, este absent pe computer.&lt;br /&gt;
&lt;br /&gt;
Vă recomand dezactivarea opțiunii care permite semnarea modulului. Se poate realiza cu următoarele comenzi:&lt;br /&gt;
&lt;br /&gt;
 ./scripts/config --file .config --disable MODULE_SIG&lt;br /&gt;
&lt;br /&gt;
Eșecul de a face acest lucru va duce la un eșec de construcție mai târziu, atunci când se ruleaza build-ul.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utilizarea unei configurații particularizate&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Puteți arunca o privire la ieșirea de &amp;quot;make help&amp;quot; pentru a vedea toate opțiunile disponibile, dar ne vom concentra pe trei tinte pentru make:&lt;br /&gt;
&lt;br /&gt;
  defconfig: Configurația implicită.&lt;br /&gt;
  allmodconfig: În funcție de starea actuală a sistemului, construiți elemente ca module încărcabile (în loc de încorporat) atunci când este posibil.&lt;br /&gt;
  tinyconfig: Un mic kernel Linux.&lt;br /&gt;
&lt;br /&gt;
La tinyconfig, timpii de construcție sunt în mod natural mai rapizi.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Modificarea configurației&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ai creat un dosar .config folosind o metodă de mai sus. Fie ai folosit-o pe cea pe care a folosit-o și la distribuirea Linux-ului, fie ai creat-o folosind defconfig.&lt;br /&gt;
&lt;br /&gt;
Oricum ar fi, căutați cum să o modificați. Cel mai fiabil mod de a face acest lucru este prin intermediul menuconfig sau nconfig.&lt;br /&gt;
&lt;br /&gt;
Ambele ținte fac același lucru, dar au o interfață diferită, nconfig este un pic mai intuitiv în căutarea opțiunilor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
  HOSTCC  scripts/kconfig/mconf.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/checklist.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/inputbox.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/menubox.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/textbox.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/util.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/yesno.o&lt;br /&gt;
  HOSTLD  scripts/kconfig/mconf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eticheta kernel-ului nostru poate fi configurată utilizând următoarea comandă:&lt;br /&gt;
&lt;br /&gt;
 ./scripts/config --file .config --set-str LOCALVERSION &amp;quot;-pratham&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Setează CONFIG_LOCALVERSION în dosarul .config.&lt;br /&gt;
&lt;br /&gt;
Acum, să construim kernel-ul în sine.&lt;br /&gt;
&lt;br /&gt;
 make -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Acest lucru este suficient pentru 99% dintre utilizatori.&lt;br /&gt;
&lt;br /&gt;
În funcție de arhitectura computerului dvs., numele imaginii de kernel Linux care se construiește (care este stocată în /boot) va varia.&lt;br /&gt;
&lt;br /&gt;
Pentru x86_64, numele imaginii nucleului Linux este bzImage. Deci, dacă doriți să construiți doar nucleul Linux în scopul de a-l porni, puteți specifica bzImage ca ţintă, aşa:&lt;br /&gt;
&lt;br /&gt;
 ## For x86_64&lt;br /&gt;
  $ make bzImage&lt;br /&gt;
 ## x86_64&lt;br /&gt;
  $ make -s image_name arch/x86/boot/bzImage&lt;br /&gt;
 ## AArch64&lt;br /&gt;
  $ make -s image_name arch/arm64/boot/Image.gz&lt;br /&gt;
 ## RISC-V&lt;br /&gt;
  $ make -s image_name arch/riscv/boot/Image.gz&lt;br /&gt;
&lt;br /&gt;
Și acum, pentru a construi doar imaginea de kernel Linux, puteți face acest lucru:&lt;br /&gt;
&lt;br /&gt;
 make $(make -s image_name | awk -F &#039;/&#039; &#039;{print $4}&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota&#039;&#039;&#039;: În cazul în care doriți să curățați artefactele comenzii make, puteți utiliza oricare dintre următoarele ținte pentru a atinge ceea ce doriți:&lt;br /&gt;
&lt;br /&gt;
    clean: Îndepărtați aproape orice, cu excepția .config.&lt;br /&gt;
    mrproper: șterge si .config.&lt;br /&gt;
    distclean: șterge fișiere de patch-uri.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Instalare&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Odată ce nucleul Linux a fost compilat, este timpul să instalați câteva lucruri.&lt;br /&gt;
&lt;br /&gt;
Există părți ale nucleului Linux care nu sunt necesare în timpul pornirii. Aceste piese sunt construite ca module loadabile (adică încărcate și descărcate atunci când este necesar).&lt;br /&gt;
&lt;br /&gt;
Să instalăm aceste module. Acest lucru se poate realiza cu make modules_install. Utilizarea de către sudo este necesara, deoarece modulele vor fi instalate în /lib/modules/&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;Și că directorul este deținut de root, nu şi utilizatorul tău.&lt;br /&gt;
&lt;br /&gt;
Acest lucru nu numai că va instala modulele kernel, ci și le va semna. Aşa că va dura ceva timp. Vestea bună este că puteți paraleliza acest lucru folosind cu -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
 sudo make modules_install -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Notă pentru dezvoltatori: Puteți specifica o cale diferită în cazul în care sunt stocate modulele Linux (în loc de /lib/modules/&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;) folosind INSTALL_MOD_PATHvariabilă ca și astfel:&lt;br /&gt;
&lt;br /&gt;
 sudo make modules_install INSTALL_MOD_PATH=&amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O altă notă pentru dezvoltatori: Puteți utiliza INSTALL_MOD_STRIPvariabil pentru a specifica dacă modulele ar trebui să fie deposedat de simbolurile de depanator sau nu. Simbolurile de depanarea nu sunt dezbrăcate dacă nu sunt definite. Când este setat la 1, ele sunt dezbrăcate folosind --strip-debugopţiunea, care este apoi trecută la strip(sau llvm-stripDacă Clang este utilizat) utilitate.&lt;br /&gt;
&lt;br /&gt;
[Opțional] Instalarea fișierelor de cap de nucleu Linux&lt;br /&gt;
&lt;br /&gt;
Dacă intenționați să utilizați acest sâmbure cu module în afara termenului, cum ar fi ZFS sau Nvidia DKMS, sau încercați să scrieți propriile module, cel mai probabil veți avea nevoie de fișierele de antet furnizate de sâmburele Linux.&lt;br /&gt;
&lt;br /&gt;
Capselele de sâmbure Linux pot fi instalate cu ajutorul headers_install:&lt;br /&gt;
&lt;br /&gt;
 sudo make headers_install&lt;br /&gt;
&lt;br /&gt;
Notă pentru dezvoltatori: Calea pentru instalarea antetului de sâmbure Linux poate fi suprasomit prin utilizarea variabilei INSTALL_HDR_PATH.&lt;br /&gt;
&lt;br /&gt;
Dacă sunteți pe x86_64, puteți sări peste acest pas!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Dacă ați construit pentru ARM sau RISC-V, este foarte probabil ca alergare makeDe asemenea, a construit binarele dispozitiv-axi-tree. Puteți cauta fisiere .dtb în arch/&amp;lt;machine_architecture&amp;gt;/boot/dts.&lt;br /&gt;
&lt;br /&gt;
Am un hack pentru a verifica acest lucru:&lt;br /&gt;
&lt;br /&gt;
## For AArch32&lt;br /&gt;
$ find arch/arm/boot/dts -name &amp;quot;*.dtb&amp;quot; -type f | head -n 1 &amp;gt; /dev/null &amp;amp;&amp;amp; echo &amp;quot;DTBs for ARM32 were built&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## For AArch64&lt;br /&gt;
$ find arch/arm64/boot/dts -name &amp;quot;*.dtb&amp;quot; -type f | head -n 1 &amp;gt; /dev/null &amp;amp;&amp;amp; echo &amp;quot;DTBs for ARM64 were built&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## For RISC-V&lt;br /&gt;
$ find arch/riscv/boot/dts -name &amp;quot;*.dtb&amp;quot; -type f | head -n 1 &amp;gt; /dev/null &amp;amp;&amp;amp; echo &amp;quot;DTBs for RISC-V were built&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dacă primești un mesaj pe care scria &amp;quot;DTB-uri pentru &amp;lt;arh&amp;gt; au fost construite&amp;quot;, continuați cu instalarea DTB-urilor. Asta se face cu dtbs_install- Ţintă.&lt;br /&gt;
&lt;br /&gt;
Utilizarea de către sudoeste necesar, deoarece acest lucru va fi instalat în /boot/dtb-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;care este deținută de root. .&lt;br /&gt;
&lt;br /&gt;
sudo make dtbs_install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;În cele din urmă, instalăm kernel-ul Linux în sine!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 sudo make install&lt;br /&gt;
&lt;br /&gt;
Utilizarea de către sudo este necesara aici pentru că sâmburele Linux se instalează în /boot pe care utilizatorul dvs. normal nu are permisiunea de a scrie.&lt;br /&gt;
&lt;br /&gt;
În general, obiectivul de instalare va actualiza, de asemenea, încărcătorul de boot, dar dacă nu reușește, înseamnă că probabil aveți un bootloader neacceptat. Dacă nu utilizați GRUB ca bootloader, vă rugăm să citiți manualul bootloaderului dvs.&lt;br /&gt;
&lt;br /&gt;
Notă pentru dezvoltatori: De data aceasta; variabila INSTALL_PATH este utilizată pentru a specifica unde este instalat nucleul Linux, în loc de calea implicită care se află /boot.&lt;br /&gt;
&lt;br /&gt;
Pentru utilizatorii Arch Linux&lt;br /&gt;
&lt;br /&gt;
Dacă ai încercat să alergi pe make install, s-ar putea să fi observat că ai primit o eroare. Cum ar fi următorul:&lt;br /&gt;
&lt;br /&gt;
$ sudo make install&lt;br /&gt;
  INSTALL /boot&lt;br /&gt;
Cannot find LILO.&lt;br /&gt;
&lt;br /&gt;
Pentru a instala de fapt nucleul Linux pe Arch Linux, trebuie să copiem manual imaginea kernel Linux.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Acest lucru se poate face cu următoarea comandă:&lt;br /&gt;
sudo install -Dm644 &amp;quot;$(make -s image_name)&amp;quot; /boot/vmlinuz-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
Din moment ce a, compilat nucleul de 6.5, voi rula următoarea comandă, o voi regla conform nevoilor dumneavoastră:&lt;br /&gt;
sudo install -Dm644 &amp;quot;$(make -s image_name)&amp;quot; /boot/vmlinuz-6.5.5-pratham&lt;br /&gt;
Nu este necesar, dar trebuie să copiați și un fișier numit System.mapȘi în timp ce sunteți la ea, copiați .configFile de asemenea ;)&lt;br /&gt;
sudo cp -vf System.map /boot/System.map-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
sudo cp -vf .config /boot/config-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
Generează ramdisk inițial&lt;br /&gt;
S-ar putea să fi întâlnit o utilitară numită mkinitcpio când ai instalat Arch Linux. O vom folosi pentru a crea ramdik-ul inițial.&lt;br /&gt;
Pentru a face acest lucru, avem nevoie de o presetată mai întâi. Faceți acest lucru prin adăugarea următorului conținut la /etc/mkinitcpio.d/linux-&amp;lt;localversion&amp;gt;.preset. Înlocuiti &amp;lt;kernel_release&amp;gt;Și &amp;lt;localversion&amp;gt;După cum este necesar.&lt;br /&gt;
&lt;br /&gt;
ALL_config=&amp;quot;/etc/mkinitcpio.conf&amp;quot;&lt;br /&gt;
ALL_kver=&amp;quot;/boot/vmlinuz-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PRESETS=(&#039;default&#039; &#039;fallback&#039;)&lt;br /&gt;
&lt;br /&gt;
default_image=&amp;quot;/boot/initramfs-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;.img&amp;quot;&lt;br /&gt;
fallback_options=&amp;quot;-S autodetect&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Odată ce faceți acest lucru, rulați următoarea comandă pentru a genera ramdisk-ul inițial:&lt;br /&gt;
&lt;br /&gt;
sudo mkinitcpio -p linux-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Urmează ieșirea de pe computerul meu, a ta ar trebui să fie și a ta similară!&lt;br /&gt;
&lt;br /&gt;
$ sudo mkinitcpio -p linux-pratham&lt;br /&gt;
==&amp;gt; Building image from preset: /etc/mkinitcpio.d/linux-pratham.preset: &#039;default&#039;&lt;br /&gt;
==&amp;gt; Using configuration file: &#039;/etc/mkinitcpio.conf&#039;&lt;br /&gt;
  -&amp;gt; -k /boot/vmlinuz-6.5.5-pratham -c /etc/mkinitcpio.conf -g /boot/initramfs-6.5.5-pratham.img&lt;br /&gt;
==&amp;gt; Starting build: &#039;6.5.5-pratham&#039;&lt;br /&gt;
  -&amp;gt; Running build hook: [base]&lt;br /&gt;
  -&amp;gt; Running build hook: [udev]&lt;br /&gt;
(...)&lt;br /&gt;
&lt;br /&gt;
Ramdisk-ul inițial a fost generat. Acum este timpul să treceți la actualizarea încărcătorului!&lt;br /&gt;
Actualizare GRUB&lt;br /&gt;
sudo grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
Actualizarea GRUB nu va face ca nucleul mai nou să nu intre în mod implicit. Vă rugăm să-l selectați din meniul de boot în timpul bootarii.&lt;br /&gt;
&lt;br /&gt;
Puteți selecta versiunea mai nouă a nucleului Linux intrând în elementul de meniu &amp;quot;Opțiuni avansate pentru Arch Linux&amp;quot;, apoi selectați elementul de meniu pe care scrie &amp;quot;Arch Linux, cu Linux &amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Nota&#039;&#039;&#039;: In AUR sunt pachete cu automatizeaza intreg procesul.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Felicitări! Ați finalizat toți pașii pentru a obține sursa nucleului Linux, configurând-o, construind-o și instalând-o.&lt;br /&gt;
&lt;br /&gt;
Vă rugăm să selectați versiunea corectă Linux kernel de la bootloader. Odată ce a pornit, rulați uname -rcomanda pentru a verifica dacă ați pornit folosind kernel-ul Linux intenționat.&lt;br /&gt;
&lt;br /&gt;
Mai jos este ieșirea de pe computerul meu:&lt;br /&gt;
&lt;br /&gt;
 $ uname -r&lt;br /&gt;
 6.5.5-pratham&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dezinstalare&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Fie distribuția Linux a expediat nucleul Linux cu versiunea pe care ați compilat-o manual, fie ați compilat un alt nucleu, mai nou și ați observat că ar trebui să dezinstalați nucleul mai vechi pentru a face spațiu pentru cel mai nou.&lt;br /&gt;
&lt;br /&gt;
Știm unde sunt instalate toate fișierele, astfel încât să fie mai ușor să le scoatem.&lt;br /&gt;
&lt;br /&gt;
 ## Remove kernel modules&lt;br /&gt;
 $ rm -rf /lib/modules/&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ## Remove device-tree binaries&lt;br /&gt;
 $ rm -rf /boot/dtb-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ## Remove the Linux kernel itself&lt;br /&gt;
 $ rm -vf /boot/{config,System,vmlinuz}-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Metoda alternativa ce creeaza pachete de instalare&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## source&lt;br /&gt;
apt source linux-image-unsigned-$(uname -r)&lt;br /&gt;
chmod a+x debian/rules&lt;br /&gt;
chmod a+x debian/scripts/*&lt;br /&gt;
chmod a+x debian/scripts/misc/*&lt;br /&gt;
fakeroot debian/rules clean&lt;br /&gt;
fakeroot debian/rules editconfigs # you need to go through each (Y, Exit, Y, Exit..) or get a complaint about config later&lt;br /&gt;
## build&lt;br /&gt;
&lt;br /&gt;
fakeroot debian/rules clean&lt;br /&gt;
&lt;br /&gt;
# quicker build:&lt;br /&gt;
fakeroot debian/rules binary-headers binary-generic binary-perarch&lt;br /&gt;
&lt;br /&gt;
# if you need linux-tools or lowlatency kernel, run instead:&lt;br /&gt;
fakeroot debian/rules binary&lt;br /&gt;
&lt;br /&gt;
##install&lt;br /&gt;
cd ..&lt;br /&gt;
ls *.deb&lt;br /&gt;
    linux-headers-4.8.0-17_4.8.0-17.19_all.deb&lt;br /&gt;
    linux-headers-4.8.0-17-generic_4.8.0-17.19_amd64.deb&lt;br /&gt;
    linux-image-4.8.0-17-generic_4.8.0-17.19_amd64.deb&lt;br /&gt;
&lt;br /&gt;
dpkg -i *.deb&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Advanced_Pagina_7|Pagina anterioară]] | [[Advanced_Pagina_9|Ultima pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_8&amp;diff=530</id>
		<title>Advanced Pagina 8</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_8&amp;diff=530"/>
		<updated>2024-11-12T12:40:29Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Compilare kernel==&lt;br /&gt;
&lt;br /&gt;
S-ar putea să vă interesați să compilați singur nucleul Linux, din mai multe motive. S-ar putea să fie, dar nu limitat la, una dintre următoarele:&lt;br /&gt;
&lt;br /&gt;
-Încercarea unui nucleu mai nou decât ceea ce oferă distribuția Linux&lt;br /&gt;
&lt;br /&gt;
-Construirea unui kernel cu un set diferit de opțiuni de configurare și/sau drivere&lt;br /&gt;
&lt;br /&gt;
-Curiozitatea unui elev :)&lt;br /&gt;
&lt;br /&gt;
Acest ghid vă va arăta cum puteți compila singur nucleul Linux, cu comenzile pe care ar trebui să le rulați, de ce să rulați aceste comenzi și să explicați ce face.&lt;br /&gt;
&lt;br /&gt;
Distribuțiile precum Ubuntu au modalități mai ușoare de a instala kernel-ul. Dar acest tutorial este despre a face lucrurile manual de la codul sursă. Veți avea nevoie de timp, răbdare și experiență bună cu linia de comandă Linux pentru acest tutorial. Este vorba mai mult despre a experimenta lucrurile la prima mână. Cu toate acestea, vă sfătuiesc să încercați această aventură într-un VM sau pe sistemul dvs. de rezervă în loc să o faceți pe sistemul dvs. principal.&lt;br /&gt;
Pre-requisite-uri&lt;br /&gt;
&lt;br /&gt;
Există două condiții prealabile pentru a construi orice (în context cu software-ul).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Codul sursă&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Dependențele pentru build&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Deci, ca premise, vom descărca sursa kernel-ului Linux și vom instala câteva dependențe care ne vor permite să construim nucleul Linux.&lt;br /&gt;
&lt;br /&gt;
Există in principal 4 &amp;quot;versiuni&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Aceste &amp;quot;versiuni&amp;quot; ale Linux, la ordinea fluxului de dezvoltare sunt:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;linux-next:&#039;&#039;&#039; Orice cod care urmează să fie fuzionat în baza de cod Linux este mai întâi îmbinat în linux-next- Arbore. Aceasta este cea mai nouă, dar și cea mai &amp;quot;centr stabilă&amp;quot; stare de nucleu Linux. Majoritatea dezvoltatorilor și testerii de nucleu Linux folosesc acest lucru pentru a rafina calitatea codului pentru ca Linus să tragă, mai târziu.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;linux-mainline.&#039;&#039;&#039; Versiunea beta a acestei versiuni se numește o versiune RC (Release Candidate). Odată ce un RC este eliberat, Linus acceptă numai bug-fixes și patch-uri legate de regresie a performanței. Linus continuă să elibereze un kernel RC în fiecare săptămână până când este mulțumit de cod (cu feedback de la utilizatori). linux-rc, urmat de un număr, este adăugat pentru a indica versiunea de lansare RC.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Release-uri stabile:&#039;&#039;&#039; Odată ce Linus simte că ultimul RC a fost stabil, el lansează eliberarea finală, &amp;quot;publică&amp;quot;. O eliberare stabilă este menținută pentru încă câteva săptămâni. Iată ce folosesc distribuțiile Linux cu margini sângerânde, cum ar fi Arch Linux și Fedora Linux. Vă recomand să încercați mai întâi acest lucru linux-nextsau orice RC eliberează.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Release-uri LTS:&#039;&#039;&#039; Ultima lansare stabilă a unui anumit an este menținută pentru încă câțiva ani. Aceasta este, de obicei, o versiune mai veche, dar este menținută în mod activ cu remedieri de securitate. O versiune stabilă a Debian utilizează lansarea LTS a nucleului Linux.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pregătirea sistemului&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Deoarece nucleul Linux este scris în limbajul de programare C, aveți nevoie de cel puțin un compilator C pentru a compila nucleul Linux. Există și alte astfel de dependențe care ar putea fi sau nu prezente pe computer.&lt;br /&gt;
&lt;br /&gt;
Acest ghid se va concentra pe compilarea kernel-ului Linux folosind GNU C Compiler (GCC). Dar poate într-un articol viitor (scufundându-mă în sprijinul Rust), voi acoperi folosind compilatorul Clang al LLVM ca alternativă la CCG.&lt;br /&gt;
&lt;br /&gt;
Comanda pentru Debian și derivații săi (Ubuntu):&lt;br /&gt;
&lt;br /&gt;
 sudo apt install bc binutils bison dwarves flex gcc git gnupg2 gzip libelf-dev libncurses5-dev libssl-dev make openssl pahole perl-base rsync tar xz-utils&lt;br /&gt;
&lt;br /&gt;
Comanda pentru Fedora și derivatele sale:&lt;br /&gt;
&lt;br /&gt;
 sudo dnf install binutils ncurses-devel /usr/include/{libelf.h,openssl/pkcs7.h} /usr/bin/{bc,bison,flex,gcc,git,gpg2,gzip,make,openssl,pahole,perl,rsync,tar,xz,zstd}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Descarcare kernel Linux&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Mergeți la kernel.org și pe pagină, găsiți prima versiune stabilă.&lt;br /&gt;
Puteți descărca marca de marcare făcând clic pe caseta galbenă mare. În timp ce vă bazați, descărcați și fișierul de semnătură PGP care se potrivește. Va fi la îndemână când vom verifica tarball într-un moment ulterior. Are extensia .tar.sign.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Verificarea autenticității tarballului&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Cum îți dai seama dacă taball-ul pe care tocmai l-ai descărcat este corupt sau nu? La nivel individual, un .tar corupt vă va irosi doar ceva timp, dar dacă acest lucru se face pentru o organizație, s-ar putea să faca lucrurile mai ușoare pentru un atacator.&lt;br /&gt;
&lt;br /&gt;
Pentru a verifica integritatea tarball-ului, prima data se va folosi unxz (alias pentru xz --decompress) pentru a decomprima .tar.xz in dosar.&lt;br /&gt;
&lt;br /&gt;
 unxz --keep linux-*.tar.xz&lt;br /&gt;
&lt;br /&gt;
Odată extrase, vom aduce cheile publice GPG pe care le folosesc Linus Torvalds și Greg KH. Aceste taste sunt folosite pentru a semna tar-ul.&lt;br /&gt;
&lt;br /&gt;
 gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org&lt;br /&gt;
&lt;br /&gt;
Ar trebui să obțineți ieșire care este similară cu ceea ce am primit pe mașina mea:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org&lt;br /&gt;
gpg: /home/pratham/.gnupg/trustdb.gpg: trustdb created&lt;br /&gt;
gpg: key 38DBBDC86092693E: public key &amp;quot;Greg Kroah-Hartman &amp;lt;gregkh@kernel.org&amp;gt;&amp;quot; imported&lt;br /&gt;
gpg: Total number processed: 1&lt;br /&gt;
gpg:               imported: 1&lt;br /&gt;
gpg: key 79BE3E4300411886: public key &amp;quot;Linus Torvalds &amp;lt;torvalds@kernel.org&amp;gt;&amp;quot; imported&lt;br /&gt;
gpg: Total number processed: 1&lt;br /&gt;
gpg:               imported: 1&lt;br /&gt;
pub   rsa4096 2011-09-23 [SC]&lt;br /&gt;
      647F28654894E3BD457199BE38DBBDC86092693E&lt;br /&gt;
uid           [ unknown] Greg Kroah-Hartman &amp;lt;gregkh@kernel.org&amp;gt;&lt;br /&gt;
sub   rsa4096 2011-09-23 [E]&lt;br /&gt;
&lt;br /&gt;
pub   rsa2048 2011-09-20 [SC]&lt;br /&gt;
      ABAF11C65A2970B130ABE3C479BE3E4300411886&lt;br /&gt;
uid           [ unknown] Linus Torvalds &amp;lt;torvalds@kernel.org&amp;gt;&lt;br /&gt;
sub   rsa2048 2011-09-20 [E]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Odată ce cheile lui Greg și Linus sunt importate, integritatea gudronului poate fi verificată folosind --verifySteagul; cum ar fi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gpg2 --verify linux-*.tar.sign&lt;br /&gt;
&lt;br /&gt;
Dacă verificarea a avut succes, ar trebui să obțineți o producție similară cu următoarea:&lt;br /&gt;
&lt;br /&gt;
$ gpg2 --verify linux-*.tar.sign&lt;br /&gt;
gpg: assuming signed data in &#039;linux-6.5.5.tar&#039;&lt;br /&gt;
gpg: Signature made Saturday 23 September 2023 02:46:13 PM IST&lt;br /&gt;
gpg:                using RSA key 647F28654894E3BD457199BE38DBBDC86092693E&lt;br /&gt;
gpg: Good signature from &amp;quot;Greg Kroah-Hartman &amp;lt;gregkh@kernel.org&amp;gt;&amp;quot; [unknown]&lt;br /&gt;
gpg: WARNING: This key is not certified with a trusted signature!&lt;br /&gt;
gpg:          There is no indication that the signature belongs to the owner.&lt;br /&gt;
Primary key fingerprint: 647F 2865 4894 E3BD 4571  99BE 38DB BDC8 6092 693E&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Nota: Vă rugăm să nu continuați decât dacă vedeți un mesaj care spune gpg: Good signature!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Puteți ignora cu siguranță avertismentul care spune: AVERTISMENT: Această cheie nu este certificată cu o semnătură de încredere! Nu există niciun indiciu că semnătura aparține proprietarului.&lt;br /&gt;
&lt;br /&gt;
Am adus cheile de la e-mailurile lui Linus şi Greg şi nu am nevoie să ne facem griji pentru acest avertisment.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Extragerea tarball-ului&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dacă sunteți aici, înseamnă că verificarea integrității dvs. a fost finalizată cu succes. Acum, atunci, este timpul să extragem sursa kernel-ului Linux din ea.&lt;br /&gt;
&lt;br /&gt;
 tar -xf linux-*.tar&lt;br /&gt;
&lt;br /&gt;
Procesul de construcție al nucleul Linux caută un dosar .config. După cum sugerează și numele, este un fișier de configurare care specifică fiecare opțiune de configurare posibilă pentru nucleul Linux. Este necesar să avem unul.&lt;br /&gt;
&lt;br /&gt;
Există două metode de a obține acest dosarul .config pentru nucleul Linux:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Utilizarea configurației distribuției Linux ca bază (recomandat)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Folosind o configurație implicită, generică&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Există o a treia metodă în care puteți configura fiecare opțiune, de la zero, cu 12.000+ opțiuni. Acest lucru nu este recomandat deoarece este nevoie de mult timp pentru a configura totul cu mâna și, de asemenea, suficient know-how pentru a ști ce să activeze și să dezactivați.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utilizarea configurației furnizate de distribuție&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Utilizarea configurației furnizate de distribuția Linux este un pariu sigur. Dacă urmați acest ghid doar pentru a încerca un nou nucleu decât ceea ce oferă distribuția dvs., aceasta este metoda recomandată.&lt;br /&gt;
&lt;br /&gt;
Fișierul de configurare al distribuției Linux pentru kernel va fi în oricare dintre cele două locuri:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Cele mai multe distribuții Linux, cum ar fi Debian și Fedora, și derivatele lor o vor stoca ca /boot/config-$(uname -r).&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;-Unele distribuții Linux, cum ar fi Arch Linux, îl au integrat în nucleul Linux în sine. Prin urmare, va fi disponibil la /proc/config.gz.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Dacă aveți ambele destinații disponibile, preferați să utilizați /proc/config.gz așa cum este pe un sistem de fișiere numai citit și, prin urmare, nemodonat.&lt;br /&gt;
&lt;br /&gt;
Intră în directorul care conține tarballul extras.&lt;br /&gt;
&lt;br /&gt;
 cd linux-*/&lt;br /&gt;
&lt;br /&gt;
Apoi, copiați fișierul de configurare al distribuției Linux:&lt;br /&gt;
&lt;br /&gt;
 ## Debian and Fedora&#039;s derivatives:&lt;br /&gt;
 $ cp /boot/config-&amp;quot;$(uname -r)&amp;quot; .config&lt;br /&gt;
&lt;br /&gt;
 ## Arch Linux and its derivatives:&lt;br /&gt;
 $ zcat /proc/config.gz &amp;gt; .config&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Actualizarea configurației&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Odată ce acest lucru este făcut, este timpul să &amp;quot;actualizați&amp;quot; fișierul de configurare. Vezi tu, există o mare probabilitate ca configurația pe care o oferă distribuția dvs. să fie mai veche decât nucleul Linux pe care îl construiți.&lt;br /&gt;
&lt;br /&gt;
Acest lucru se aplică distribuțiilor Linux cu update continuu, cum ar fi Arch Linux și Fedora. Niciuna dintre ele nu a lansat o actualizare doar pentru că există o nouă versiune disponibilă. Ei fac niște QA, care este obligat să ia timp. Și, prin urmare, chiar și cel mai recent sâmbure oferit de distribuția dvs. va fi câteva lansări minore în urmă, în comparație cu ceea ce veți obține de la kernel.org.&lt;br /&gt;
&lt;br /&gt;
Pentru a actualiza un existent .config, comanda make este folosită cu ținta olddefconfig.&lt;br /&gt;
&lt;br /&gt;
Acest lucru va lua &amp;quot;fiserul vechi de configurare&amp;quot; (care este salvat în prezent ca .config ca o copie literală a configurației distribuției dvs.) și verificați pentru orice opțiuni noi de configurare care au fost adăugate la baza de cod Linux de atunci. Dacă se găsesc opțiuni noi, neconfigurate, valoarea de configurare implicită pentru opțiunea respectivă este utilizată și dosarul .config este actualizat.&lt;br /&gt;
&lt;br /&gt;
Originalul .configfișierul este redenumit în .config.old pe măsură ce backup-ul și noile modificări sunt scrise la .config.&lt;br /&gt;
&lt;br /&gt;
 make olddefconfig&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ file .config&lt;br /&gt;
.config: Linux make config build file, ASCII text&lt;br /&gt;
&lt;br /&gt;
$ make olddefconfig&lt;br /&gt;
  HOSTCC  scripts/basic/fixdep&lt;br /&gt;
  HOSTCC  scripts/kconfig/conf.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/confdata.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/expr.o&lt;br /&gt;
  LEX     scripts/kconfig/lexer.lex.c&lt;br /&gt;
  YACC    scripts/kconfig/parser.tab.[ch]&lt;br /&gt;
  HOSTCC  scripts/kconfig/lexer.lex.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/menu.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/parser.tab.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/preprocess.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/symbol.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/util.o&lt;br /&gt;
  HOSTLD  scripts/kconfig/conf&lt;br /&gt;
.config:8593:warning: symbol value &#039;m&#039; invalid for USB_FOTG210_HCD&lt;br /&gt;
.config:8859:warning: symbol value &#039;m&#039; invalid for USB_FOTG210_UDC&lt;br /&gt;
#&lt;br /&gt;
# configuration written to .config&lt;br /&gt;
#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pentru utilizatorii Debian și derivații săi&lt;br /&gt;
&lt;br /&gt;
Debian și derivatele sale folosesc un certificat pentru a semna modulele de kernel. Acest certificat, implicit, este absent pe computer.&lt;br /&gt;
&lt;br /&gt;
Vă recomand dezactivarea opțiunii care permite semnarea modulului. Se poate realiza cu următoarele comenzi:&lt;br /&gt;
&lt;br /&gt;
 ./scripts/config --file .config --disable MODULE_SIG&lt;br /&gt;
&lt;br /&gt;
Eșecul de a face acest lucru va duce la un eșec de construcție mai târziu, atunci când se ruleaza build-ul.&lt;br /&gt;
&lt;br /&gt;
Utilizarea unei configurații particularizate&lt;br /&gt;
&lt;br /&gt;
Puteți arunca o privire la ieșirea de &amp;quot;make help&amp;quot; pentru a vedea toate opțiunile disponibile, dar ne vom concentra pe trei tinte pentru make:&lt;br /&gt;
&lt;br /&gt;
  defconfig: Configurația implicită.&lt;br /&gt;
  allmodconfig În funcție de starea actuală a sistemului, construiți elemente ca module încărcabile (în loc de încorporat) atunci când este posibil.&lt;br /&gt;
  tinyconfig: Un mic kernel Linux.&lt;br /&gt;
&lt;br /&gt;
La tinyconfig, timpii de construcție sunt în mod natural mai rapizi.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Modificarea configurației&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ai creat un dosar .config folosind o metodă de mai sus. Fie ai folosit-o pe cea pe care a folosit-o și la distribuirea Linux-ului, fie ai creat-o folosind defconfig.&lt;br /&gt;
&lt;br /&gt;
Oricum ar fi, căutați cum să o modificați. Cel mai fiabil mod de a face acest lucru este prin intermediul menuconfig sau nconfig.&lt;br /&gt;
&lt;br /&gt;
Ambele ținte fac același lucru, dar au o interfață diferită, nconfig este un pic mai intuitiv în căutarea opțiunilor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ make menuconfig&lt;br /&gt;
  HOSTCC  scripts/kconfig/mconf.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/checklist.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/inputbox.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/menubox.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/textbox.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/util.o&lt;br /&gt;
  HOSTCC  scripts/kconfig/lxdialog/yesno.o&lt;br /&gt;
  HOSTLD  scripts/kconfig/mconf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eticheta kernel-ului nostru poate fi configurată utilizând următoarea comandă:&lt;br /&gt;
&lt;br /&gt;
 ./scripts/config --file .config --set-str LOCALVERSION &amp;quot;-pratham&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Setează CONFIG_LOCALVERSION în dosarul .config.&lt;br /&gt;
&lt;br /&gt;
Acum, să construim kernel-ul în sine.&lt;br /&gt;
&lt;br /&gt;
 make -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Acest lucru este suficient pentru 99% dintre utilizatori.&lt;br /&gt;
&lt;br /&gt;
În funcție de arhitectura computerului dvs., numele imaginii de kernel Linux care se construiește (care este stocată în /boot) va varia.&lt;br /&gt;
&lt;br /&gt;
Pentru x86_64, numele imaginii nucleului Linux este bzImage. Deci, dacă doriți să construiți doar nucleul Linux în scopul de a-l porni, puteți specifica bzImage ca ţintă, aşa:&lt;br /&gt;
&lt;br /&gt;
 ## For x86_64&lt;br /&gt;
 $ make bzImage&lt;br /&gt;
&lt;br /&gt;
 ## x86_64&lt;br /&gt;
 $ make -s image_name&lt;br /&gt;
 arch/x86/boot/bzImage&lt;br /&gt;
&lt;br /&gt;
 ## AArch64&lt;br /&gt;
 $ make -s image_name&lt;br /&gt;
 arch/arm64/boot/Image.gz&lt;br /&gt;
&lt;br /&gt;
 ## RISC-V&lt;br /&gt;
 $ make -s image_name&lt;br /&gt;
 arch/riscv/boot/Image.gz&lt;br /&gt;
&lt;br /&gt;
Și acum, pentru a construi doar imaginea de kernel Linux, puteți face acest lucru:&lt;br /&gt;
&lt;br /&gt;
 make $(make -s image_name | awk -F &#039;/&#039; &#039;{print $4}&#039;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ținte pentru curățenie&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
În cazul în care doriți să curățați artefactele comenzii make, puteți utiliza oricare dintre următoarele ținte pentru a atinge ceea ce doriți:&lt;br /&gt;
&lt;br /&gt;
    clean: Îndepărtați aproape orice, cu excepția .config.&lt;br /&gt;
    mrproper: șterge si .config.&lt;br /&gt;
    distclean: face decât să elimine fișiere de patch-uri.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Instalare&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Odată ce nucleul Linux a fost compilat, este timpul să instalați câteva lucruri.&lt;br /&gt;
&lt;br /&gt;
Există părți ale nucleului Linux care nu sunt necesare în timpul pornirii. Aceste piese sunt construite ca module loadabile (adică încărcate și descărcate atunci când este necesar).&lt;br /&gt;
&lt;br /&gt;
Deci, să instalăm aceste module. Acest lucru se poate realiza cu make modules_install. Utilizarea de către sudo este necesara, deoarece modulele vor fi instalate în /lib/modules/&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;Și că directorul este deținut de root, nu şi utilizatorul tău.&lt;br /&gt;
&lt;br /&gt;
Acest lucru nu numai că va instala modulele kernel, ci și le va semna. Aşa că va dura ceva timp. Vestea bună este că puteți paraleliza acest lucru folosind cu -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
 sudo make modules_install -j$(nproc)&lt;br /&gt;
&lt;br /&gt;
Notă pentru dezvoltatori: Puteți specifica o cale diferită în cazul în care sunt stocate modulele Linux (în loc de /lib/modules/&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;) folosind INSTALL_MOD_PATHvariabilă ca și astfel:&lt;br /&gt;
&lt;br /&gt;
 sudo make modules_install INSTALL_MOD_PATH=&amp;lt;path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O altă notă pentru dezvoltatori: Puteți utiliza INSTALL_MOD_STRIPvariabil pentru a specifica dacă modulele ar trebui să fie deposedat de simbolurile de depanator sau nu. Simbolurile de depanarea nu sunt dezbrăcate dacă nu sunt definite. Când este setat la 1, ele sunt dezbrăcate folosind --strip-debugopţiunea, care este apoi trecută la strip(sau llvm-stripDacă Clang este utilizat) utilitate.&lt;br /&gt;
&lt;br /&gt;
[Opțional] Instalarea fișierelor de cap de nucleu Linux&lt;br /&gt;
&lt;br /&gt;
Dacă intenționați să utilizați acest sâmbure cu module în afara termenului, cum ar fi ZFS sau Nvidia DKMS, sau încercați să scrieți propriile module, cel mai probabil veți avea nevoie de fișierele de antet furnizate de sâmburele Linux.&lt;br /&gt;
&lt;br /&gt;
Capselele de sâmbure Linux pot fi instalate cu ajutorul headers_install:&lt;br /&gt;
&lt;br /&gt;
 sudo make headers_install&lt;br /&gt;
&lt;br /&gt;
Notă pentru dezvoltatori: Calea pentru instalarea antetului de sâmbure Linux poate fi suprasomit prin utilizarea variabilei INSTALL_HDR_PATH.&lt;br /&gt;
&lt;br /&gt;
Dacă sunteți pe x86_64, puteți sări peste acest pas!&lt;br /&gt;
&lt;br /&gt;
Dacă ați construit pentru ARM sau RISC-V, este foarte probabil ca alergare makeDe asemenea, a construit binarele dispozitiv-axi-tree. Puteți cauta fisiere .dtb în arch/&amp;lt;machine_architecture&amp;gt;/boot/dts.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Am un hack pentru a verifica acest lucru:&lt;br /&gt;
&lt;br /&gt;
## For AArch32&lt;br /&gt;
$ find arch/arm/boot/dts -name &amp;quot;*.dtb&amp;quot; -type f | head -n 1 &amp;gt; /dev/null &amp;amp;&amp;amp; echo &amp;quot;DTBs for ARM32 were built&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## For AArch64&lt;br /&gt;
$ find arch/arm64/boot/dts -name &amp;quot;*.dtb&amp;quot; -type f | head -n 1 &amp;gt; /dev/null &amp;amp;&amp;amp; echo &amp;quot;DTBs for ARM64 were built&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## For RISC-V&lt;br /&gt;
$ find arch/riscv/boot/dts -name &amp;quot;*.dtb&amp;quot; -type f | head -n 1 &amp;gt; /dev/null &amp;amp;&amp;amp; echo &amp;quot;DTBs for RISC-V were built&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Dacă primești un mesaj pe care scria &amp;quot;DTB-uri pentru &amp;lt;arh&amp;gt; au fost construite&amp;quot;, continuați cu instalarea DTB-urilor. Asta se face cu dtbs_install- Ţintă.&lt;br /&gt;
&lt;br /&gt;
Utilizarea de către sudoeste necesar, deoarece acest lucru va fi instalat în /boot/dtb-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;care este deținută de root. .&lt;br /&gt;
&lt;br /&gt;
sudo make dtbs_install&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notă pentru dezvoltatori: La fel ca și instalarea modulelor, puteți specifica o cale personalizată pentru locul în care sunt instalate binarele dispozitiv-coaști folosind INSTALL_DTBS_PATHvariabilă.&lt;br /&gt;
Instalează sâmburele Linux&lt;br /&gt;
&lt;br /&gt;
În cele din urmă, instalăm kernel-ul Linux în sine!&lt;br /&gt;
&lt;br /&gt;
 sudo make install&lt;br /&gt;
&lt;br /&gt;
Utilizarea de către sudo este necesara aici pentru că sâmburele Linux se instalează în /boot pe care utilizatorul dvs. normal nu are permisiunea de a scrie.&lt;br /&gt;
&lt;br /&gt;
În general, obiectivul de instalare va actualiza, de asemenea, încărcătorul de boot, dar dacă nu reușește, înseamnă că probabil aveți un bootloader neacceptat. Dacă nu utilizați GRUB ca bootloader, vă rugăm să citiți manualul bootloaderului dvs.&lt;br /&gt;
&lt;br /&gt;
Notă pentru dezvoltatori: De data aceasta; variabila INSTALL_PATH este utilizată pentru a specifica unde este instalat nucleul Linux, în loc de calea implicită care se află /boot.&lt;br /&gt;
&lt;br /&gt;
Pentru utilizatorii Arch Linux&lt;br /&gt;
&lt;br /&gt;
Dacă ai încercat să alergi pe make install, s-ar putea să fi observat că ai primit o eroare. Cum ar fi următorul:&lt;br /&gt;
&lt;br /&gt;
$ sudo make install&lt;br /&gt;
  INSTALL /boot&lt;br /&gt;
Cannot find LILO.&lt;br /&gt;
&lt;br /&gt;
Pentru a instala de fapt nucleul Linux pe Arch Linux, trebuie să copiem manual imaginea kernel Linux.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Acest lucru se poate face cu următoarea comandă:&lt;br /&gt;
sudo install -Dm644 &amp;quot;$(make -s image_name)&amp;quot; /boot/vmlinuz-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
Din moment ce a, compilat nucleul de 6.5, voi rula următoarea comandă, o voi regla conform nevoilor dumneavoastră:&lt;br /&gt;
sudo install -Dm644 &amp;quot;$(make -s image_name)&amp;quot; /boot/vmlinuz-6.5.5-pratham&lt;br /&gt;
Nu este necesar, dar trebuie să copiați și un fișier numit System.mapȘi în timp ce sunteți la ea, copiați .configFile de asemenea ;)&lt;br /&gt;
sudo cp -vf System.map /boot/System.map-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
sudo cp -vf .config /boot/config-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
Generează ramdisk inițial&lt;br /&gt;
S-ar putea să fi întâlnit o utilitară numită mkinitcpio când ai instalat Arch Linux. O vom folosi pentru a crea ramdik-ul inițial.&lt;br /&gt;
Pentru a face acest lucru, avem nevoie de o presetată mai întâi. Faceți acest lucru prin adăugarea următorului conținut la /etc/mkinitcpio.d/linux-&amp;lt;localversion&amp;gt;.preset. Înlocuiti &amp;lt;kernel_release&amp;gt;Și &amp;lt;localversion&amp;gt;După cum este necesar.&lt;br /&gt;
&lt;br /&gt;
ALL_config=&amp;quot;/etc/mkinitcpio.conf&amp;quot;&lt;br /&gt;
ALL_kver=&amp;quot;/boot/vmlinuz-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
PRESETS=(&#039;default&#039; &#039;fallback&#039;)&lt;br /&gt;
&lt;br /&gt;
default_image=&amp;quot;/boot/initramfs-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;.img&amp;quot;&lt;br /&gt;
fallback_options=&amp;quot;-S autodetect&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Odată ce faceți acest lucru, rulați următoarea comandă pentru a genera ramdisk-ul inițial:&lt;br /&gt;
&lt;br /&gt;
sudo mkinitcpio -p linux-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Urmează ieșirea de pe computerul meu, a ta ar trebui să fie și a ta similară!&lt;br /&gt;
&lt;br /&gt;
$ sudo mkinitcpio -p linux-pratham&lt;br /&gt;
==&amp;gt; Building image from preset: /etc/mkinitcpio.d/linux-pratham.preset: &#039;default&#039;&lt;br /&gt;
==&amp;gt; Using configuration file: &#039;/etc/mkinitcpio.conf&#039;&lt;br /&gt;
  -&amp;gt; -k /boot/vmlinuz-6.5.5-pratham -c /etc/mkinitcpio.conf -g /boot/initramfs-6.5.5-pratham.img&lt;br /&gt;
==&amp;gt; Starting build: &#039;6.5.5-pratham&#039;&lt;br /&gt;
  -&amp;gt; Running build hook: [base]&lt;br /&gt;
  -&amp;gt; Running build hook: [udev]&lt;br /&gt;
(...)&lt;br /&gt;
&lt;br /&gt;
Ramdisk-ul inițial a fost generat. Acum este timpul să treceți la actualizarea încărcătorului!&lt;br /&gt;
Actualizare GRUB&lt;br /&gt;
sudo grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
Actualizarea GRUB nu va face ca nucleul mai nou să nu intre în mod implicit. Vă rugăm să-l selectați din meniul de boot în timpul bootarii.&lt;br /&gt;
&lt;br /&gt;
Puteți selecta versiunea mai nouă a nucleului Linux intrând în elementul de meniu &amp;quot;Opțiuni avansate pentru Arch Linux&amp;quot;, apoi selectați elementul de meniu pe care scrie &amp;quot;Arch Linux, cu Linux &amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&amp;quot;.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Nota&#039;&#039;&#039;: In AUR sunt pachete cu automatizeaza intreg procesul.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Felicitări! Ați finalizat toți pașii pentru a obține sursa nucleului Linux, configurând-o, construind-o și instalând-o.&lt;br /&gt;
&lt;br /&gt;
Vă rugăm să selectați versiunea corectă Linux kernel de la bootloader. Odată ce a pornit, rulați uname -rcomanda pentru a verifica dacă ați pornit folosind kernel-ul Linux intenționat.&lt;br /&gt;
&lt;br /&gt;
Mai jos este ieșirea de pe computerul meu:&lt;br /&gt;
&lt;br /&gt;
 $ uname -r&lt;br /&gt;
 6.5.5-pratham&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dezinstalare&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Fie distribuția Linux a expediat nucleul Linux cu versiunea pe care ați compilat-o manual, fie ați compilat un alt nucleu, mai nou și ați observat că ar trebui să dezinstalați nucleul mai vechi pentru a face spațiu pentru cel mai nou.&lt;br /&gt;
&lt;br /&gt;
Știm unde sunt instalate toate fișierele, astfel încât să fie mai ușor să le scoatem.&lt;br /&gt;
&lt;br /&gt;
 ## Remove kernel modules&lt;br /&gt;
 $ rm -rf /lib/modules/&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ## Remove device-tree binaries&lt;br /&gt;
 $ rm -rf /boot/dtb-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ## Remove the Linux kernel itself&lt;br /&gt;
 $ rm -vf /boot/{config,System,vmlinuz}-&amp;lt;kernel_release&amp;gt;-&amp;lt;localversion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Concluzie&lt;br /&gt;
&lt;br /&gt;
O aventură, nu-i aşa? Dar, în cele din urmă, se concluzionează. Am analizat întregul proces a ceea ce este necesar pentru a compila manual nucleul Linux. Aceasta a implicat instalarea dependențelor, configurarea sursei, verificarea acesteia, extragerea acesteia, configurarea nucleului Linux, construirea nucleului Linux și apoi instalarea acestuia.&lt;br /&gt;
&lt;br /&gt;
[[Advanced_Pagina_7|Pagina anterioară]] | [[Advanced_Pagina_9|Ultima pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_7&amp;diff=529</id>
		<title>Advanced Pagina 7</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_7&amp;diff=529"/>
		<updated>2024-11-12T11:34:58Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Firewall avansat==&lt;br /&gt;
&lt;br /&gt;
===nftables===&lt;br /&gt;
&lt;br /&gt;
Tabele: ip (implicit), arp, ip6, bridge, inet, netdev.&lt;br /&gt;
&lt;br /&gt;
Lanturi:&lt;br /&gt;
&lt;br /&gt;
  filter: Supported by arp, bridge, ip, ip6 and inet table families.&lt;br /&gt;
  route: Mark packets (like mangle for the output hook, for other hooks use the type filter instead), supported by ip and ip6.&lt;br /&gt;
  nat: In order to perform Network Address Translation, supported by ip and ip6.&lt;br /&gt;
&lt;br /&gt;
Hook: Se refera la stadiul acelui pachet in timp ce este procesat de kernel in Netfilter.&lt;br /&gt;
&lt;br /&gt;
  The hooks for ip, ip6 and inet families are: prerouting, input, forward, output, postrouting.&lt;br /&gt;
  The hooks for arp family are: input, output.&lt;br /&gt;
  The bridge family handles ethernet packets traversing bridge devices.&lt;br /&gt;
  The hooks for netdev are: ingress, egress.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 % nft (add | create) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; [ \{ type &amp;lt;type&amp;gt; hook &amp;lt;hook&amp;gt; [device &amp;lt;device&amp;gt;] priority &amp;lt;priority&amp;gt; \; [policy (accept | drop) \;] \} ]&lt;br /&gt;
 % nft (delete | list | flush) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt;&lt;br /&gt;
 % nft rename chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; &amp;lt;newname&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reguli: nft (add | insert | replace | displace) rule&lt;br /&gt;
&lt;br /&gt;
====Exemplu 1, imitare iptables====&lt;br /&gt;
&lt;br /&gt;
Exemplu de reguli nftables, de importat cu comanda nft -f. O parte din chain-uri imita iptables. Nota: unele distributii acum implementeaza propriile reguli, de recomandat folosita comanda &amp;quot;flush ruleset&amp;quot; inainte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
table inet filter {&lt;br /&gt;
        chain input {&lt;br /&gt;
                type filter hook input priority filter;&lt;br /&gt;
&lt;br /&gt;
                # Allow loopback (local connections)&lt;br /&gt;
                iifname lo accept&lt;br /&gt;
&lt;br /&gt;
                # Allow established/related&lt;br /&gt;
                ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
                # Allow incoming pings&lt;br /&gt;
                ip protocol icmp limit rate 1/second accept&lt;br /&gt;
&lt;br /&gt;
                # Allow SSH and HTTP&lt;br /&gt;
                tcp dport {ssh,http} accept&lt;br /&gt;
&lt;br /&gt;
                # Drop everything else&lt;br /&gt;
                drop&lt;br /&gt;
        }&lt;br /&gt;
        chain forward {&lt;br /&gt;
                type filter hook forward priority filter;&lt;br /&gt;
&lt;br /&gt;
                # Disallow forwarding&lt;br /&gt;
                drop&lt;br /&gt;
        }&lt;br /&gt;
        chain output {&lt;br /&gt;
                type filter hook output priority filter;&lt;br /&gt;
&lt;br /&gt;
                # Allow all outgoing traffic&lt;br /&gt;
                accept&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Exemplu 2, prioritati====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
table ip filter {&lt;br /&gt;
        # This chain is evaluated first due to priority&lt;br /&gt;
        chain services {&lt;br /&gt;
                type filter hook input priority 0; policy accept;&lt;br /&gt;
&lt;br /&gt;
                # If matched, this rule will prevent any further evaluation&lt;br /&gt;
                tcp dport http drop&lt;br /&gt;
&lt;br /&gt;
                # If matched, and despite the accept verdict, the packet proceeds to enter the chain below&lt;br /&gt;
                tcp dport ssh accept&lt;br /&gt;
&lt;br /&gt;
                # Likewise for any packets that get this far and hit the default policy&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # This chain is evaluated last due to priority&lt;br /&gt;
        chain input {&lt;br /&gt;
                type filter hook input priority 1; policy drop;&lt;br /&gt;
                # All ingress packets end up being dropped here!&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Exemplu 3, log====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
table inet firewall {&lt;br /&gt;
    chain inbound {                                                              &lt;br /&gt;
&lt;br /&gt;
        # By default, drop all traffic unless it meets a filter&lt;br /&gt;
        # criteria specified by the rules that follow below.&lt;br /&gt;
        type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
        # Allow traffic from established and related packets, drop invalid&lt;br /&gt;
        ct state vmap { established : accept, related : accept, invalid : drop } &lt;br /&gt;
&lt;br /&gt;
        # Allow loopback traffic.&lt;br /&gt;
        iifname lo accept&lt;br /&gt;
&lt;br /&gt;
        tcp dport { 22, 80, 443, 55291, 5900 } accept&lt;br /&gt;
                                                                                                                                                                                                                                                                                          &lt;br /&gt;
        # Uncomment to enable logging of denied inbound traffic                                                                                                                                                                                                                           &lt;br /&gt;
        log prefix &amp;quot;[nftables] Inbound Denied: &amp;quot; counter drop                                                                                                                                                                                                                             &lt;br /&gt;
    }                                                                                                                                                                                                                                                                                     &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operatii la nivel de ruleset====&lt;br /&gt;
&lt;br /&gt;
listing&lt;br /&gt;
&lt;br /&gt;
Listing the complete ruleset:&lt;br /&gt;
&lt;br /&gt;
 % nft list ruleset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Listing the ruleset per family:&lt;br /&gt;
&lt;br /&gt;
 % nft list ruleset arp&lt;br /&gt;
 % nft list ruleset ip&lt;br /&gt;
 % nft list ruleset ip6&lt;br /&gt;
 % nft list ruleset bridge&lt;br /&gt;
 % nft list ruleset inet&lt;br /&gt;
&lt;br /&gt;
These commands will print all tables/chains/sets/rules of the given family.&lt;br /&gt;
&lt;br /&gt;
flushing&lt;br /&gt;
&lt;br /&gt;
In addition, you can also flush (erase, delete, wipe) the complete ruleset:&lt;br /&gt;
&lt;br /&gt;
 % nft flush ruleset&lt;br /&gt;
&lt;br /&gt;
Also per family:&lt;br /&gt;
&lt;br /&gt;
 % nft flush ruleset arp&lt;br /&gt;
 % nft flush ruleset ip&lt;br /&gt;
 % nft flush ruleset ip6&lt;br /&gt;
 % nft flush ruleset bridge&lt;br /&gt;
 % nft flush ruleset inet&lt;br /&gt;
&lt;br /&gt;
backup/restore&lt;br /&gt;
&lt;br /&gt;
You can combine these two commands above to backup your ruleset:&lt;br /&gt;
&lt;br /&gt;
 % echo &amp;quot;flush ruleset&amp;quot; &amp;gt; backup.nft&lt;br /&gt;
 % nft list ruleset &amp;gt;&amp;gt; backup.nft&lt;br /&gt;
&lt;br /&gt;
And load it [[Atomic_rule_replacement|atomically]]:&lt;br /&gt;
&lt;br /&gt;
 % nft -f backup.nft&lt;br /&gt;
&lt;br /&gt;
Listing in JSON format&lt;br /&gt;
&lt;br /&gt;
You can also export your ruleset in JSON format, just pass the&lt;br /&gt;
&#039;--json&#039; option:&lt;br /&gt;
&lt;br /&gt;
 % nft --json list ruleset &amp;gt; ruleset.json&lt;br /&gt;
&lt;br /&gt;
====Creare regula blocare ip-uri (nativa)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;&lt;br /&gt;
add table inet filter&lt;br /&gt;
add chain inet filter INPUT { type filter hook input priority 1 ; }&lt;br /&gt;
add set inet filter ipmaster { flags interval; type ipv4_addr; auto-merge; }&lt;br /&gt;
add set inet filter ipmaster6 { flags interval; type ipv6_addr; auto-merge; }&lt;br /&gt;
insert rule inet filter INPUT ip saddr @ipmaster counter drop&lt;br /&gt;
insert rule inet filter INPUT ip6 saddr @ipmaster6 counter drop&lt;br /&gt;
&#039; | nft -f -&lt;br /&gt;
ipv4_validate &amp;lt;lista_ip | awk &#039;{print &amp;quot;add element inet filter ipmaster { &amp;quot;$1&amp;quot; }&amp;quot;}&#039; | nft -f - # import ipv4&lt;br /&gt;
ipv6_validate &amp;lt;lista_ip | awk &#039;{print &amp;quot;add element inet filter ipmaster6 { &amp;quot;$1&amp;quot; }&amp;quot;}&#039; | nft -f - # import ipv6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
-&#039;&#039;functia ipv(4|6)_validate este un grep pe clase de ip-uri, nu este necesar pentru o lista simpla.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
-&#039;&#039;Numarul de reguli verificabil cu &amp;quot; nft list table inet filter | grep -oc &#039;,&#039; &amp;quot; &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
-&#039;&#039;Verificarea numarului de &amp;quot;hits&amp;quot; catre adresele blocate se poate face cu &amp;quot; ip(6)tables -vL &amp;quot; sau insumat cu:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 perl -E &#039;/packets (\d+)/ and $s += $1 for `nft list ruleset | grep ipmaster`; say $s&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Creare regula conectare vpn wireguard (nativa)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[ -n $wg_file ]] &amp;amp;&amp;amp; file=$wg_file || file=$opt_file; ! [[ -s $file ]] &amp;amp;&amp;amp; return 1; iname=$(basename -s .conf $file) address=$(grep &#039;^Address&#039; $file | ipv4_validate) address6=$(grep &#039;^Address&#039; $file | ipv6_validate)&lt;br /&gt;
ip link add $iname type wireguard || return 1; wg setconf $iname &amp;lt;(grep -E &#039;^\[Interface|^\[Peer|^PrivateKey|^PublicKey|^Endpoint|^AllowedIPs|^$&#039; $file) || return 1&lt;br /&gt;
ip -4 address add $address dev $iname; ip -6 address add $address6 dev $iname&lt;br /&gt;
grep &#039;^DNS&#039; $file | sed &#039;s/DNS =/nameserver/&#039; | resolvconf -a tun.&amp;quot;$iname&amp;quot; -m 0 -x&lt;br /&gt;
wg set $iname fwmark 51820&lt;br /&gt;
ip link set mtu 1420 up dev $iname&lt;br /&gt;
sysctl -q net.ipv4.conf.all.src_valid_mark=1&lt;br /&gt;
ip -4 route add 0.0.0.0/0 dev $iname table 51820; ip -6 route add ::/0 dev $iname table 51820&lt;br /&gt;
for cmd in &#039;ip -4&#039; &#039;ip -6&#039;; do $cmd rule add not fwmark 51820 table 51820; $cmd rule add table main suppress_prefixlength 0; done&lt;br /&gt;
echo &#039;&lt;br /&gt;
add table inet fw&lt;br /&gt;
add chain inet fw INPUT { type filter hook input priority 0 ; }&lt;br /&gt;
add chain inet fw preraw { type filter hook prerouting priority -300; }&lt;br /&gt;
add rule inet fw preraw iifname != &#039;$iname&#039; ip daddr &#039;$(cut -d/ -f1 &amp;lt;&amp;lt;&amp;lt;$address)&#039; fib saddr type != local drop&lt;br /&gt;
add rule inet fw preraw iifname != &#039;$iname&#039; ip6 daddr &#039;$(cut -d/ -f1 &amp;lt;&amp;lt;&amp;lt;$address6)&#039; fib saddr type != local drop&lt;br /&gt;
add chain inet fw premangle { type filter hook prerouting priority -150; }&lt;br /&gt;
add rule inet fw premangle meta l4proto udp meta mark set ct mark&lt;br /&gt;
add chain inet fw postmangle { type filter hook postrouting priority -150; }&lt;br /&gt;
add rule inet fw postmangle meta l4proto udp mark 51820 ct mark set mark&lt;br /&gt;
&#039; | nft -f - &amp;amp;&amp;amp; echo $iname connected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===iptables===&lt;br /&gt;
&lt;br /&gt;
Regulile se pot incarca cu comanda iptables-restore sau se pot salva in /etc/sysconfig/iptables&lt;br /&gt;
&lt;br /&gt;
====Exemplu 1====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# iptables-save &amp;gt; /dev/stdout&lt;br /&gt;
# Warning: iptables-legacy tables present, use iptables-legacy-save to see them&lt;br /&gt;
# iptables-legacy-save &amp;gt; /dev/stdout&lt;br /&gt;
# Generated by iptables-save v1.8.9 on Mon Nov 11 14:43:17 2024&lt;br /&gt;
*mangle&lt;br /&gt;
:PREROUTING ACCEPT [192:15752]&lt;br /&gt;
:INPUT ACCEPT [192:15752]&lt;br /&gt;
:FORWARD ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [192:15752]&lt;br /&gt;
:POSTROUTING ACCEPT [192:15752]&lt;br /&gt;
COMMIT&lt;br /&gt;
# Completed on Mon Nov 11 14:43:17 2024&lt;br /&gt;
# Generated by iptables-save v1.8.9 on Mon Nov 11 14:43:17 2024&lt;br /&gt;
*nat&lt;br /&gt;
:PREROUTING ACCEPT [0:0]&lt;br /&gt;
:INPUT ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [50:3402]&lt;br /&gt;
:POSTROUTING ACCEPT [50:3402]&lt;br /&gt;
COMMIT&lt;br /&gt;
# Completed on Mon Nov 11 14:43:17 2024&lt;br /&gt;
# Generated by iptables-save v1.8.9 on Mon Nov 11 14:43:17 2024&lt;br /&gt;
*filter&lt;br /&gt;
:INPUT DROP [0:0]&lt;br /&gt;
:FORWARD DROP [0:0]&lt;br /&gt;
:OUTPUT DROP [0:0]&lt;br /&gt;
:bad_packets - [0:0]&lt;br /&gt;
:bad_tcp_packets - [0:0]&lt;br /&gt;
:icmp_packets - [0:0]&lt;br /&gt;
:tcp_inbound - [0:0]&lt;br /&gt;
:tcp_outbound - [0:0]&lt;br /&gt;
:udp_inbound - [0:0]&lt;br /&gt;
:udp_outbound - [0:0]&lt;br /&gt;
-A INPUT -i lo -j ACCEPT&lt;br /&gt;
-A INPUT -j bad_packets&lt;br /&gt;
-A INPUT -d 224.0.0.1/32 -j DROP&lt;br /&gt;
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
-A INPUT -p tcp -j tcp_inbound&lt;br /&gt;
-A INPUT -p udp -j udp_inbound&lt;br /&gt;
-A INPUT -p icmp -j icmp_packets&lt;br /&gt;
-A INPUT -m pkttype --pkt-type broadcast -j DROP&lt;br /&gt;
-A INPUT -m limit --limit 3/min --limit-burst 3 -j LOG --log-prefix &amp;quot;INPUT packet died: &amp;quot;&lt;br /&gt;
-A OUTPUT -p icmp -m conntrack --ctstate INVALID -j DROP&lt;br /&gt;
-A OUTPUT -s 127.0.0.1/32 -j ACCEPT&lt;br /&gt;
-A OUTPUT -o lo -j ACCEPT&lt;br /&gt;
-A OUTPUT -j ACCEPT&lt;br /&gt;
-A OUTPUT -m limit --limit 3/min --limit-burst 3 -j LOG --log-prefix &amp;quot;OUTPUT packet died: &amp;quot;&lt;br /&gt;
-A bad_packets -m conntrack --ctstate INVALID -j LOG --log-prefix &amp;quot;Invalid packet: &amp;quot;&lt;br /&gt;
-A bad_packets -m conntrack --ctstate INVALID -j DROP&lt;br /&gt;
-A bad_packets -p tcp -j bad_tcp_packets&lt;br /&gt;
-A bad_packets -j RETURN&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j LOG --log-prefix &amp;quot;New not syn: &amp;quot;&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j DROP&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j LOG --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j LOG --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j LOG --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j LOG --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j DROP&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j LOG --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j LOG --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP&lt;br /&gt;
-A bad_tcp_packets -p tcp -j RETURN&lt;br /&gt;
-A icmp_packets -p icmp -f -j LOG --log-prefix &amp;quot;ICMP Fragment: &amp;quot;&lt;br /&gt;
-A icmp_packets -p icmp -f -j DROP&lt;br /&gt;
-A icmp_packets -p icmp -m icmp --icmp-type 8 -j DROP&lt;br /&gt;
-A icmp_packets -p icmp -m icmp --icmp-type 11 -j ACCEPT&lt;br /&gt;
-A icmp_packets -p icmp -j RETURN&lt;br /&gt;
-A tcp_inbound -p tcp -m tcp --dport 21 -j ACCEPT&lt;br /&gt;
-A tcp_inbound -p tcp -m tcp --sport 20 -j ACCEPT&lt;br /&gt;
-A tcp_inbound -p tcp -m tcp --dport 22 -j ACCEPT&lt;br /&gt;
-A tcp_inbound -p tcp -m tcp --dport 631 -j ACCEPT&lt;br /&gt;
-A tcp_inbound -p tcp -j RETURN&lt;br /&gt;
-A tcp_outbound -p tcp -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --sport 67 --dport 68 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --dport 631 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --sport 68 --dport 67 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --sport 67 --dport 68 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --dport 111 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --dport 9400 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --dport 2049 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --dport 9401 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --dport 9402 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --dport 9403 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -j RETURN&lt;br /&gt;
-A udp_outbound -p udp -j ACCEPT&lt;br /&gt;
COMMIT&lt;br /&gt;
# Completed on Mon Nov 11 14:43:17 2024&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ceea ce se traduce in:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
iptables -L&lt;br /&gt;
Chain INPUT (policy DROP)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
ACCEPT     all  --  anywhere             anywhere            &lt;br /&gt;
bad_packets  all  --  anywhere             anywhere            &lt;br /&gt;
DROP       all  --  anywhere             224.0.0.1           &lt;br /&gt;
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED&lt;br /&gt;
tcp_inbound  tcp  --  anywhere             anywhere            &lt;br /&gt;
udp_inbound  udp  --  anywhere             anywhere            &lt;br /&gt;
icmp_packets  icmp --  anywhere             anywhere            &lt;br /&gt;
DROP       all  --  anywhere             anywhere             PKTTYPE = broadcast&lt;br /&gt;
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 3 LOG level warn prefix &amp;quot;INPUT packet died: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
Chain FORWARD (policy DROP)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy DROP)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
DROP       icmp --  anywhere             anywhere             ctstate INVALID&lt;br /&gt;
ACCEPT     all  --  localhost            anywhere            &lt;br /&gt;
ACCEPT     all  --  anywhere             anywhere            &lt;br /&gt;
ACCEPT     all  --  anywhere             anywhere            &lt;br /&gt;
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 3 LOG level warn prefix &amp;quot;OUTPUT packet died: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
Chain bad_packets (1 references)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
LOG        all  --  anywhere             anywhere             ctstate INVALID LOG level warn prefix &amp;quot;Invalid packet: &amp;quot;&lt;br /&gt;
DROP       all  --  anywhere             anywhere             ctstate INVALID&lt;br /&gt;
bad_tcp_packets  tcp  --  anywhere             anywhere            &lt;br /&gt;
RETURN     all  --  anywhere             anywhere            &lt;br /&gt;
&lt;br /&gt;
Chain bad_tcp_packets (1 references)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
LOG        tcp  --  anywhere             anywhere             tcp flags:!FIN,SYN,RST,ACK/SYN ctstate NEW LOG level warn prefix &amp;quot;New not syn: &amp;quot;&lt;br /&gt;
DROP       tcp  --  anywhere             anywhere             tcp flags:!FIN,SYN,RST,ACK/SYN ctstate NEW&lt;br /&gt;
LOG        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/NONE LOG level warn prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
DROP       tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/NONE&lt;br /&gt;
LOG        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG LOG level warn prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
DROP       tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG&lt;br /&gt;
LOG        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,PSH,URG LOG level warn prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
DROP       tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,PSH,URG&lt;br /&gt;
LOG        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,ACK,URG LOG level warn prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
DROP       tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,ACK,URG&lt;br /&gt;
LOG        tcp  --  anywhere             anywhere             tcp flags:SYN,RST/SYN,RST LOG level warn prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
DROP       tcp  --  anywhere             anywhere             tcp flags:SYN,RST/SYN,RST&lt;br /&gt;
LOG        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN/FIN,SYN LOG level warn prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
DROP       tcp  --  anywhere             anywhere             tcp flags:FIN,SYN/FIN,SYN&lt;br /&gt;
RETURN     tcp  --  anywhere             anywhere            &lt;br /&gt;
&lt;br /&gt;
Chain icmp_packets (1 references)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
LOG        icmp -f  anywhere             anywhere             LOG level warn prefix &amp;quot;ICMP Fragment: &amp;quot;&lt;br /&gt;
DROP       icmp -f  anywhere             anywhere            &lt;br /&gt;
DROP       icmp --  anywhere             anywhere             icmp echo-request&lt;br /&gt;
ACCEPT     icmp --  anywhere             anywhere             icmp time-exceeded&lt;br /&gt;
RETURN     icmp --  anywhere             anywhere            &lt;br /&gt;
&lt;br /&gt;
Chain tcp_inbound (1 references)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ftp&lt;br /&gt;
ACCEPT     tcp  --  anywhere             anywhere             tcp spt:ftp-data&lt;br /&gt;
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh&lt;br /&gt;
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ipp&lt;br /&gt;
RETURN     tcp  --  anywhere             anywhere            &lt;br /&gt;
&lt;br /&gt;
Chain tcp_outbound (0 references)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
ACCEPT     tcp  --  anywhere             anywhere            &lt;br /&gt;
&lt;br /&gt;
Chain udp_inbound (1 references)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp spt:bootps dpt:bootpc&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp dpt:ipp&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp spt:bootpc dpt:bootps&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp spt:bootps dpt:bootpc&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp dpt:sunrpc&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp dpt:9400&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp dpt:nfs&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp dpt:9401&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp dpt:9402&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp dpt:9403&lt;br /&gt;
RETURN     udp  --  anywhere             anywhere            &lt;br /&gt;
&lt;br /&gt;
Chain udp_outbound (0 references)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Exemplu 2====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*filter&lt;br /&gt;
# Allow all outgoing, but drop incoming and forwarding packets by default&lt;br /&gt;
:INPUT DROP [0:0]&lt;br /&gt;
:FORWARD DROP [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [0:0]&lt;br /&gt;
&lt;br /&gt;
# Custom per-protocol chains&lt;br /&gt;
:UDP - [0:0]&lt;br /&gt;
:TCP - [0:0]&lt;br /&gt;
:ICMP - [0:0]&lt;br /&gt;
&lt;br /&gt;
# Acceptable UDP traffic&lt;br /&gt;
&lt;br /&gt;
# Acceptable TCP traffic&lt;br /&gt;
-A TCP -p tcp --dport 22 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Acceptable ICMP traffic&lt;br /&gt;
&lt;br /&gt;
# Boilerplate acceptance policy&lt;br /&gt;
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT&lt;br /&gt;
-A INPUT -i lo -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Drop invalid packets&lt;br /&gt;
-A INPUT -m conntrack --ctstate INVALID -j DROP&lt;br /&gt;
&lt;br /&gt;
# Pass traffic to protocol-specific chains&lt;br /&gt;
## Only allow new connections (established and related should already be handled)&lt;br /&gt;
## For TCP, additionally only allow new SYN packets since that is the only valid&lt;br /&gt;
## method for establishing a new TCP connection&lt;br /&gt;
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP&lt;br /&gt;
-A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP&lt;br /&gt;
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP&lt;br /&gt;
&lt;br /&gt;
# Reject anything that&#039;s fallen through to this point&lt;br /&gt;
## Try to be protocol-specific w/ rejection message&lt;br /&gt;
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A INPUT -p tcp -j REJECT --reject-with tcp-reset&lt;br /&gt;
-A INPUT -j REJECT --reject-with icmp-proto-unreachable&lt;br /&gt;
&lt;br /&gt;
# Commit the changes&lt;br /&gt;
COMMIT&lt;br /&gt;
&lt;br /&gt;
*raw&lt;br /&gt;
:PREROUTING ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [0:0]&lt;br /&gt;
COMMIT&lt;br /&gt;
&lt;br /&gt;
*nat&lt;br /&gt;
:PREROUTING ACCEPT [0:0]&lt;br /&gt;
:INPUT ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [0:0]&lt;br /&gt;
:POSTROUTING ACCEPT [0:0]&lt;br /&gt;
COMMIT&lt;br /&gt;
&lt;br /&gt;
*security&lt;br /&gt;
:INPUT ACCEPT [0:0]&lt;br /&gt;
:FORWARD ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [0:0]&lt;br /&gt;
COMMIT&lt;br /&gt;
&lt;br /&gt;
*mangle&lt;br /&gt;
:PREROUTING ACCEPT [0:0]&lt;br /&gt;
:INPUT ACCEPT [0:0]&lt;br /&gt;
:FORWARD ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [0:0]&lt;br /&gt;
:POSTROUTING ACCEPT [0:0]&lt;br /&gt;
COMMIT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Creare regula blocare ip-uri (folosind ipset)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ipv4_validate &amp;lt;lista_ip | awk &#039;NR==1{print &amp;quot;create ipmaster hash:net family inet hashsize 100000 maxelem 100000&amp;quot;}&#039;&#039;{print &amp;quot;add ipmaster &amp;quot;$1}&#039; | ipset restore -!&lt;br /&gt;
iptables -I INPUT -m set --match-set ipmaster src -j DROP # import ipv4&lt;br /&gt;
ipv6_validate &amp;lt;lista_ip | awk &#039;NR==1{print &amp;quot;create ipmaster6 hash:net family inet6 hashsize 500000 maxelem 500000&amp;quot;}&#039;&#039;{print &amp;quot;add ipmaster6 &amp;quot;$1}&#039; | ipset restore -!&lt;br /&gt;
ip6tables -I INPUT -m set --match-set ipmaster6 src -j DROP # import ipv6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
-&#039;&#039;functia ipv(4|6)_validate este un grep pe clase de ip-uri, nu este necesar pentru o lista simpla.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
-&#039;&#039;Numarul de reguli verificabil cu &amp;quot; ipset list -t &amp;quot; sau insumat cu:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 perl -E &#039;/Number of entries: (\d+)/ and $s += $1 for `ipset list -t`; say $s&#039;&lt;br /&gt;
&lt;br /&gt;
-&#039;&#039;Verificarea numarului de &amp;quot;hits&amp;quot; catre adresele blocate se poate face cu &amp;quot; ip(6)tables -vL &amp;quot; sau insumat cu:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 perl -E &amp;quot;say $(iptables -vL | awk &#039;NR==3{print $1}&#039;) + $(ip6tables -vL | awk &#039;NR==3{print $1}&#039;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[Advanced_Pagina_6|Pagina anterioară]] | [[Advanced_Pagina_8|Următoarea pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_7&amp;diff=528</id>
		<title>Advanced Pagina 7</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_7&amp;diff=528"/>
		<updated>2024-11-12T11:10:55Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Firewall avansat==&lt;br /&gt;
&lt;br /&gt;
===nftables===&lt;br /&gt;
&lt;br /&gt;
Tabele: ip (implicit), arp, ip6, bridge, inet, netdev.&lt;br /&gt;
&lt;br /&gt;
Lanturi:&lt;br /&gt;
&lt;br /&gt;
  filter: Supported by arp, bridge, ip, ip6 and inet table families.&lt;br /&gt;
  route: Mark packets (like mangle for the output hook, for other hooks use the type filter instead), supported by ip and ip6.&lt;br /&gt;
  nat: In order to perform Network Address Translation, supported by ip and ip6.&lt;br /&gt;
&lt;br /&gt;
Hook: Se refera la stadiul acelui pachet in timp ce este procesat de kernel in Netfilter.&lt;br /&gt;
&lt;br /&gt;
  The hooks for ip, ip6 and inet families are: prerouting, input, forward, output, postrouting.&lt;br /&gt;
  The hooks for arp family are: input, output.&lt;br /&gt;
  The bridge family handles ethernet packets traversing bridge devices.&lt;br /&gt;
  The hooks for netdev are: ingress, egress.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 % nft (add | create) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; [ \{ type &amp;lt;type&amp;gt; hook &amp;lt;hook&amp;gt; [device &amp;lt;device&amp;gt;] priority &amp;lt;priority&amp;gt; \; [policy (accept | drop) \;] \} ]&lt;br /&gt;
 % nft (delete | list | flush) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt;&lt;br /&gt;
 % nft rename chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; &amp;lt;newname&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reguli: nft (add | insert | replace | displace) rule&lt;br /&gt;
&lt;br /&gt;
====Exemplu 1, imitare iptables====&lt;br /&gt;
&lt;br /&gt;
Exemplu de reguli nftables, de importat cu comanda nft -f. O parte din chain-uri imita iptables. Nota: unele distributii acum implementeaza propriile reguli, de recomandat folosita comanda &amp;quot;flush ruleset&amp;quot; inainte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
table inet filter {&lt;br /&gt;
        chain input {&lt;br /&gt;
                type filter hook input priority filter;&lt;br /&gt;
&lt;br /&gt;
                # Allow loopback (local connections)&lt;br /&gt;
                iifname lo accept&lt;br /&gt;
&lt;br /&gt;
                # Allow established/related&lt;br /&gt;
                ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
                # Allow incoming pings&lt;br /&gt;
                ip protocol icmp limit rate 1/second accept&lt;br /&gt;
&lt;br /&gt;
                # Allow SSH and HTTP&lt;br /&gt;
                tcp dport {ssh,http} accept&lt;br /&gt;
&lt;br /&gt;
                # Drop everything else&lt;br /&gt;
                drop&lt;br /&gt;
        }&lt;br /&gt;
        chain forward {&lt;br /&gt;
                type filter hook forward priority filter;&lt;br /&gt;
&lt;br /&gt;
                # Disallow forwarding&lt;br /&gt;
                drop&lt;br /&gt;
        }&lt;br /&gt;
        chain output {&lt;br /&gt;
                type filter hook output priority filter;&lt;br /&gt;
&lt;br /&gt;
                # Allow all outgoing traffic&lt;br /&gt;
                accept&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Exemplu 2, prioritati====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
table ip filter {&lt;br /&gt;
        # This chain is evaluated first due to priority&lt;br /&gt;
        chain services {&lt;br /&gt;
                type filter hook input priority 0; policy accept;&lt;br /&gt;
&lt;br /&gt;
                # If matched, this rule will prevent any further evaluation&lt;br /&gt;
                tcp dport http drop&lt;br /&gt;
&lt;br /&gt;
                # If matched, and despite the accept verdict, the packet proceeds to enter the chain below&lt;br /&gt;
                tcp dport ssh accept&lt;br /&gt;
&lt;br /&gt;
                # Likewise for any packets that get this far and hit the default policy&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # This chain is evaluated last due to priority&lt;br /&gt;
        chain input {&lt;br /&gt;
                type filter hook input priority 1; policy drop;&lt;br /&gt;
                # All ingress packets end up being dropped here!&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Exemplu 3, log====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
table inet firewall {&lt;br /&gt;
    chain inbound {                                                              &lt;br /&gt;
&lt;br /&gt;
        # By default, drop all traffic unless it meets a filter&lt;br /&gt;
        # criteria specified by the rules that follow below.&lt;br /&gt;
        type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
        # Allow traffic from established and related packets, drop invalid&lt;br /&gt;
        ct state vmap { established : accept, related : accept, invalid : drop } &lt;br /&gt;
&lt;br /&gt;
        # Allow loopback traffic.&lt;br /&gt;
        iifname lo accept&lt;br /&gt;
&lt;br /&gt;
        tcp dport { 22, 80, 443, 55291, 5900 } accept&lt;br /&gt;
                                                                                                                                                                                                                                                                                          &lt;br /&gt;
        # Uncomment to enable logging of denied inbound traffic                                                                                                                                                                                                                           &lt;br /&gt;
        log prefix &amp;quot;[nftables] Inbound Denied: &amp;quot; counter drop                                                                                                                                                                                                                             &lt;br /&gt;
    }                                                                                                                                                                                                                                                                                     &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operatii la nivel de ruleset====&lt;br /&gt;
&lt;br /&gt;
listing&lt;br /&gt;
&lt;br /&gt;
Listing the complete ruleset:&lt;br /&gt;
&lt;br /&gt;
 % nft list ruleset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Listing the ruleset per family:&lt;br /&gt;
&lt;br /&gt;
 % nft list ruleset arp&lt;br /&gt;
 % nft list ruleset ip&lt;br /&gt;
 % nft list ruleset ip6&lt;br /&gt;
 % nft list ruleset bridge&lt;br /&gt;
 % nft list ruleset inet&lt;br /&gt;
&lt;br /&gt;
These commands will print all tables/chains/sets/rules of the given family.&lt;br /&gt;
&lt;br /&gt;
flushing&lt;br /&gt;
&lt;br /&gt;
In addition, you can also flush (erase, delete, wipe) the complete ruleset:&lt;br /&gt;
&lt;br /&gt;
 % nft flush ruleset&lt;br /&gt;
&lt;br /&gt;
Also per family:&lt;br /&gt;
&lt;br /&gt;
 % nft flush ruleset arp&lt;br /&gt;
 % nft flush ruleset ip&lt;br /&gt;
 % nft flush ruleset ip6&lt;br /&gt;
 % nft flush ruleset bridge&lt;br /&gt;
 % nft flush ruleset inet&lt;br /&gt;
&lt;br /&gt;
backup/restore&lt;br /&gt;
&lt;br /&gt;
You can combine these two commands above to backup your ruleset:&lt;br /&gt;
&lt;br /&gt;
 % echo &amp;quot;flush ruleset&amp;quot; &amp;gt; backup.nft&lt;br /&gt;
 % nft list ruleset &amp;gt;&amp;gt; backup.nft&lt;br /&gt;
&lt;br /&gt;
And load it [[Atomic_rule_replacement|atomically]]:&lt;br /&gt;
&lt;br /&gt;
 % nft -f backup.nft&lt;br /&gt;
&lt;br /&gt;
Listing in JSON format&lt;br /&gt;
&lt;br /&gt;
You can also export your ruleset in JSON format, just pass the&lt;br /&gt;
&#039;--json&#039; option:&lt;br /&gt;
&lt;br /&gt;
 % nft --json list ruleset &amp;gt; ruleset.json&lt;br /&gt;
&lt;br /&gt;
====Creare regula blocare ip-uri (nativa)====&lt;br /&gt;
&lt;br /&gt;
-&#039;&#039;functia ipv(4|6)_validate este un grep pe clase de ip-uri, nu este necesar pentru o lista simpla.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
-&#039;&#039;Numarul de reguli verificabil cu &amp;quot; nft list table inet filter | grep -oc &#039;,&#039; &amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;&lt;br /&gt;
add table inet filter&lt;br /&gt;
add chain inet filter INPUT { type filter hook input priority 1 ; }&lt;br /&gt;
add set inet filter ipmaster { flags interval; type ipv4_addr; auto-merge; }&lt;br /&gt;
add set inet filter ipmaster6 { flags interval; type ipv6_addr; auto-merge; }&lt;br /&gt;
insert rule inet filter INPUT ip saddr @ipmaster counter drop&lt;br /&gt;
insert rule inet filter INPUT ip6 saddr @ipmaster6 counter drop&lt;br /&gt;
&#039; | nft -f -&lt;br /&gt;
ipv4_validate &amp;lt;/tmp/ip_lists | awk &#039;{print &amp;quot;add element inet filter ipmaster { &amp;quot;$1&amp;quot; }&amp;quot;}&#039; | nft -f - # import ipv4&lt;br /&gt;
ipv6_validate &amp;lt;/tmp/ip_lists | awk &#039;{print &amp;quot;add element inet filter ipmaster6 { &amp;quot;$1&amp;quot; }&amp;quot;}&#039; | nft -f - # import ipv6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Creare regula conectare vpn wireguard (nativa)====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[ -n $wg_file ]] &amp;amp;&amp;amp; file=$wg_file || file=$opt_file; ! [[ -s $file ]] &amp;amp;&amp;amp; return 1; iname=$(basename -s .conf $file) address=$(grep &#039;^Address&#039; $file | ipv4_validate) address6=$(grep &#039;^Address&#039; $file | ipv6_validate)&lt;br /&gt;
ip link add $iname type wireguard || return 1; wg setconf $iname &amp;lt;(grep -E &#039;^\[Interface|^\[Peer|^PrivateKey|^PublicKey|^Endpoint|^AllowedIPs|^$&#039; $file) || return 1&lt;br /&gt;
ip -4 address add $address dev $iname; ip -6 address add $address6 dev $iname&lt;br /&gt;
grep &#039;^DNS&#039; $file | sed &#039;s/DNS =/nameserver/&#039; | resolvconf -a tun.&amp;quot;$iname&amp;quot; -m 0 -x&lt;br /&gt;
wg set $iname fwmark 51820&lt;br /&gt;
ip link set mtu 1420 up dev $iname&lt;br /&gt;
sysctl -q net.ipv4.conf.all.src_valid_mark=1&lt;br /&gt;
ip -4 route add 0.0.0.0/0 dev $iname table 51820; ip -6 route add ::/0 dev $iname table 51820&lt;br /&gt;
for cmd in &#039;ip -4&#039; &#039;ip -6&#039;; do $cmd rule add not fwmark 51820 table 51820; $cmd rule add table main suppress_prefixlength 0; done&lt;br /&gt;
echo &#039;&lt;br /&gt;
add table inet fw&lt;br /&gt;
add chain inet fw INPUT { type filter hook input priority 0 ; }&lt;br /&gt;
add chain inet fw preraw { type filter hook prerouting priority -300; }&lt;br /&gt;
add rule inet fw preraw iifname != &#039;$iname&#039; ip daddr &#039;$(cut -d/ -f1 &amp;lt;&amp;lt;&amp;lt;$address)&#039; fib saddr type != local drop&lt;br /&gt;
add rule inet fw preraw iifname != &#039;$iname&#039; ip6 daddr &#039;$(cut -d/ -f1 &amp;lt;&amp;lt;&amp;lt;$address6)&#039; fib saddr type != local drop&lt;br /&gt;
add chain inet fw premangle { type filter hook prerouting priority -150; }&lt;br /&gt;
add rule inet fw premangle meta l4proto udp meta mark set ct mark&lt;br /&gt;
add chain inet fw postmangle { type filter hook postrouting priority -150; }&lt;br /&gt;
add rule inet fw postmangle meta l4proto udp mark 51820 ct mark set mark&lt;br /&gt;
&#039; | nft -f - &amp;amp;&amp;amp; echo $iname connected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===iptables===&lt;br /&gt;
&lt;br /&gt;
====Exemplu 1====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# iptables-save &amp;gt; /dev/stdout&lt;br /&gt;
# Warning: iptables-legacy tables present, use iptables-legacy-save to see them&lt;br /&gt;
# iptables-legacy-save &amp;gt; /dev/stdout&lt;br /&gt;
# Generated by iptables-save v1.8.9 on Mon Nov 11 14:43:17 2024&lt;br /&gt;
*mangle&lt;br /&gt;
:PREROUTING ACCEPT [192:15752]&lt;br /&gt;
:INPUT ACCEPT [192:15752]&lt;br /&gt;
:FORWARD ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [192:15752]&lt;br /&gt;
:POSTROUTING ACCEPT [192:15752]&lt;br /&gt;
COMMIT&lt;br /&gt;
# Completed on Mon Nov 11 14:43:17 2024&lt;br /&gt;
# Generated by iptables-save v1.8.9 on Mon Nov 11 14:43:17 2024&lt;br /&gt;
*nat&lt;br /&gt;
:PREROUTING ACCEPT [0:0]&lt;br /&gt;
:INPUT ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [50:3402]&lt;br /&gt;
:POSTROUTING ACCEPT [50:3402]&lt;br /&gt;
COMMIT&lt;br /&gt;
# Completed on Mon Nov 11 14:43:17 2024&lt;br /&gt;
# Generated by iptables-save v1.8.9 on Mon Nov 11 14:43:17 2024&lt;br /&gt;
*filter&lt;br /&gt;
:INPUT DROP [0:0]&lt;br /&gt;
:FORWARD DROP [0:0]&lt;br /&gt;
:OUTPUT DROP [0:0]&lt;br /&gt;
:bad_packets - [0:0]&lt;br /&gt;
:bad_tcp_packets - [0:0]&lt;br /&gt;
:icmp_packets - [0:0]&lt;br /&gt;
:tcp_inbound - [0:0]&lt;br /&gt;
:tcp_outbound - [0:0]&lt;br /&gt;
:udp_inbound - [0:0]&lt;br /&gt;
:udp_outbound - [0:0]&lt;br /&gt;
-A INPUT -i lo -j ACCEPT&lt;br /&gt;
-A INPUT -j bad_packets&lt;br /&gt;
-A INPUT -d 224.0.0.1/32 -j DROP&lt;br /&gt;
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
-A INPUT -p tcp -j tcp_inbound&lt;br /&gt;
-A INPUT -p udp -j udp_inbound&lt;br /&gt;
-A INPUT -p icmp -j icmp_packets&lt;br /&gt;
-A INPUT -m pkttype --pkt-type broadcast -j DROP&lt;br /&gt;
-A INPUT -m limit --limit 3/min --limit-burst 3 -j LOG --log-prefix &amp;quot;INPUT packet died: &amp;quot;&lt;br /&gt;
-A OUTPUT -p icmp -m conntrack --ctstate INVALID -j DROP&lt;br /&gt;
-A OUTPUT -s 127.0.0.1/32 -j ACCEPT&lt;br /&gt;
-A OUTPUT -o lo -j ACCEPT&lt;br /&gt;
-A OUTPUT -j ACCEPT&lt;br /&gt;
-A OUTPUT -m limit --limit 3/min --limit-burst 3 -j LOG --log-prefix &amp;quot;OUTPUT packet died: &amp;quot;&lt;br /&gt;
-A bad_packets -m conntrack --ctstate INVALID -j LOG --log-prefix &amp;quot;Invalid packet: &amp;quot;&lt;br /&gt;
-A bad_packets -m conntrack --ctstate INVALID -j DROP&lt;br /&gt;
-A bad_packets -p tcp -j bad_tcp_packets&lt;br /&gt;
-A bad_packets -j RETURN&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j LOG --log-prefix &amp;quot;New not syn: &amp;quot;&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j DROP&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j LOG --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j LOG --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j LOG --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j LOG --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j DROP&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j LOG --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j LOG --log-prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
-A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP&lt;br /&gt;
-A bad_tcp_packets -p tcp -j RETURN&lt;br /&gt;
-A icmp_packets -p icmp -f -j LOG --log-prefix &amp;quot;ICMP Fragment: &amp;quot;&lt;br /&gt;
-A icmp_packets -p icmp -f -j DROP&lt;br /&gt;
-A icmp_packets -p icmp -m icmp --icmp-type 8 -j DROP&lt;br /&gt;
-A icmp_packets -p icmp -m icmp --icmp-type 11 -j ACCEPT&lt;br /&gt;
-A icmp_packets -p icmp -j RETURN&lt;br /&gt;
-A tcp_inbound -p tcp -m tcp --dport 21 -j ACCEPT&lt;br /&gt;
-A tcp_inbound -p tcp -m tcp --sport 20 -j ACCEPT&lt;br /&gt;
-A tcp_inbound -p tcp -m tcp --dport 22 -j ACCEPT&lt;br /&gt;
-A tcp_inbound -p tcp -m tcp --dport 631 -j ACCEPT&lt;br /&gt;
-A tcp_inbound -p tcp -j RETURN&lt;br /&gt;
-A tcp_outbound -p tcp -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --sport 67 --dport 68 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --dport 631 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --sport 68 --dport 67 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --sport 67 --dport 68 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --dport 111 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --dport 9400 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --dport 2049 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --dport 9401 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --dport 9402 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -m udp --dport 9403 -j ACCEPT&lt;br /&gt;
-A udp_inbound -p udp -j RETURN&lt;br /&gt;
-A udp_outbound -p udp -j ACCEPT&lt;br /&gt;
COMMIT&lt;br /&gt;
# Completed on Mon Nov 11 14:43:17 2024&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ceea ce se traduce in:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
iptables -L&lt;br /&gt;
Chain INPUT (policy DROP)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
ACCEPT     all  --  anywhere             anywhere            &lt;br /&gt;
bad_packets  all  --  anywhere             anywhere            &lt;br /&gt;
DROP       all  --  anywhere             224.0.0.1           &lt;br /&gt;
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED&lt;br /&gt;
tcp_inbound  tcp  --  anywhere             anywhere            &lt;br /&gt;
udp_inbound  udp  --  anywhere             anywhere            &lt;br /&gt;
icmp_packets  icmp --  anywhere             anywhere            &lt;br /&gt;
DROP       all  --  anywhere             anywhere             PKTTYPE = broadcast&lt;br /&gt;
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 3 LOG level warn prefix &amp;quot;INPUT packet died: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
Chain FORWARD (policy DROP)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
&lt;br /&gt;
Chain OUTPUT (policy DROP)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
DROP       icmp --  anywhere             anywhere             ctstate INVALID&lt;br /&gt;
ACCEPT     all  --  localhost            anywhere            &lt;br /&gt;
ACCEPT     all  --  anywhere             anywhere            &lt;br /&gt;
ACCEPT     all  --  anywhere             anywhere            &lt;br /&gt;
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 3 LOG level warn prefix &amp;quot;OUTPUT packet died: &amp;quot;&lt;br /&gt;
&lt;br /&gt;
Chain bad_packets (1 references)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
LOG        all  --  anywhere             anywhere             ctstate INVALID LOG level warn prefix &amp;quot;Invalid packet: &amp;quot;&lt;br /&gt;
DROP       all  --  anywhere             anywhere             ctstate INVALID&lt;br /&gt;
bad_tcp_packets  tcp  --  anywhere             anywhere            &lt;br /&gt;
RETURN     all  --  anywhere             anywhere            &lt;br /&gt;
&lt;br /&gt;
Chain bad_tcp_packets (1 references)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
LOG        tcp  --  anywhere             anywhere             tcp flags:!FIN,SYN,RST,ACK/SYN ctstate NEW LOG level warn prefix &amp;quot;New not syn: &amp;quot;&lt;br /&gt;
DROP       tcp  --  anywhere             anywhere             tcp flags:!FIN,SYN,RST,ACK/SYN ctstate NEW&lt;br /&gt;
LOG        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/NONE LOG level warn prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
DROP       tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/NONE&lt;br /&gt;
LOG        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG LOG level warn prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
DROP       tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG&lt;br /&gt;
LOG        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,PSH,URG LOG level warn prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
DROP       tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,PSH,URG&lt;br /&gt;
LOG        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,ACK,URG LOG level warn prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
DROP       tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,ACK,URG&lt;br /&gt;
LOG        tcp  --  anywhere             anywhere             tcp flags:SYN,RST/SYN,RST LOG level warn prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
DROP       tcp  --  anywhere             anywhere             tcp flags:SYN,RST/SYN,RST&lt;br /&gt;
LOG        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN/FIN,SYN LOG level warn prefix &amp;quot;Stealth scan: &amp;quot;&lt;br /&gt;
DROP       tcp  --  anywhere             anywhere             tcp flags:FIN,SYN/FIN,SYN&lt;br /&gt;
RETURN     tcp  --  anywhere             anywhere            &lt;br /&gt;
&lt;br /&gt;
Chain icmp_packets (1 references)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
LOG        icmp -f  anywhere             anywhere             LOG level warn prefix &amp;quot;ICMP Fragment: &amp;quot;&lt;br /&gt;
DROP       icmp -f  anywhere             anywhere            &lt;br /&gt;
DROP       icmp --  anywhere             anywhere             icmp echo-request&lt;br /&gt;
ACCEPT     icmp --  anywhere             anywhere             icmp time-exceeded&lt;br /&gt;
RETURN     icmp --  anywhere             anywhere            &lt;br /&gt;
&lt;br /&gt;
Chain tcp_inbound (1 references)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ftp&lt;br /&gt;
ACCEPT     tcp  --  anywhere             anywhere             tcp spt:ftp-data&lt;br /&gt;
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh&lt;br /&gt;
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ipp&lt;br /&gt;
RETURN     tcp  --  anywhere             anywhere            &lt;br /&gt;
&lt;br /&gt;
Chain tcp_outbound (0 references)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
ACCEPT     tcp  --  anywhere             anywhere            &lt;br /&gt;
&lt;br /&gt;
Chain udp_inbound (1 references)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp spt:bootps dpt:bootpc&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp dpt:ipp&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp spt:bootpc dpt:bootps&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp spt:bootps dpt:bootpc&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp dpt:sunrpc&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp dpt:9400&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp dpt:nfs&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp dpt:9401&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp dpt:9402&lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere             udp dpt:9403&lt;br /&gt;
RETURN     udp  --  anywhere             anywhere            &lt;br /&gt;
&lt;br /&gt;
Chain udp_outbound (0 references)&lt;br /&gt;
target     prot opt source               destination         &lt;br /&gt;
ACCEPT     udp  --  anywhere             anywhere  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Exemplu 2====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
*filter&lt;br /&gt;
# Allow all outgoing, but drop incoming and forwarding packets by default&lt;br /&gt;
:INPUT DROP [0:0]&lt;br /&gt;
:FORWARD DROP [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [0:0]&lt;br /&gt;
&lt;br /&gt;
# Custom per-protocol chains&lt;br /&gt;
:UDP - [0:0]&lt;br /&gt;
:TCP - [0:0]&lt;br /&gt;
:ICMP - [0:0]&lt;br /&gt;
&lt;br /&gt;
# Acceptable UDP traffic&lt;br /&gt;
&lt;br /&gt;
# Acceptable TCP traffic&lt;br /&gt;
-A TCP -p tcp --dport 22 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Acceptable ICMP traffic&lt;br /&gt;
&lt;br /&gt;
# Boilerplate acceptance policy&lt;br /&gt;
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT&lt;br /&gt;
-A INPUT -i lo -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
# Drop invalid packets&lt;br /&gt;
-A INPUT -m conntrack --ctstate INVALID -j DROP&lt;br /&gt;
&lt;br /&gt;
# Pass traffic to protocol-specific chains&lt;br /&gt;
## Only allow new connections (established and related should already be handled)&lt;br /&gt;
## For TCP, additionally only allow new SYN packets since that is the only valid&lt;br /&gt;
## method for establishing a new TCP connection&lt;br /&gt;
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP&lt;br /&gt;
-A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP&lt;br /&gt;
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP&lt;br /&gt;
&lt;br /&gt;
# Reject anything that&#039;s fallen through to this point&lt;br /&gt;
## Try to be protocol-specific w/ rejection message&lt;br /&gt;
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable&lt;br /&gt;
-A INPUT -p tcp -j REJECT --reject-with tcp-reset&lt;br /&gt;
-A INPUT -j REJECT --reject-with icmp-proto-unreachable&lt;br /&gt;
&lt;br /&gt;
# Commit the changes&lt;br /&gt;
COMMIT&lt;br /&gt;
&lt;br /&gt;
*raw&lt;br /&gt;
:PREROUTING ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [0:0]&lt;br /&gt;
COMMIT&lt;br /&gt;
&lt;br /&gt;
*nat&lt;br /&gt;
:PREROUTING ACCEPT [0:0]&lt;br /&gt;
:INPUT ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [0:0]&lt;br /&gt;
:POSTROUTING ACCEPT [0:0]&lt;br /&gt;
COMMIT&lt;br /&gt;
&lt;br /&gt;
*security&lt;br /&gt;
:INPUT ACCEPT [0:0]&lt;br /&gt;
:FORWARD ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [0:0]&lt;br /&gt;
COMMIT&lt;br /&gt;
&lt;br /&gt;
*mangle&lt;br /&gt;
:PREROUTING ACCEPT [0:0]&lt;br /&gt;
:INPUT ACCEPT [0:0]&lt;br /&gt;
:FORWARD ACCEPT [0:0]&lt;br /&gt;
:OUTPUT ACCEPT [0:0]&lt;br /&gt;
:POSTROUTING ACCEPT [0:0]&lt;br /&gt;
COMMIT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Creare regula blocare ip-uri (folosind ipset)====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ipv4_validate &amp;lt;/tmp/ip_lists | awk &#039;NR==1{print &amp;quot;create ipmaster hash:net family inet hashsize 100000 maxelem 100000&amp;quot;}&#039;&#039;{print &amp;quot;add ipmaster &amp;quot;$1}&#039; | ipset restore -!&lt;br /&gt;
iptables -I INPUT -m set --match-set ipmaster src -j DROP || ierr=1 # import ipv4&lt;br /&gt;
ipv6_validate &amp;lt;/tmp/ip_lists | awk &#039;NR==1{print &amp;quot;create ipmaster6 hash:net family inet6 hashsize 500000 maxelem 500000&amp;quot;}&#039;&#039;{print &amp;quot;add ipmaster6 &amp;quot;$1}&#039; | ipset restore -!&lt;br /&gt;
ip6tables -I INPUT -m set --match-set ipmaster6 src -j DROP || ierr=1 # import ipv6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Advanced_Pagina_6|Pagina anterioară]] | [[Advanced_Pagina_8|Următoarea pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_7&amp;diff=527</id>
		<title>Advanced Pagina 7</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_7&amp;diff=527"/>
		<updated>2024-11-11T14:12:21Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Firewall avansat==&lt;br /&gt;
&lt;br /&gt;
===nftables===&lt;br /&gt;
&lt;br /&gt;
Tabele: ip (implicit), arp, ip6, bridge, inet, netdev.&lt;br /&gt;
&lt;br /&gt;
Lanturi:&lt;br /&gt;
&lt;br /&gt;
  filter: Supported by arp, bridge, ip, ip6 and inet table families.&lt;br /&gt;
  route: Mark packets (like mangle for the output hook, for other hooks use the type filter instead), supported by ip and ip6.&lt;br /&gt;
  nat: In order to perform Network Address Translation, supported by ip and ip6.&lt;br /&gt;
&lt;br /&gt;
Hook: Se refera la stadiul acelui pachet in timp ce este procesat de kernel in Netfilter.&lt;br /&gt;
&lt;br /&gt;
  The hooks for ip, ip6 and inet families are: prerouting, input, forward, output, postrouting.&lt;br /&gt;
  The hooks for arp family are: input, output.&lt;br /&gt;
  The bridge family handles ethernet packets traversing bridge devices.&lt;br /&gt;
  The hooks for netdev are: ingress, egress.&lt;br /&gt;
&lt;br /&gt;
policy este verdictul pentru a controla cursul acelui pachet in lant si tabel. Posibile valori: accept (default) si drop.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 % nft (add | create) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; [ \{ type &amp;lt;type&amp;gt; hook &amp;lt;hook&amp;gt; [device &amp;lt;device&amp;gt;] priority &amp;lt;priority&amp;gt; \; [policy &amp;lt;policy&amp;gt; \;] \} ]&lt;br /&gt;
 % nft (delete | list | flush) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt;&lt;br /&gt;
 % nft rename chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; &amp;lt;newname&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reguli: nft (add | insert | replace | displace) rule&lt;br /&gt;
&lt;br /&gt;
====Exemplu 1, imitare iptables====&lt;br /&gt;
&lt;br /&gt;
Exemplu de reguli nftables, de importat cu comanda nft -f. O parte din chain-uri imita iptables. Nota: unele distributii acum implementeaza propriile reguli, de recomandat folosita comanda &amp;quot;flush ruleset&amp;quot; inainte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
table inet filter {&lt;br /&gt;
        chain input {&lt;br /&gt;
                type filter hook input priority filter;&lt;br /&gt;
&lt;br /&gt;
                # Allow loopback (local connections)&lt;br /&gt;
                iifname lo accept&lt;br /&gt;
&lt;br /&gt;
                # Allow established/related&lt;br /&gt;
                ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
                # Allow incoming pings&lt;br /&gt;
                ip protocol icmp limit rate 1/second accept&lt;br /&gt;
&lt;br /&gt;
                # Allow SSH and HTTP&lt;br /&gt;
                tcp dport {ssh,http} accept&lt;br /&gt;
&lt;br /&gt;
                # Drop everything else&lt;br /&gt;
                drop&lt;br /&gt;
        }&lt;br /&gt;
        chain forward {&lt;br /&gt;
                type filter hook forward priority filter;&lt;br /&gt;
&lt;br /&gt;
                # Disallow forwarding&lt;br /&gt;
                drop&lt;br /&gt;
        }&lt;br /&gt;
        chain output {&lt;br /&gt;
                type filter hook output priority filter;&lt;br /&gt;
&lt;br /&gt;
                # Allow all outgoing traffic&lt;br /&gt;
                accept&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Exemplu 2, prioritati====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
table ip filter {&lt;br /&gt;
        # This chain is evaluated first due to priority&lt;br /&gt;
        chain services {&lt;br /&gt;
                type filter hook input priority 0; policy accept;&lt;br /&gt;
&lt;br /&gt;
                # If matched, this rule will prevent any further evaluation&lt;br /&gt;
                tcp dport http drop&lt;br /&gt;
&lt;br /&gt;
                # If matched, and despite the accept verdict, the packet proceeds to enter the chain below&lt;br /&gt;
                tcp dport ssh accept&lt;br /&gt;
&lt;br /&gt;
                # Likewise for any packets that get this far and hit the default policy&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # This chain is evaluated last due to priority&lt;br /&gt;
        chain input {&lt;br /&gt;
                type filter hook input priority 1; policy drop;&lt;br /&gt;
                # All ingress packets end up being dropped here!&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Exemplu 3====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
table inet firewall {&lt;br /&gt;
    chain inbound {                                                              &lt;br /&gt;
&lt;br /&gt;
        # By default, drop all traffic unless it meets a filter&lt;br /&gt;
        # criteria specified by the rules that follow below.&lt;br /&gt;
        type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
        # Allow traffic from established and related packets, drop invalid&lt;br /&gt;
        ct state vmap { established : accept, related : accept, invalid : drop } &lt;br /&gt;
&lt;br /&gt;
        # Allow loopback traffic.&lt;br /&gt;
        iifname lo accept&lt;br /&gt;
&lt;br /&gt;
        tcp dport { 22, 80, 443, 55291, 5900 } accept&lt;br /&gt;
                                                                                                                                                                                                                                                                                          &lt;br /&gt;
        # Uncomment to enable logging of denied inbound traffic                                                                                                                                                                                                                           &lt;br /&gt;
        log prefix &amp;quot;[nftables] Inbound Denied: &amp;quot; counter drop                                                                                                                                                                                                                             &lt;br /&gt;
    }                                                                                                                                                                                                                                                                                     &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operatii la nivel de ruleset====&lt;br /&gt;
&lt;br /&gt;
listing&lt;br /&gt;
&lt;br /&gt;
Listing the complete ruleset:&lt;br /&gt;
&lt;br /&gt;
 % nft list ruleset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Listing the ruleset per family:&lt;br /&gt;
&lt;br /&gt;
 % nft list ruleset arp&lt;br /&gt;
 % nft list ruleset ip&lt;br /&gt;
 % nft list ruleset ip6&lt;br /&gt;
 % nft list ruleset bridge&lt;br /&gt;
 % nft list ruleset inet&lt;br /&gt;
&lt;br /&gt;
These commands will print all tables/chains/sets/rules of the given family.&lt;br /&gt;
&lt;br /&gt;
flushing&lt;br /&gt;
&lt;br /&gt;
In addition, you can also flush (erase, delete, wipe) the complete ruleset:&lt;br /&gt;
&lt;br /&gt;
 % nft flush ruleset&lt;br /&gt;
&lt;br /&gt;
Also per family:&lt;br /&gt;
&lt;br /&gt;
 % nft flush ruleset arp&lt;br /&gt;
 % nft flush ruleset ip&lt;br /&gt;
 % nft flush ruleset ip6&lt;br /&gt;
 % nft flush ruleset bridge&lt;br /&gt;
 % nft flush ruleset inet&lt;br /&gt;
&lt;br /&gt;
backup/restore&lt;br /&gt;
&lt;br /&gt;
You can combine these two commands above to backup your ruleset:&lt;br /&gt;
&lt;br /&gt;
 % echo &amp;quot;flush ruleset&amp;quot; &amp;gt; backup.nft&lt;br /&gt;
 % nft list ruleset &amp;gt;&amp;gt; backup.nft&lt;br /&gt;
&lt;br /&gt;
And load it [[Atomic_rule_replacement|atomically]]:&lt;br /&gt;
&lt;br /&gt;
 % nft -f backup.nft&lt;br /&gt;
&lt;br /&gt;
Listing in JSON format&lt;br /&gt;
&lt;br /&gt;
You can also export your ruleset in JSON format, just pass the&lt;br /&gt;
&#039;--json&#039; option:&lt;br /&gt;
&lt;br /&gt;
 % nft --json list ruleset &amp;gt; ruleset.json&lt;br /&gt;
&lt;br /&gt;
====Creare regula blocare ip-uri (nativa)====&lt;br /&gt;
&lt;br /&gt;
-&#039;&#039;functia ipv(4|6)_validate este un grep pe clase de ip-uri, nu este necesar pentru o lista simpla.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
-&#039;&#039;Numarul de reguli verificabil cu &amp;quot; nft list table inet filter | grep -oc &#039;,&#039; &amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;&lt;br /&gt;
add table inet filter&lt;br /&gt;
add chain inet filter INPUT { type filter hook input priority 1 ; }&lt;br /&gt;
add set inet filter ipmaster { flags interval; type ipv4_addr; auto-merge; }&lt;br /&gt;
add set inet filter ipmaster6 { flags interval; type ipv6_addr; auto-merge; }&lt;br /&gt;
insert rule inet filter INPUT ip saddr @ipmaster counter drop&lt;br /&gt;
insert rule inet filter INPUT ip6 saddr @ipmaster6 counter drop&lt;br /&gt;
&#039; | nft -f -&lt;br /&gt;
ipv4_validate &amp;lt;/tmp/ip_lists | awk &#039;{print &amp;quot;add element inet filter ipmaster { &amp;quot;$1&amp;quot; }&amp;quot;}&#039; | nft -f - # import ipv4&lt;br /&gt;
ipv6_validate &amp;lt;/tmp/ip_lists | awk &#039;{print &amp;quot;add element inet filter ipmaster6 { &amp;quot;$1&amp;quot; }&amp;quot;}&#039; | nft -f - # import ipv6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Creare regula conectare vpn wireguard (nativa)====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[ -n $wg_file ]] &amp;amp;&amp;amp; file=$wg_file || file=$opt_file; ! [[ -s $file ]] &amp;amp;&amp;amp; return 1; iname=$(basename -s .conf $file) address=$(grep &#039;^Address&#039; $file | ipv4_validate) address6=$(grep &#039;^Address&#039; $file | ipv6_validate)&lt;br /&gt;
ip link add $iname type wireguard || return 1; wg setconf $iname &amp;lt;(grep -E &#039;^\[Interface|^\[Peer|^PrivateKey|^PublicKey|^Endpoint|^AllowedIPs|^$&#039; $file) || return 1&lt;br /&gt;
ip -4 address add $address dev $iname; ip -6 address add $address6 dev $iname&lt;br /&gt;
grep &#039;^DNS&#039; $file | sed &#039;s/DNS =/nameserver/&#039; | resolvconf -a tun.&amp;quot;$iname&amp;quot; -m 0 -x&lt;br /&gt;
wg set $iname fwmark 51820&lt;br /&gt;
ip link set mtu 1420 up dev $iname&lt;br /&gt;
sysctl -q net.ipv4.conf.all.src_valid_mark=1&lt;br /&gt;
ip -4 route add 0.0.0.0/0 dev $iname table 51820; ip -6 route add ::/0 dev $iname table 51820&lt;br /&gt;
for cmd in &#039;ip -4&#039; &#039;ip -6&#039;; do $cmd rule add not fwmark 51820 table 51820; $cmd rule add table main suppress_prefixlength 0; done&lt;br /&gt;
echo &#039;&lt;br /&gt;
add table inet fw&lt;br /&gt;
add chain inet fw INPUT { type filter hook input priority 0 ; }&lt;br /&gt;
add chain inet fw preraw { type filter hook prerouting priority -300; }&lt;br /&gt;
add rule inet fw preraw iifname != &#039;$iname&#039; ip daddr &#039;$(cut -d/ -f1 &amp;lt;&amp;lt;&amp;lt;$address)&#039; fib saddr type != local drop&lt;br /&gt;
add rule inet fw preraw iifname != &#039;$iname&#039; ip6 daddr &#039;$(cut -d/ -f1 &amp;lt;&amp;lt;&amp;lt;$address6)&#039; fib saddr type != local drop&lt;br /&gt;
add chain inet fw premangle { type filter hook prerouting priority -150; }&lt;br /&gt;
add rule inet fw premangle meta l4proto udp meta mark set ct mark&lt;br /&gt;
add chain inet fw postmangle { type filter hook postrouting priority -150; }&lt;br /&gt;
add rule inet fw postmangle meta l4proto udp mark 51820 ct mark set mark&lt;br /&gt;
&#039; | nft -f - &amp;amp;&amp;amp; echo $iname connected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===iptables===&lt;br /&gt;
&lt;br /&gt;
[[Advanced_Pagina_6|Pagina anterioară]] | [[Advanced_Pagina_8|Următoarea pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_7&amp;diff=526</id>
		<title>Advanced Pagina 7</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_7&amp;diff=526"/>
		<updated>2024-11-11T13:54:59Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Firewall avansat==&lt;br /&gt;
&lt;br /&gt;
===nftables===&lt;br /&gt;
&lt;br /&gt;
Tabele: ip (implicit), arp, ip6, bridge, inet, netdev.&lt;br /&gt;
&lt;br /&gt;
Lanturi:&lt;br /&gt;
&lt;br /&gt;
  filter: Supported by arp, bridge, ip, ip6 and inet table families.&lt;br /&gt;
  route: Mark packets (like mangle for the output hook, for other hooks use the type filter instead), supported by ip and ip6.&lt;br /&gt;
  nat: In order to perform Network Address Translation, supported by ip and ip6.&lt;br /&gt;
&lt;br /&gt;
Hook: Se refera la stadiul acelui pachet in timp ce este procesat de kernel in Netfilter.&lt;br /&gt;
&lt;br /&gt;
  The hooks for ip, ip6 and inet families are: prerouting, input, forward, output, postrouting.&lt;br /&gt;
  The hooks for arp family are: input, output.&lt;br /&gt;
  The bridge family handles ethernet packets traversing bridge devices.&lt;br /&gt;
  The hooks for netdev are: ingress, egress.&lt;br /&gt;
&lt;br /&gt;
policy este verdictul pentru a controla cursul acelui pachet in lant si tabel. Posibile valori: accept (default) si drop.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 % nft (add | create) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; [ \{ type &amp;lt;type&amp;gt; hook &amp;lt;hook&amp;gt; [device &amp;lt;device&amp;gt;] priority &amp;lt;priority&amp;gt; \; [policy &amp;lt;policy&amp;gt; \;] \} ]&lt;br /&gt;
 % nft (delete | list | flush) chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt;&lt;br /&gt;
 % nft rename chain [&amp;lt;family&amp;gt;] &amp;lt;table&amp;gt; &amp;lt;name&amp;gt; &amp;lt;newname&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reguli: nft (add | insert | replace | displace) rule&lt;br /&gt;
&lt;br /&gt;
====Exemplu 1, imitare iptables====&lt;br /&gt;
&lt;br /&gt;
Exemplu de reguli nftables, de importat cu comanda nft -f. O parte din chain-uri imita iptables. Nota: unele distributii acum implementeaza propriile reguli, de recomandat folosita comanda &amp;quot;flush ruleset&amp;quot; inainte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
table inet filter {&lt;br /&gt;
        chain input {&lt;br /&gt;
                type filter hook input priority filter;&lt;br /&gt;
&lt;br /&gt;
                # Allow loopback (local connections)&lt;br /&gt;
                iifname lo accept&lt;br /&gt;
&lt;br /&gt;
                # Allow established/related&lt;br /&gt;
                ct state established,related accept&lt;br /&gt;
&lt;br /&gt;
                # Allow incoming pings&lt;br /&gt;
                ip protocol icmp limit rate 1/second accept&lt;br /&gt;
&lt;br /&gt;
                # Allow SSH and HTTP&lt;br /&gt;
                tcp dport {ssh,http} accept&lt;br /&gt;
&lt;br /&gt;
                # Drop everything else&lt;br /&gt;
                drop&lt;br /&gt;
        }&lt;br /&gt;
        chain forward {&lt;br /&gt;
                type filter hook forward priority filter;&lt;br /&gt;
&lt;br /&gt;
                # Disallow forwarding&lt;br /&gt;
                drop&lt;br /&gt;
        }&lt;br /&gt;
        chain output {&lt;br /&gt;
                type filter hook output priority filter;&lt;br /&gt;
&lt;br /&gt;
                # Allow all outgoing traffic&lt;br /&gt;
                accept&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Exemplu 2, prioritati====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
table ip filter {&lt;br /&gt;
        # This chain is evaluated first due to priority&lt;br /&gt;
        chain services {&lt;br /&gt;
                type filter hook input priority 0; policy accept;&lt;br /&gt;
&lt;br /&gt;
                # If matched, this rule will prevent any further evaluation&lt;br /&gt;
                tcp dport http drop&lt;br /&gt;
&lt;br /&gt;
                # If matched, and despite the accept verdict, the packet proceeds to enter the chain below&lt;br /&gt;
                tcp dport ssh accept&lt;br /&gt;
&lt;br /&gt;
                # Likewise for any packets that get this far and hit the default policy&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        # This chain is evaluated last due to priority&lt;br /&gt;
        chain input {&lt;br /&gt;
                type filter hook input priority 1; policy drop;&lt;br /&gt;
                # All ingress packets end up being dropped here!&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Exemplu 3====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
table inet firewall {&lt;br /&gt;
    chain inbound {                                                              &lt;br /&gt;
&lt;br /&gt;
        # By default, drop all traffic unless it meets a filter&lt;br /&gt;
        # criteria specified by the rules that follow below.&lt;br /&gt;
        type filter hook input priority 0; policy drop;&lt;br /&gt;
&lt;br /&gt;
        # Allow traffic from established and related packets, drop invalid&lt;br /&gt;
        ct state vmap { established : accept, related : accept, invalid : drop } &lt;br /&gt;
&lt;br /&gt;
        # Allow loopback traffic.&lt;br /&gt;
        iifname lo accept&lt;br /&gt;
&lt;br /&gt;
        tcp dport { 22, 80, 443, 55291, 5900 } accept&lt;br /&gt;
                                                                                                                                                                                                                                                                                          &lt;br /&gt;
        # Uncomment to enable logging of denied inbound traffic                                                                                                                                                                                                                           &lt;br /&gt;
        log prefix &amp;quot;[nftables] Inbound Denied: &amp;quot; counter drop                                                                                                                                                                                                                             &lt;br /&gt;
    }                                                                                                                                                                                                                                                                                     &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Operatii la nivel de ruleset====&lt;br /&gt;
&lt;br /&gt;
listing&lt;br /&gt;
&lt;br /&gt;
Listing the complete ruleset:&lt;br /&gt;
&lt;br /&gt;
 % nft list ruleset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Listing the ruleset per family:&lt;br /&gt;
&lt;br /&gt;
 % nft list ruleset arp&lt;br /&gt;
 % nft list ruleset ip&lt;br /&gt;
 % nft list ruleset ip6&lt;br /&gt;
 % nft list ruleset bridge&lt;br /&gt;
 % nft list ruleset inet&lt;br /&gt;
&lt;br /&gt;
These commands will print all tables/chains/sets/rules of the given family.&lt;br /&gt;
&lt;br /&gt;
flushing&lt;br /&gt;
&lt;br /&gt;
In addition, you can also flush (erase, delete, wipe) the complete ruleset:&lt;br /&gt;
&lt;br /&gt;
 % nft flush ruleset&lt;br /&gt;
&lt;br /&gt;
Also per family:&lt;br /&gt;
&lt;br /&gt;
 % nft flush ruleset arp&lt;br /&gt;
 % nft flush ruleset ip&lt;br /&gt;
 % nft flush ruleset ip6&lt;br /&gt;
 % nft flush ruleset bridge&lt;br /&gt;
 % nft flush ruleset inet&lt;br /&gt;
&lt;br /&gt;
backup/restore&lt;br /&gt;
&lt;br /&gt;
You can combine these two commands above to backup your ruleset:&lt;br /&gt;
&lt;br /&gt;
 % echo &amp;quot;flush ruleset&amp;quot; &amp;gt; backup.nft&lt;br /&gt;
 % nft list ruleset &amp;gt;&amp;gt; backup.nft&lt;br /&gt;
&lt;br /&gt;
And load it [[Atomic_rule_replacement|atomically]]:&lt;br /&gt;
&lt;br /&gt;
 % nft -f backup.nft&lt;br /&gt;
&lt;br /&gt;
Listing in JSON format&lt;br /&gt;
&lt;br /&gt;
You can also export your ruleset in JSON format, just pass the&lt;br /&gt;
&#039;--json&#039; option:&lt;br /&gt;
&lt;br /&gt;
 % nft --json list ruleset &amp;gt; ruleset.json&lt;br /&gt;
&lt;br /&gt;
====Creare regula blocare ip-uri de sine statoare====&lt;br /&gt;
&lt;br /&gt;
-&#039;&#039;functia ipv(4|6)_validate este un grep pe clase de ip-uri, nu este necesar pentru o lista simpla.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
-&#039;&#039;Numarul de reguli verificabil cu &amp;quot; nft list table inet utilities_filter | grep -oc &#039;,&#039; &amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ! nft list chain inet filter INPUT &amp;gt;$quiet 2&amp;gt;&amp;amp;1; then&lt;br /&gt;
echo &#039;&lt;br /&gt;
add table inet filter&lt;br /&gt;
add chain inet filter INPUT { type filter hook input priority 1 ; }&lt;br /&gt;
add set inet filter ipmaster { flags interval; type ipv4_addr; auto-merge; }&lt;br /&gt;
add set inet filter ipmaster6 { flags interval; type ipv6_addr; auto-merge; }&lt;br /&gt;
insert rule inet filter INPUT ip saddr @ipmaster counter drop&lt;br /&gt;
insert rule inet filter INPUT ip6 saddr @ipmaster6 counter drop&lt;br /&gt;
&#039; | nft -f -; fi&lt;br /&gt;
ipv4_validate &amp;lt;/tmp/ip_lists | awk &#039;{print &amp;quot;add element inet filter ipmaster { &amp;quot;$1&amp;quot; }&amp;quot;}&#039; | nft -f - # import ipv4&lt;br /&gt;
ipv6_validate &amp;lt;/tmp/ip_lists | awk &#039;{print &amp;quot;add element inet filter ipmaster6 { &amp;quot;$1&amp;quot; }&amp;quot;}&#039; | nft -f - # import ipv6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===iptables===&lt;br /&gt;
&lt;br /&gt;
[[Advanced_Pagina_6|Pagina anterioară]] | [[Advanced_Pagina_8|Următoarea pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_2&amp;diff=525</id>
		<title>Advanced Pagina 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_2&amp;diff=525"/>
		<updated>2024-11-11T13:17:39Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Server DNS==&lt;br /&gt;
[[Curs_Linux_Advanced|Pagina anterioară]] | [[Advanced_Pagina_3|Următoarea pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Essentials_Pagina_1&amp;diff=524</id>
		<title>Essentials Pagina 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Essentials_Pagina_1&amp;diff=524"/>
		<updated>2024-11-11T13:10:15Z</updated>

		<summary type="html">&lt;p&gt;Admin: Ținta redirecționării a fost schimbată de la Curs Essentials la Curs Linux Essentials&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECTEAZA [[Curs Linux Essentials]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Curs_Linux_Advanced&amp;diff=522</id>
		<title>Curs Linux Advanced</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Curs_Linux_Advanced&amp;diff=522"/>
		<updated>2024-11-08T22:49:43Z</updated>

		<summary type="html">&lt;p&gt;Admin: Admin a redenumit pagina Curs Advanced în Curs Linux Advanced&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Acces SSH==&lt;br /&gt;
&lt;br /&gt;
===Despre===&lt;br /&gt;
&lt;br /&gt;
Secure Shell (SSH) este un protocol de rețea criptografic ce permite ca datele să fie transferate folosind un canal securizat intre dispozitive de rețea. Cele două mari versiuni ale protocolului sunt SSH1 sau SSH-1 și SSH2 sau SSH-2. Folosit cu precădere în sistemele de operare multiutilizator bazate pe unix, SSH a fost dezvoltat ca un înlocuitor al Telnet-ului și al altor protocoale nesigure de acces de la distanță, care trimit informatia, în special parola, în clar, făcând posibilă descoperirea ei prin analiza traficului. Criptarea folosită de SSH intenționează să asigure integritatea datelor transmise printr-o rețea nesigură cum este Internetul.&lt;br /&gt;
&lt;br /&gt;
SSH utilizeaza o arhitectura client-server pentru comunicarea securizata prin retea, prin conectarea unui client ssh cu serverul ssh. In mod implicit, serverul SSH ruleaza pe portul TCP standard 22.&lt;br /&gt;
&lt;br /&gt;
SSH foloseste o tehnica de criptografie cu cheie publica pentru autentificare intre client si server. In plus, protocolul foloseste criptare simetrica puternica si algoritmi de hashing pentru schimbul de mesaje intre client si server, pentru a asigura confidentialitatea si integritatea datelor.&lt;br /&gt;
&lt;br /&gt;
Majoritatea sesiunilor SSH vor avea doar urmatoarele doua operatii:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Autentificare&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Executarea comenzii&lt;br /&gt;
&lt;br /&gt;
Serverele SSH pot autentifica clientii folosind o varietate de metode; cele doua moduri de autentificare frecvent utilizate sunt:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Pe baza parolei (metoda implicita utilizata pentru clientii OpenSSH, cea mai simpla autentificare dar nu cea mai sigura)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Pe baza de cheie (imbunatateste securitatea sistemului prin generarea de perechi de chei SSH,  o alternativa mai sigura)&lt;br /&gt;
&lt;br /&gt;
Dupa ce serverul autentifica clientul cu succes, se stabileste o conexiune sigura intre ei.&lt;br /&gt;
&lt;br /&gt;
O data deschisa conexiunea, prin SSH se deschide TTY-ul standard de login care il intampina pe utilizator.&lt;br /&gt;
&lt;br /&gt;
SSH este folosit in principal pentru text (terminal) dar poate fi folosit si pentru accesul unor programe de interfata de la distanta (X11 Forwarding/ssh -X) sau pentru transfer de fisiere (sftp).&lt;br /&gt;
&lt;br /&gt;
===Setup===&lt;br /&gt;
&lt;br /&gt;
SSH-ul are nevoie de un server. Cel mai comun si folosit in acest curs este &#039;&#039;openssh-server&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 $ sudo apt install openssh-server -y&lt;br /&gt;
&lt;br /&gt;
Când instalarea openssh-server este finalizată, vom folosi comanda systemctl pentru a-i verifica starea:&lt;br /&gt;
 $ sudo systemctl status ssh&lt;br /&gt;
&lt;br /&gt;
Serviciul SSH este în stare de rulare, se va configura partea de firewall:&lt;br /&gt;
&lt;br /&gt;
 # ufw allow ssh&lt;br /&gt;
 sau&lt;br /&gt;
 # iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
Regula pentru a permite doar unui anumit IP sa acceseze server-ul:&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -p tcp -s YourIP --dport 22 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
Regula pentru a inregistra IP-urile ce se conecteaza la server:&lt;br /&gt;
&lt;br /&gt;
 # iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name ssh –rsource&lt;br /&gt;
&lt;br /&gt;
Utilizarea cheilor publice/private pentru autentificare&lt;br /&gt;
&lt;br /&gt;
Autentificarea cu chei publice/private este cu siguranță mai sigură și o soluție mult mai bună decât autentificarea prin parolă. Fiecare cheie este un număr mare cu proprietăți matematice diferite. Cheia privată este stocată pe computerul de pe care vă autentificați, în timp ce cheia publică este stocată în fișierul .ssh/authorized_keys de pe fiecare computer la care doriți să vă conectați.&lt;br /&gt;
&lt;br /&gt;
Acest lucru este deosebit de important dacă computerul este vizibil pe Internet. Utilizarea cheilor criptate pentru autentificare este utilă, deoarece nu va mai trebui să introduceți o parolă. Odată ce autentificarea perechii de chei publice/private a fost configurată pe server, puteți dezactiva complet autentificarea prin parolă; aceasta înseamnă că nimeni fără o cheie autorizată nu va putea avea acces. Chiar și cei mai inventivi hackeri nu vor putea interveni sau se strecoară într-o sesiune și nu vor mai putea încerca să spargă parola.&lt;br /&gt;
&lt;br /&gt;
Iată cum să creați o pereche de chei publice/private și să le instalați pentru a le utiliza pe serverul dvs. SSH:&lt;br /&gt;
&lt;br /&gt;
Începeți prin a genera perechea de chei, o cheie publică și o cheie privată. Cheia publică va fi plasată pe server și vă veți autentifica cu cheia privată (aceasta trebuie efectuată pe fiecare computer client de la care vă conectați):&lt;br /&gt;
&lt;br /&gt;
 $ ssh-keygen -t rsa&lt;br /&gt;
&lt;br /&gt;
Acest lucru va crea două fișiere în directorul dvs. (ascuns) ~/.ssh numite: id_rsa și id_rsa.pub Primul: id_rsa este cheia dumneavoastră privată și celălalt: id_rsa.pub este cheia dumneavoastră publică.&lt;br /&gt;
&lt;br /&gt;
Vi se va cere apoi o frază de acces, care este parola dvs. pentru a debloca o anumită cheie publică de fiecare dată când vă conectați. Este alegerea dvs. să adăugați o criptare de protecție a unei fraze de acces la cheia dvs. atunci când o creați. Dacă preferați să nu utilizați unul, pur și simplu apăsați Enter când vi se cere expresia de acces atunci când vă creați perechea de chei. Rețineți că, dacă nu vă protejați cheia cu expresia de acces, oricine obține acces la mașina dvs. locală va avea automat acces SSH la serverul de la distanță.&lt;br /&gt;
&lt;br /&gt;
Copiați cheia publică (id_rsa.pub) pe server (utilizatorul la distanță nu ar trebui să fie niciodată root; selectați utilizatorul implicit non-root ca utilizator la distanță):&lt;br /&gt;
&lt;br /&gt;
 scp –p id_rsa.pub remoteuser@remotehost&lt;br /&gt;
&lt;br /&gt;
Apoi conectați-vă cu SSH și copiați cheia publică în locul potrivit:&lt;br /&gt;
&lt;br /&gt;
 ssh remoteuser@remotehost mkdir ~/.ssh chmod 700 ~/.ssh cat id_rsa.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys mv id_rsa.pub ~/.ssh logout&lt;br /&gt;
&lt;br /&gt;
Apoi ștergeți cheia publică de pe server, altfel clientul SSH nu vă va permite să vă conectați la server:&lt;br /&gt;
&lt;br /&gt;
 rm id_rsa.pub&lt;br /&gt;
&lt;br /&gt;
Și, în sfârșit, setați permisiunile pentru fișiere pe server:&lt;br /&gt;
&lt;br /&gt;
 $ chmod 700 ~/.ssh&lt;br /&gt;
&lt;br /&gt;
 $ chmod 600 ~/.ssh/authorized_keys&lt;br /&gt;
&lt;br /&gt;
Când vă conectați la server, vi se va solicita expresia de acces cheie (în funcție de configurația dvs.).&lt;br /&gt;
&lt;br /&gt;
2. Configurați intervalul de expirare inactiv&lt;br /&gt;
&lt;br /&gt;
Pentru a evita o sesiune SSH nesupravegheată, puteți seta un interval de timeout inactiv. Deschideți fișierul /etc/ssh/sshd_config și adăugați următoarea linie:&lt;br /&gt;
 ClientAliveInterval 360&lt;br /&gt;
&lt;br /&gt;
 ClientAliveCountMax 0&lt;br /&gt;
&lt;br /&gt;
Intervalul de timeout pe care îl setați este în secunde (360 secunde = 6 minute). Odată ce intervalul a trecut, utilizatorul inactiv va fi deconectat automat.&lt;br /&gt;
&lt;br /&gt;
Dezactivați parolele goale&lt;br /&gt;
&lt;br /&gt;
Trebuie să împiedicați autentificarea de la distanță de la conturi cu parole goale pentru o securitate sporită. Deschideți fișierul /etc/ssh/sshd_config și actualizați următoarea linie:&lt;br /&gt;
 PermitEmptyPasswords nr&lt;br /&gt;
&lt;br /&gt;
Limitați accesul SSH al utilizatorilor&lt;br /&gt;
&lt;br /&gt;
Pentru a oferi un alt nivel de securitate, ar trebui să vă limitați conexiunile SSH doar la anumiți utilizatori care au nevoie de acces de la distanță. În acest fel, veți minimiza impactul de a avea un utilizator cu o parolă slabă.&lt;br /&gt;
&lt;br /&gt;
Deschideți fișierul /etc/ssh/sshd_config pentru a adăuga o linie „AllowUsers”, urmată de lista de nume de utilizator și separați-le cu un spațiu:&lt;br /&gt;
&lt;br /&gt;
 AllowUsers utilizator1 utilizator2&lt;br /&gt;
&lt;br /&gt;
Apoi reporniți serviciul SSH.&lt;br /&gt;
&lt;br /&gt;
Dezactivați autentificarea ca root&lt;br /&gt;
&lt;br /&gt;
Una dintre cele mai periculoase găuri de securitate pe care le puteți avea în sistemul dvs. este să permiteți conectarea directă la root prin SSH. Procedând astfel, orice hacker care încearcă să folosească forța brută asupra parolei dvs. de root ar putea accesa ipotetic sistemul dvs.; și dacă vă gândiți bine, root poate provoca mult mai multe daune pe o mașină decât poate face un utilizator standard.&lt;br /&gt;
&lt;br /&gt;
Găsiți secțiunea din fișierul care conține #PermitRootLogin.&lt;br /&gt;
&lt;br /&gt;
Pentru a dezactiva conectarea prin SSH ca root, schimbați linia în aceasta:&lt;br /&gt;
&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
&lt;br /&gt;
Simbolul # (comentar) îi spune serverului să ignore orice după el pe aceeași linie. Eliminați # pentru ca modificările să aibă efect.&lt;br /&gt;
&lt;br /&gt;
==Acces VNC==&lt;br /&gt;
&lt;br /&gt;
De multe ori, avem nevoie să accesăm de la distanță un server Linux. Dacă avem nevoie în mod special de acces la GUI Linux, atunci putem configura un server VNC pe Linux-ul nostru, pentru a ne permite să controlăm GUI.&lt;br /&gt;
&lt;br /&gt;
În acest tutorial, vom instala serverul TightVNC pe Ubuntu 22.04 și îl vom accesa prin Windows, MacOS și o mașină Linux.&lt;br /&gt;
&lt;br /&gt;
Vom presupune un mediu de rețea securizat în care serverul nostru nu este accesibil lumii exterioare, iar parola este o protecție suficient de puternică. Cu toate acestea, vom acoperi și utilizarea tunelului SSH pentru cazurile în care este necesară securitate suplimentară.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.&#039;&#039;&#039; Introducere&lt;br /&gt;
&lt;br /&gt;
VNC (Virtual Network Computing) este un sistem grafic popular de partajare a desktopului. Permite utilizatorilor să-și controleze sistemele folosind protocolul RFB (Remote Frame Buffer) fără a avea acces fizic.&lt;br /&gt;
&lt;br /&gt;
VNC permite utilizatorilor să citească și să partajeze fără probleme fișiere, să modifice setările și să execute comenzi pe server utilizând evenimentul de tastatură și mouse al computerului client.&lt;br /&gt;
&lt;br /&gt;
Pentru stabilirea unei conexiuni la distanță, avem nevoie atât de un server, cât și de un client. Există multe soluții VNC din care puteți alege, cum ar fi Vino, RealVNC, TightVNC și TigerVNC.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.&#039;&#039;&#039; Instalarea serverului VNC&lt;br /&gt;
&lt;br /&gt;
Vom instala serverul TightVNC deoarece este open-source, întreținut activ și ușor. În plus, oferă numeroase funcții, cum ar fi protecția cu parolă, criptarea și scalarea.&lt;br /&gt;
&lt;br /&gt;
Înainte de a instala serverul TightVNC, ar trebui să ne asigurăm că managerul nostru de pachete este actualizat:&lt;br /&gt;
&lt;br /&gt;
 $ sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y&lt;br /&gt;
 Hit:1 http://pk.archive.ubuntu.com/ubuntu jammy InRelease&lt;br /&gt;
 Hit:2 http://security.ubuntu.com/ubuntu jammy-security InRelease&lt;br /&gt;
 …&lt;br /&gt;
&lt;br /&gt;
În continuare, vom instala un mediu desktop pe serverul nostru Ubuntu, deoarece nu vine cu el în mod implicit. În acest scop, să instalăm mediul desktop XFCE:&lt;br /&gt;
&lt;br /&gt;
 $ sudo apt install xfce4 xfce4-goodies&lt;br /&gt;
 Citirea listelor de pachete... Gata&lt;br /&gt;
 Construirea arborelui de dependențe... Gata&lt;br /&gt;
 …&lt;br /&gt;
&lt;br /&gt;
 Astfel, mediul nostru desktop este instalat cu succes.&lt;br /&gt;
&lt;br /&gt;
Apoi, să instalăm serverul TightVNC:&lt;br /&gt;
&lt;br /&gt;
 $ sudo apt install tightvncserver -y&lt;br /&gt;
&lt;br /&gt;
În cele din urmă, serverul nostru TightVNC este instalat cu succes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.&#039;&#039;&#039; Configurarea serverului VNC&lt;br /&gt;
&lt;br /&gt;
Acum, să configuram serverul nostru VNC pentru a-l accesa de pe mașinile client.&lt;br /&gt;
&lt;br /&gt;
În primul rând, vom seta o parolă pentru serverul nostru VNC. Pentru a face acest lucru, rulăm comanda vncpasswd și setăm o parolă sigură de șase până la opt caractere:&lt;br /&gt;
&lt;br /&gt;
 $ vncpasswd&lt;br /&gt;
 Folosind fișierul de parole /home/baeldung/.vnc/passwd&lt;br /&gt;
 Parolă:&lt;br /&gt;
 Verifica:&lt;br /&gt;
 Doriți să introduceți o parolă numai pentru vizualizare (Y/n)? N&lt;br /&gt;
&lt;br /&gt;
Mergând mai departe, vom întâlni o solicitare care ne întreabă dacă dorim să setăm o parolă numai pentru vizualizare pentru accesarea serverului. Setarea acestei parole depinde de nevoile noastre.&lt;br /&gt;
&lt;br /&gt;
În cazul nostru, dorim să oferim acces complet la server, așa că vom introduce N.&lt;br /&gt;
&lt;br /&gt;
Apoi, să rulăm comanda vncserver pentru a porni serverul TightVNC și a crea fișierele sale de configurare inițială:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nota:&#039;&#039;&#039; Cu x0vncserver se poate porni un server vnc direct peste sesiunea curenta de desktop X11, este mai simplu insa inadecvat pentru servere.&lt;br /&gt;
&lt;br /&gt;
 $ vncserver&lt;br /&gt;
 Noul desktop „X” este baeldung-linux:1&lt;br /&gt;
 Pornirea aplicațiilor specificate în /home/baeldung/.vnc/xstartup&lt;br /&gt;
 Fișierul jurnal este /home/baeldung/.vnc/baeldung-linux:1.log&lt;br /&gt;
&lt;br /&gt;
În ieșire, putem observa că după numele gazdei, există un număr (:1), care este cunoscut sub numele de portul de afișare. Acest port de afișare indică portul pe care rulează instanța serverului. În mod implicit, serverul VNC ascultă pe portul TCP 5900, deci acest port de afișare :1 înseamnă că instanța serverului rulează pe portul 5901 (5900 + 1).&lt;br /&gt;
&lt;br /&gt;
VNC ne permite să creăm mai multe instanțe de server VNC pe diferite porturi de afișare, rulând aceeași comandă.&lt;br /&gt;
&lt;br /&gt;
Deocamdată, să omorâm această instanță de server pentru a efectua unele configurații de server:&lt;br /&gt;
&lt;br /&gt;
 $ vncserver -kill :1 -force&lt;br /&gt;
 Uciderea procesului Xtightvnc ID 6111&lt;br /&gt;
&lt;br /&gt;
Putem folosi această comandă pentru a termina orice instanță de server care rulează pe un anumit port de afișare atunci când nu este necesar, modificând numărul portului de afișare în consecință.&lt;br /&gt;
&lt;br /&gt;
În continuare, dorim ca serverul nostru VNC să folosească mediul desktop XFCE de fiecare dată când rulează. În acest scop, vom adăuga startxfce4 și linia în fișierul ~/.vnc/xstartup. După modificarea fișierului, putem verifica conținutul acestuia folosind comanda cat:&lt;br /&gt;
&lt;br /&gt;
 $ echo &amp;quot;startxfce4 &amp;amp;&amp;quot; &amp;gt;&amp;gt; ~/.vnc/xstartup&lt;br /&gt;
 $ cat ~/.vnc/xstartup&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 xrdb „$HOME/.Xresources”&lt;br /&gt;
 xsetroot -gri solid&lt;br /&gt;
 #x-terminal-emulator -geometry 80x24+10+10 -ls -title „$VNCDESKTOP Desktop” &amp;amp;&lt;br /&gt;
 #x-window-manager &amp;amp;&lt;br /&gt;
 # Remediați pentru ca GNOME să funcționeze&lt;br /&gt;
 exportați XKL_XMODMAP_DISABLE=1&lt;br /&gt;
 /etc/X11/Xsession&lt;br /&gt;
 startxfce4 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Fișierul xstartup se execută automat când începe o sesiune VNC.&lt;br /&gt;
&lt;br /&gt;
În plus, putem configura alte componente sau aplicații, cum ar fi un manager de fișiere, pentru a iniția cu serverul nostru VNC în acest fișier.&lt;br /&gt;
&lt;br /&gt;
După modificarea fișierului xstartup, îi vom schimba permisiunea la executabil folosind comanda chmod:&lt;br /&gt;
&lt;br /&gt;
 $ chmod +x ~/.vnc/xstartup&lt;br /&gt;
&lt;br /&gt;
În cele din urmă, să începem instanța serverului nostru TightVNC:&lt;br /&gt;
&lt;br /&gt;
 $ vncserver&lt;br /&gt;
 Noul desktop „X” este baeldung-linux:1&lt;br /&gt;
&lt;br /&gt;
Am instalat și configurat cu succes serverul VNC în Ubuntu. Pentru a verifica adresa IP a serverului nostru, putem folosi comanda hostname -I.&lt;br /&gt;
&lt;br /&gt;
În plus, putem configura serverul nostru VNC să ruleze ca un serviciu systemd pentru confortul nostru.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.&#039;&#039;&#039; Accesarea serverului VNC de pe mașina client&lt;br /&gt;
&lt;br /&gt;
Odată ce serverul VNC este în funcțiune, îl putem accesa de pe orice computer client folosind detaliile serverului nostru. Cu toate acestea, este important să rețineți că oricine are aceste informații poate accesa serverul. Prin urmare, presupunem că am setat o parolă VNC puternică și am configurat reguli de firewall pentru a restricționa accesul la anumite adrese sau intervale IP.&lt;br /&gt;
&lt;br /&gt;
Permitere acces din exterior (asumand port default 5900 si masina conectata direct, daca nu se va folosi tunel SSH):&lt;br /&gt;
&lt;br /&gt;
 iptables -A INPUT -m state –state NEW -m tcp -p tcp –dport 5900 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
Din Windows&lt;br /&gt;
&lt;br /&gt;
Să accesăm serverul nostru VNC din Windows. În acest scop, să descarcăm și să instalăm clientul TightVNC în sistemul nostru. In TightVNC Viewer introdu &amp;lt;server_IP_address&amp;gt;:&amp;lt;display_port&amp;gt; în câmpul Remote Host. Apoi, apăsați butonul Conectare:&lt;br /&gt;
&lt;br /&gt;
Din Linux sau MacOS&lt;br /&gt;
&lt;br /&gt;
Putem folosi orice client VNC pentru a controla serverul nostru VNC. În clientul VNC, tastați &amp;lt;server_IP_address&amp;gt;:&amp;lt;display_port&amp;gt; pentru a accesa serverul.&lt;br /&gt;
&lt;br /&gt;
De exemplu, pe computerul nostru Linux, putem deschide Remmina Remote Desktop Client și introducem IP-ul și portul de afișare al serverului nostru.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.&#039;&#039;&#039; Securitate suplimentară (opțional)&lt;br /&gt;
&lt;br /&gt;
Dacă avem nevoie de securitate suplimentară și dorim să ne asigurăm că numai clienții cu acces SSH anterior la serverul nostru se pot conecta la serverul VNC, putem restricționa serverul nostru VNC pentru a accepta numai conexiuni care provin de la acesta. Apoi, putem redirecționa toate conexiunile de la clienții noștri către server printr-un tunel SSH criptat.&lt;br /&gt;
&lt;br /&gt;
În acest scop, vom porni serverul nostru folosind comanda vncserver cu indicatorul -localhost:&lt;br /&gt;
&lt;br /&gt;
 $ vncserver -localhost&lt;br /&gt;
&lt;br /&gt;
Odată ce serverul nostru rulează, ne vom îndrepta către computerul nostru client pentru a ne accesa serverul.&lt;br /&gt;
&lt;br /&gt;
Tunel SSH în Linux sau MacOS&lt;br /&gt;
&lt;br /&gt;
 $ ssh -L 5901:localhost:5901 -C -N -l baeldung-linux 192.168.10.119&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru această comandă este dată mai jos:&lt;br /&gt;
&lt;br /&gt;
 $ ssh -L &amp;lt;sursă_port&amp;gt;:localhost:&amp;lt;display_port&amp;gt; -C -N -l &amp;lt;username&amp;gt; &amp;lt;server_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trebuie să înlocuim variabilele de comandă în funcție de informațiile și preferințele serverului nostru (port sursă). Odată ce sesiunea SSH este stabilită cu succes, vom minimiza terminalul. Apoi, vom deschide orice client VNC și vom tasta localhost::&amp;lt;display_port&amp;gt; pentru a accesa serverul VNC.&lt;br /&gt;
&lt;br /&gt;
Tunelul SSH în Windows&lt;br /&gt;
&lt;br /&gt;
În Windows, vom folosi PuTTY pentru a crea un tunel SSH.&lt;br /&gt;
&lt;br /&gt;
În PuTTY, navigați la opțiunea Tunnels situată sub opțiunea SSH din bara laterală Category. Aici, specificați un port sursă (5901) pentru redirecționarea traficului SSH. Poate fi orice port neutilizat (de la 0 la 65535). În plus, vom introduce adresa IP și portul de afișare al serverului VNC în câmpul Destinație. Apoi, vom apăsa butonul Adaugă: PuTTY SSH Tunneling. Apoi, să alegem categoria Sesiune și să introducem adresa IP a serverului în câmpul Nume gazdă. Apoi, apăsați butonul Deschidere: Sesiune SSH PuTTY. Acum, vom introduce parola serverului pentru a stabili o sesiune SSH și a minimiza această fereastră: Sesiune PuTTY SSH.Apoi, vom deschide TightVNC Viewer și vom tasta localhost::&amp;lt;display_port&amp;gt; în câmpul Remote Host.&lt;br /&gt;
&lt;br /&gt;
În cele din urmă, apăsăm butonul Conectare pentru a accesa serverul.&lt;br /&gt;
&lt;br /&gt;
==SAMBA file share==&lt;br /&gt;
&lt;br /&gt;
SAMBA Server - Partajarea fișierelor cu Windows&lt;br /&gt;
&lt;br /&gt;
Pentru a configura Samba, primul pas este instalarea acesteia folosind comanda de mai jos:&lt;br /&gt;
&lt;br /&gt;
 $ sudo apt install samba&lt;br /&gt;
&lt;br /&gt;
După terminarea instalării, tot ce trebuie să faceți este să o configurați. Fișierul de configurare este localizat în /etc/samba/ pe un fișier numit smb.conf.&lt;br /&gt;
&lt;br /&gt;
Atunci când te încurci cu fișierele de sistem, este întotdeauna mai bine să faci o copie de rezervă a fișierului pe care urmează să -l schimbăm. Pentru a face backup, fișierul înainte de a -l schimba, faceți o copie a fișierului.&lt;br /&gt;
&lt;br /&gt;
 $ sudo cp /etc/samba/smb.conf ~&lt;br /&gt;
&lt;br /&gt;
Această comandă va face fișierul de backup în directorul de origine sau alternativ.&lt;br /&gt;
&lt;br /&gt;
 $ sudo cp /etc/samba/smb.conf /etc/samba/smb_bkp.conf&lt;br /&gt;
Crearea unei copii a fișierului în același folder ca fișierul original.&lt;br /&gt;
&lt;br /&gt;
Dacă setați acest lucru pe un server Ubuntu, puteți utiliza VIM sau Nano pentru a edita fișierul smb.conf, pentru desktop Ubuntu, utilizați doar fișierul de editor de text implicit. Rețineți că toate comenzile (server sau desktop) trebuie să fie rulate ca rădăcină.&lt;br /&gt;
&lt;br /&gt;
 $ sudo nano /etc/samba/smb.conf&lt;br /&gt;
&lt;br /&gt;
Apoi adăugați informațiile de mai jos la sfârșitul fișierului -&lt;br /&gt;
&lt;br /&gt;
 [share]&lt;br /&gt;
 comment = Ubuntu File Server Share&lt;br /&gt;
 path = /srv/samba/share&lt;br /&gt;
 browsable = yes&lt;br /&gt;
 guest ok = yes&lt;br /&gt;
 read only = no&lt;br /&gt;
 create mask = 0755&lt;br /&gt;
&lt;br /&gt;
Acest exemplu folosește /srv/samba/share deoarece, conform standardului de ierarhie a sistemului de fișiere (FHS), /srv unde ar trebui să fie deservite date specifice site-ului. Acțiunile Samba din punct de vedere tehnic pot fi plasate oriunde pe sistemul de fișiere, atât timp cât permisiunile sunt corecte, dar se recomandă aderarea la standarde.&lt;br /&gt;
&lt;br /&gt;
Acum, când SAMBA este configurat, directorul /srv/samba/share trebuie creat și permisiunile trebuie să fie setate. Creați directorul și schimbați permisiunile de la terminal.&lt;br /&gt;
&lt;br /&gt;
 sudo mkdir -p/srv/samba/share&lt;br /&gt;
 sudo chown nimeni: nogroup/srv/samba/share/&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Comutatorul -p îi spune lui Mkdir să creeze întregul arbore de director dacă nu există.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
În cele din urmă, reporniți serviciile SAMBA pentru a activa noua configurație:&lt;br /&gt;
&lt;br /&gt;
 sudo systemctl restart smbd.service nmbd.service&lt;br /&gt;
&lt;br /&gt;
De la un client Windows, acum ar trebui să puteți naviga pe serverul de fișiere Ubuntu și să vedeți directorul partajat. Dacă clientul dvs. nu vă afișează automat cota dvs., încercați să accesați serverul dvs. prin adresa sa IP, de ex. \\ 192.168.1.1 sau nume de gazdă într -o fereastră Windows Explorer. Pentru a verifica dacă totul funcționează, încercați să creați un director din Windows.&lt;br /&gt;
&lt;br /&gt;
Pentru a crea acțiuni suplimentare, pur și simplu creați noi secțiuni [dir] în /etc/samba/smb.conf și reporniți samba. Doar asigurați -vă că directorul pe care doriți să îl împărtășiți există efectiv și permisiunile sunt corecte.&lt;br /&gt;
&lt;br /&gt;
[[Advanced_Pagina_2|Următoarea pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Curs_Linux_Essentials&amp;diff=520</id>
		<title>Curs Linux Essentials</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Curs_Linux_Essentials&amp;diff=520"/>
		<updated>2024-11-08T22:49:15Z</updated>

		<summary type="html">&lt;p&gt;Admin: Admin a redenumit pagina Curs Essentials în Curs Linux Essentials&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
=Laborator 1=&lt;br /&gt;
Introducere&lt;br /&gt;
&lt;br /&gt;
• [[Instructor|Prezentare instructor]] – scurta biografie&lt;br /&gt;
&lt;br /&gt;
• Prezentare sisteme de operare, rolul lor si unde le intalnim – context – ce inseamna un OS&lt;br /&gt;
&lt;br /&gt;
• Prezentare solutie de virtualizare – ce inseamna instalarea pe masina virtuala si ce inseamna instalarea pe hardware, avantaje/dezavantaje&lt;br /&gt;
&lt;br /&gt;
• Instalare ISO, despre snapshots, despre transfer de date intre VM si masina de lucru&lt;br /&gt;
&lt;br /&gt;
• Exercitii de transfer date intre VM si desktop, utilizare WinSCP, Putty, verificare ip, verificare acces net, ping. Primele comenzi: whoami, pwd.&lt;br /&gt;
&lt;br /&gt;
• Recomandari de studiu – instalare vm acasa sau pe un hardware mai vechi, citire materiale online si vizualizare filme de prezentare pe youtube/linkedin, achizitie carte LPIC-1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;LAN Virtualbox – posibilitati de conectare&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;NAT&#039;&#039;&#039; – masina linux se afla in spatele unui router gestionat de VirtualBox, masina are acces pe net dar nu poate fi accesata de pa sistemul de lucru din LAN-ul masinii Windows.  – informatii la CCNA1 despre nat-are si masquerading. &lt;br /&gt;
 &#039;&#039;&#039;Brigded adapter&#039;&#039;&#039; – in acest caz masina linux partajeaza placa de retea a masinii Windows si poate obtine IP la fel ca masina Windows.  Cele doua masini, cea virtuala si cea hardware se pot ‘vedea’ intre ele, exista reply la comanda ping intre cele doua sisteme.&lt;br /&gt;
 &#039;&#039;&#039;Virtual Box Host only adapter&#039;&#039;&#039; – in acest caz interfata de retea Virtual Box Adapter din Windows trebuie sa aiba un ip definit manual si la fel masina virtuala Linux are un ip care se defineste manual (in lectiile urmatoare se va invata cum se face). Cele doua masini se ‘vad’ intre ele. De exemplu, Virtual Box adapter are ip 192.168.56.1 si masina virtuala linux are un ip din aceeasi clasa (192.168.56.2).&lt;br /&gt;
 De instalat acasa VirtualBox si Virtual Box CD additions pentru o utilizare mai usoara in modul graphic a masinii virtuale, si posibilitatea de file sharing intre VM si masina locala. &lt;br /&gt;
 De inteles cand si de ce se fac snapshot-uri ale masinii virtuale.  Import si export de masina virtuala – de exersat la laboratorul 2.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Comenzi invatate/prezentate/discutate la primul laborator:&#039;&#039;&#039;&lt;br /&gt;
    • pwd – afiseaza locatia curenta, in ce director se afla utilizatorul&lt;br /&gt;
    • whoami – afiseaza utilzatorul current logat/conectat pe masina&lt;br /&gt;
    • who (sau w) – afiseaza toti utilizatorii logati in sistem &lt;br /&gt;
    • ifconfig – afiseaza interfetele de retea definite si informatiile aferente (IP, MAC, etc)&lt;br /&gt;
    • man &amp;lt;comanda&amp;gt; sau info &amp;lt;comanda&amp;gt; - afiseaza manualul comenzii respective (cum se utilizeaza, cu ce argumente se poate executa si ce coduri returneaza)&lt;br /&gt;
    • sudo – super user do – se foloseste atunci cand utilizatorul current (fara drepturi de root/admin) vrea sa execute o comanda pe care doar administratorul are dreptul sa o execute. Utilizare: sudo &amp;lt;comanda&amp;gt;&lt;br /&gt;
 Exemplu: sudo apt-get install -y openssh-server&lt;br /&gt;
&lt;br /&gt;
[[Essentials_Pagina_2|Următoarea pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_9&amp;diff=519</id>
		<title>Advanced Pagina 9</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_9&amp;diff=519"/>
		<updated>2024-11-08T22:48:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: Pagină nouă: ==Montare directoare în rețea (smb, nfs), alte utilizari ale bind== Pagina anterioară&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Montare directoare în rețea (smb, nfs), alte utilizari ale bind==&lt;br /&gt;
[[Advanced_Pagina_8|Pagina anterioară]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_8&amp;diff=518</id>
		<title>Advanced Pagina 8</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_8&amp;diff=518"/>
		<updated>2024-11-08T22:47:33Z</updated>

		<summary type="html">&lt;p&gt;Admin: Pagină nouă: ==Compilare kernel== Pagina anterioară | Ultima pagină&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Compilare kernel==&lt;br /&gt;
[[Advanced_Pagina_7|Pagina anterioară]] | [[Advanced_Pagina_9|Ultima pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_7&amp;diff=517</id>
		<title>Advanced Pagina 7</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_7&amp;diff=517"/>
		<updated>2024-11-08T22:47:02Z</updated>

		<summary type="html">&lt;p&gt;Admin: Pagină nouă: ==Firewall avansat== Pagina anterioară | Următoarea pagină&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Firewall avansat==&lt;br /&gt;
[[Advanced_Pagina_6|Pagina anterioară]] | [[Advanced_Pagina_8|Următoarea pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_6&amp;diff=516</id>
		<title>Advanced Pagina 6</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_6&amp;diff=516"/>
		<updated>2024-11-08T22:46:36Z</updated>

		<summary type="html">&lt;p&gt;Admin: Pagină nouă: ==Database server, MySQL/MongoDB, phpmyadmin== Pagina anterioară | Următoarea pagină&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Database server, MySQL/MongoDB, phpmyadmin==&lt;br /&gt;
[[Advanced_Pagina_5|Pagina anterioară]] | [[Advanced_Pagina_7|Următoarea pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_5&amp;diff=515</id>
		<title>Advanced Pagina 5</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_5&amp;diff=515"/>
		<updated>2024-11-08T22:46:10Z</updated>

		<summary type="html">&lt;p&gt;Admin: Pagină nouă: ==Servere DHCP &amp;amp; FTP== Pagina anterioară | Următoarea pagină&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Servere DHCP &amp;amp; FTP==&lt;br /&gt;
[[Advanced_Pagina_4|Pagina anterioară]] | [[Advanced_Pagina_6|Următoarea pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_4&amp;diff=514</id>
		<title>Advanced Pagina 4</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_4&amp;diff=514"/>
		<updated>2024-11-08T22:45:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: Pagină nouă: ==Servere E-mail (postfix/sendmail/dovecot)== Pagina anterioară | Următoarea pagină&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Servere E-mail (postfix/sendmail/dovecot)==&lt;br /&gt;
[[Advanced_Pagina_3|Pagina anterioară]] | [[Advanced_Pagina_5|Următoarea pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_3&amp;diff=513</id>
		<title>Advanced Pagina 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_3&amp;diff=513"/>
		<updated>2024-11-08T22:44:56Z</updated>

		<summary type="html">&lt;p&gt;Admin: Pagină nouă: ==Servere Web (Apache, Nginx), cache server (SQUID)== Pagina anterioară | Următoarea pagină&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Servere Web (Apache, Nginx), cache server (SQUID)==&lt;br /&gt;
[[Advanced_Pagina_2|Pagina anterioară]] | [[Advanced_Pagina_4|Următoarea pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_2&amp;diff=512</id>
		<title>Advanced Pagina 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxadvanced.ro/index.php?title=Advanced_Pagina_2&amp;diff=512"/>
		<updated>2024-11-08T22:43:57Z</updated>

		<summary type="html">&lt;p&gt;Admin: Pagină nouă: ==Server DNS== Pagina anterioară | Următoarea pagină&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Server DNS==&lt;br /&gt;
[[Curs_Advanced|Pagina anterioară]] | [[Advanced_Pagina_3|Următoarea pagină]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>